diff --git a/packages/nova-apollo/README.md b/packages/nova-apollo/README.md deleted file mode 100644 index 33d477265..000000000 --- a/packages/nova-apollo/README.md +++ /dev/null @@ -1 +0,0 @@ -Nova Apollo Client & Server package. It handles the data layer of Nova. \ No newline at end of file diff --git a/packages/nova-apollo/lib/client.js b/packages/nova-apollo/lib/client.js deleted file mode 100644 index 0c0a142b5..000000000 --- a/packages/nova-apollo/lib/client.js +++ /dev/null @@ -1,89 +0,0 @@ -// note(oct. 28, 2016) -// by-pass the meteor integration to use the features of apollo-client 0.5.x / graphql-server 0.4.x - -// ------- -// start of main-client from apollostack/meteor-integration - -import { createNetworkInterface } from 'apollo-client'; -import { Accounts } from 'meteor/accounts-base'; -import { _ } from 'meteor/underscore'; -import 'isomorphic-fetch'; - -const defaultNetworkInterfaceConfig = { - path: '/graphql', - options: {}, -}; - -export const createMeteorNetworkInterface = (givenConfig) => { - const config = _.extend(defaultNetworkInterfaceConfig, givenConfig); - - // absoluteUrl adds a '/', so let's remove it first - let path = config.path; - if (path[0] === '/') { - path = path.slice(1); - } - - // For SSR - const url = Meteor.absoluteUrl(path); - const networkInterface = createNetworkInterface({ - uri: url, - opts: { - credentials: 'same-origin', - } - }); - - networkInterface.use([{ - applyMiddleware(request, next) { - - // login token created by meteorhacks:fast-render and caught during server-side rendering by rr:react-router-ssr - const { cookieLoginToken } = config; - // Meteor accounts-base login token stored in local storage, only exists client-side - const localStorageLoginToken = Meteor.isClient && Accounts._storedLoginToken(); - - // on initial load, prefer to use the server cookie if existing - let currentUserToken = cookieLoginToken || localStorageLoginToken; - - // ...a login token has been passed to the config, however the "true" one is different ⚠️ - if (Meteor.isClient && cookieLoginToken && cookieLoginToken !== localStorageLoginToken) { - // be sure to pass the right token to the request 🎉 - currentUserToken = localStorageLoginToken; - } - - if (!currentUserToken) { - next(); - return; - } - - if (!request.options.headers) { - request.options.headers = new Headers(); - } - - request.options.headers.Authorization = currentUserToken; - - next(); - }, - }]); - - return networkInterface; -}; - -export const meteorClientConfig = (networkInterfaceConfig) => { - return { - ssrMode: Meteor.isServer, - networkInterface: createMeteorNetworkInterface(networkInterfaceConfig), - queryDeduplication: true, - - // Default to using Mongo _id, must use _id for queries. - dataIdFromObject: (result) => { - if (result._id && result.__typename) { - const dataId = result.__typename + result._id; - return dataId; - } - }, - }; -}; - -// end of main-client from apollostack/meteor-integration -// -------- - -// export const client = new ApolloClient(meteorClientConfig()); diff --git a/packages/nova-apollo/lib/export.js b/packages/nova-apollo/lib/export.js deleted file mode 100644 index d186cb728..000000000 --- a/packages/nova-apollo/lib/export.js +++ /dev/null @@ -1,34 +0,0 @@ -import { GraphQLSchema } from 'meteor/nova:core'; - -import { makeExecutableSchema } from 'graphql-tools'; - -import { meteorClientConfig } from './client.js'; - -import { createApolloServer } from './server.js'; -import generateTypeDefs from './schema'; - -import OpticsAgent from 'optics-agent' - -Meteor.startup(function () { - const typeDefs = generateTypeDefs(); - - GraphQLSchema.finalSchema = typeDefs; - - const schema = makeExecutableSchema({ - typeDefs, - resolvers: GraphQLSchema.resolvers, - }); - - if (process.env.OPTICS_API_KEY) { - OpticsAgent.instrumentSchema(schema) - } - - // uncomment for debug - // console.log('// --> starting graphql server'); - - createApolloServer({ - schema, - }); -}); - -export { meteorClientConfig }; diff --git a/packages/nova-apollo/lib/schema.js b/packages/nova-apollo/lib/schema.js deleted file mode 100644 index 47b911b14..000000000 --- a/packages/nova-apollo/lib/schema.js +++ /dev/null @@ -1,20 +0,0 @@ -import { GraphQLSchema } from 'meteor/nova:core'; - -const generateTypeDefs = () => [` - - scalar JSON - scalar Date - - ${GraphQLSchema.getCollectionsSchemas()} - ${GraphQLSchema.getAdditionalSchemas()} - - type Query { - ${GraphQLSchema.queries.join('\n')} - } - - type Mutation { - ${GraphQLSchema.mutations.join('\n')} - } -`]; - -export default generateTypeDefs; \ No newline at end of file diff --git a/packages/nova-apollo/lib/server.js b/packages/nova-apollo/lib/server.js deleted file mode 100644 index 83c318826..000000000 --- a/packages/nova-apollo/lib/server.js +++ /dev/null @@ -1,138 +0,0 @@ -// note(oct. 28, 2016) -// by-pass the meteor integration to use the features of apollo-client 0.5.x / graphql-server 0.4.x - -// ------- -// start of main-client from apollostack/meteor-integration - -import { graphqlExpress, graphiqlExpress } from 'graphql-server-express'; -import bodyParser from 'body-parser'; -import cookieParser from 'cookie-parser'; -import express from 'express'; - -import deepmerge from 'deepmerge'; - -import { Meteor } from 'meteor/meteor'; -import { WebApp } from 'meteor/webapp'; -import { check } from 'meteor/check'; -import { Accounts } from 'meteor/accounts-base'; -import { _ } from 'meteor/underscore'; - -import Users from 'meteor/nova:users'; - -import { GraphQLSchema } from 'meteor/nova:core'; - -import OpticsAgent from 'optics-agent' - - -const defaultConfig = { - path: '/graphql', - maxAccountsCacheSizeInMB: 1, - graphiql : Meteor.isDevelopment, - graphiqlPath : '/graphiql', - graphiqlOptions : { - passHeader : "'Authorization': localStorage['Meteor.loginToken']" - }, - configServer: (graphQLServer) => {}, -}; - -const defaultOptions = { - formatError: e => ({ - message: e.message, - locations: e.locations, - path: e.path - }), - debug: Meteor.isDevelopment, -}; - -export const createApolloServer = (givenOptions = {}, givenConfig = {}) => { - - let graphiqlOptions = Object.assign({}, defaultConfig.graphiqlOptions, givenConfig.graphiqlOptions); - let config = Object.assign({}, defaultConfig, givenConfig); - config.graphiqlOptions = graphiqlOptions; - - const graphQLServer = express(); - - config.configServer(graphQLServer) - - // Load the cookie parsing middleware, used to grab login token - graphQLServer.use(cookieParser()); - - // Use Optics middleware - if (process.env.OPTICS_API_KEY) { - graphQLServer.use(OpticsAgent.middleware()); - } - - // GraphQL endpoint - graphQLServer.use(config.path, bodyParser.json(), graphqlExpress(async (req) => { - let options, - user = null; - - // console.log('Login token: ', req.cookies.meteor_login_token); - - if (_.isFunction(givenOptions)) - options = givenOptions(req); - else - options = givenOptions; - - // Merge in the defaults - options = Object.assign({}, defaultOptions, options); - - if (options.context) { - // don't mutate the context provided in options - options.context = Object.assign({}, options.context); - } else { - options.context = {}; - } - - // Add Optics to GraphQL context object - if (process.env.OPTICS_API_KEY) { - options.context.opticsContext = OpticsAgent.context(req); - } - - options.context.getViewableFields = Users.getViewableFields; - - // Get the token from the header - if (req.headers.authorization) { - const token = req.headers.authorization; - check(token, String); - const hashedToken = Accounts._hashLoginToken(token); - - // Get the user from the database - user = await Users.findOne( - {"services.resume.loginTokens.hashedToken": hashedToken}, - // {fields: { - // _id: 1, - // 'services.resume.loginTokens.$': 1 - // }} - ); - - if (user) { - - const expiresAt = Accounts._tokenExpiration(user.services.resume.loginTokens[0].when); - const isExpired = expiresAt < new Date(); - - if (!isExpired) { - - options.context.userId = user._id; - options.context.currentUser = user; - } - } - } - - options.context = deepmerge(options.context, GraphQLSchema.context); - - return options; - - })); - - // Start GraphiQL if enabled - if (config.graphiql) { - graphQLServer.use(config.graphiqlPath, graphiqlExpress(_.extend(config.graphiqlOptions, {endpointURL : config.path}))); - } - - // This binds the specified paths to the Express server running Apollo + GraphiQL - WebApp.connectHandlers.use(Meteor.bindEnvironment(graphQLServer)); -}; - -// end of main-client from apollostack/meteor-integration -// ------- \ No newline at end of file diff --git a/packages/nova-apollo/package.js b/packages/nova-apollo/package.js deleted file mode 100644 index 4ff648c8f..000000000 --- a/packages/nova-apollo/package.js +++ /dev/null @@ -1,24 +0,0 @@ -Package.describe({ - name: "nova:apollo", - summary: "Nova Apollo Server package", - version: "1.0.0", - git: "https://github.com/TelescopeJS/Telescope.git" -}); - -Package.onUse(function (api) { - - api.versionsFrom(['METEOR@1.0']); - - api.use([ - - // Nova packages - - 'nova:core@1.0.0', - 'nova:users@1.0.0', - - ]); - - api.mainModule("lib/client.js", "client"); - api.mainModule("lib/export.js", "server"); // client.js inside of export.js for ssr purpose - -});