diff --git a/app.js b/app.js index acc262aad..9aa420e0e 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,8 @@ const RedisStore = require('connect-redis')(session); const redis = require('./services/redis'); const csrf = require('csurf'); const errors = require('./errors'); +const graph = require('./graph'); +const apollo = require('graphql-server-express'); const app = express(); @@ -77,7 +79,22 @@ app.use(session(session_opts)); app.use(passport.initialize()); app.use(passport.session()); -app.use('/api/v1/graph', require('./routes/api/graph')); +//============================================================================== +// GraphQL Router +//============================================================================== + +// GraphQL endpoint. +app.use('/api/v1/graph/ql', apollo.graphqlExpress(graph.createGraphOptions)); + +// Only include the graphiql tool if we aren't in production mode. +if (app.get('env') !== 'production') { + + // Interactive graphiql interface. + app.use('/api/v1/graph/iql', apollo.graphiqlExpress({ + endpointURL: '/api/v1/graph/ql' + })); + +} //============================================================================== // CSRF MIDDLEWARE diff --git a/graph/index.js b/graph/index.js new file mode 100644 index 000000000..514df2d0a --- /dev/null +++ b/graph/index.js @@ -0,0 +1,24 @@ +const loaders = require('./loaders'); +const mutators = require('./mutators'); +const schema = require('./schema'); + +module.exports = { + createGraphOptions: (req) => { + + let context = {}; + + // Load the current logged in user to `user`, otherwise this'll be null. + context.user = req.user; + + // Create the loaders. + context.loaders = loaders(context); + + // Create the mutators. + context.mutators = mutators(context); + + return { + schema, + context + }; + } +}; diff --git a/routes/api/graph/loaders.js b/graph/loaders.js similarity index 92% rename from routes/api/graph/loaders.js rename to graph/loaders.js index 0bf11fcc8..4388af4a8 100644 --- a/routes/api/graph/loaders.js +++ b/graph/loaders.js @@ -1,14 +1,14 @@ const DataLoader = require('dataloader'); const _ = require('lodash'); const url = require('url'); -const errors = require('../../../errors'); -const scraper = require('../../../services/scraper'); +const errors = require('../errors'); +const scraper = require('../services/scraper'); -const Comment = require('../../../models/comment'); -const User = require('../../../models/user'); -const Action = require('../../../models/action'); -const Asset = require('../../../models/asset'); -const Settings = require('../../../models/setting'); +const Comment = require('../models/comment'); +const User = require('../models/user'); +const Action = require('../models/action'); +const Asset = require('../models/asset'); +const Settings = require('../models/setting'); /** * SingletonResolver is a cached loader for a single result. diff --git a/routes/api/graph/mutators.js b/graph/mutators.js similarity index 95% rename from routes/api/graph/mutators.js rename to graph/mutators.js index b56ba8412..11e727fad 100644 --- a/routes/api/graph/mutators.js +++ b/graph/mutators.js @@ -1,11 +1,11 @@ -const errors = require('../../../errors'); +const errors = require('../errors'); -const Action = require('../../../models/action'); -const Asset = require('../../../models/asset'); -const Comment = require('../../../models/comment'); -const User = require('../../../models/user'); +const Action = require('../models/action'); +const Asset = require('../models/asset'); +const Comment = require('../models/comment'); +const User = require('../models/user'); -const Wordlist = require('../../../services/wordlist'); +const Wordlist = require('../services/wordlist'); /** * Creates a new comment. diff --git a/routes/api/graph/resolvers/action.js b/graph/resolvers/action.js similarity index 100% rename from routes/api/graph/resolvers/action.js rename to graph/resolvers/action.js diff --git a/routes/api/graph/resolvers/action_summary.js b/graph/resolvers/action_summary.js similarity index 100% rename from routes/api/graph/resolvers/action_summary.js rename to graph/resolvers/action_summary.js diff --git a/routes/api/graph/resolvers/asset.js b/graph/resolvers/asset.js similarity index 100% rename from routes/api/graph/resolvers/asset.js rename to graph/resolvers/asset.js diff --git a/routes/api/graph/resolvers/comment.js b/graph/resolvers/comment.js similarity index 100% rename from routes/api/graph/resolvers/comment.js rename to graph/resolvers/comment.js diff --git a/routes/api/graph/resolvers/index.js b/graph/resolvers/index.js similarity index 100% rename from routes/api/graph/resolvers/index.js rename to graph/resolvers/index.js diff --git a/routes/api/graph/resolvers/root_mutation.js b/graph/resolvers/root_mutation.js similarity index 100% rename from routes/api/graph/resolvers/root_mutation.js rename to graph/resolvers/root_mutation.js diff --git a/routes/api/graph/resolvers/root_query.js b/graph/resolvers/root_query.js similarity index 100% rename from routes/api/graph/resolvers/root_query.js rename to graph/resolvers/root_query.js diff --git a/routes/api/graph/resolvers/user.js b/graph/resolvers/user.js similarity index 100% rename from routes/api/graph/resolvers/user.js rename to graph/resolvers/user.js diff --git a/routes/api/graph/schema.js b/graph/schema.js similarity index 100% rename from routes/api/graph/schema.js rename to graph/schema.js diff --git a/routes/api/graph/typeDefs.js b/graph/typeDefs.js similarity index 88% rename from routes/api/graph/typeDefs.js rename to graph/typeDefs.js index 8e80f37a5..4ce95fa77 100644 --- a/routes/api/graph/typeDefs.js +++ b/graph/typeDefs.js @@ -1,3 +1,7 @@ +// TODO: Adjust `RootQuery.asset(id: ID, url: URL)` to instead be +// `RootQuery.asset(id: ID, url: URL!)` because we'll always need the url, if +// this change is done now everything will likely break on the front end. + const typeDefs = [` type UserSettings { bio: String @@ -76,7 +80,7 @@ scalar URL type RootQuery { settings: Settings assets: [Asset] - asset(id: ID, url: URL!): Asset + asset(id: ID, url: URL): Asset me: User } diff --git a/routes/api/graph/index.js b/routes/api/graph/index.js deleted file mode 100644 index 55f177aa9..000000000 --- a/routes/api/graph/index.js +++ /dev/null @@ -1,33 +0,0 @@ -const express = require('express'); -const apollo = require('graphql-server-express'); - -const loaders = require('./loaders'); -const mutators = require('./mutators'); -const schema = require('./schema'); - -const router = express.Router(); - -// GraphQL endpoint. -router.use('/ql', apollo.graphqlExpress((req) => { - - let context = {}; - - // Load the current logged in user to `user`, otherwise this'll be null. - context.user = req.user; - - // Create the loaders. - context.loaders = loaders(context); - - // Create the mutators. - context.mutators = mutators(context); - - return { - schema, - context - }; -})); - -// Interactive graphiql interface. -router.use('/iql', apollo.graphiqlExpress({endpointURL: '/api/v1/graph/ql'})); - -module.exports = router;