Skip to content
Snippets Groups Projects
Commit e81a1863 authored by Yannis Barlas's avatar Yannis Barlas
Browse files

refactor(server): generate gql schema in a function instead of a top level module

parent 5b485db3
No related branches found
No related tags found
1 merge request!123v4
......@@ -9,8 +9,6 @@ const {
not,
} = require('graphql-shield')
const User = require('./src/models/user/user.model')
const isAuthenticated = rule()(async (parent, args, ctx, info) => {
return !!ctx.user
})
......@@ -20,6 +18,9 @@ const isAdmin = rule()(async (parent, args, { user: userId }, info) => {
return false
}
/* eslint-disable-next-line global-require */
const User = require('./src/models/user/user.model')
const user = await User.model.findById(userId)
return user.admin
})
......
const permissions = {
// eslint-disable-next-line consistent-return
before: () => {
return true
},
}
module.exports = permissions
const permissions = require('./permissions')
module.exports = {
components: [
'./src/models/__tests__/helpers/fake',
......@@ -71,6 +73,7 @@ module.exports = {
mailer: {
from: '',
},
permissions,
// onStartup: [
// {
// label: 'do it 1',
......
const { allow } = require('../../authorization')
module.exports = {
Query: {
'*': allow,
},
Mutation: {
'*': allow,
},
}
......@@ -43,7 +43,7 @@ services:
volumes:
- ./dev:/home/node/app/dev
- ./src:/home/node/app/src
- ./authorization:/home/node/app/authorization
- ./authorization.js:/home/node/app/authorization.js
tty: true
db:
......
const config = require('config')
const isEmpty = require('lodash/isEmpty')
const merge = require('lodash/merge')
const { applyMiddleware } = require('graphql-middleware')
const { shield } = require('graphql-shield')
/* eslint-disable-next-line import/extensions */
const GraphQLUpload = require('graphql-upload/GraphQLUpload.js')
const { makeExecutableSchema } = require('@graphql-tools/schema')
const { logTask, logTaskItem } = require('../logger/internals')
const tryRequireRelative = require('../utils/tryRequireRelative')
const generateSchema = () => {
const typeDefs = [
`type Query, type Mutation, type Subscription, scalar Upload`,
]
const resolvers = merge(
{},
{
Upload: GraphQLUpload,
},
)
// recursively merge in component types and resolvers
function getSchemaRecursively(componentName) {
const component = tryRequireRelative(componentName)
if (component.extending) {
getSchemaRecursively(component.extending)
}
if (component.typeDefs) {
typeDefs.push(component.typeDefs)
}
if (component.resolvers) {
merge(resolvers, component.resolvers)
}
}
if (config.has('components')) {
config.get('components').forEach(componentName => {
getSchemaRecursively(componentName)
})
}
const schema = makeExecutableSchema({ typeDefs, resolvers })
const middleware = []
logTask('Register graphql middleware')
/**
* Authorization middleware
*/
const permissions = config.has('permissions') && config.get('permissions')
const isProduction = process.env.NODE_ENV === 'production'
if (!isEmpty(permissions)) {
const authorizationMiddleware = shield(permissions, {
allowExternalErrors: true,
debug: !isProduction,
})
middleware.push(authorizationMiddleware)
// logRegistration('authorization')
logTaskItem('Registered permissions middleware')
} else {
logTaskItem('No permissions middleware')
}
const schemaWithMiddleWare = applyMiddleware(schema, ...middleware)
return schemaWithMiddleWare
}
module.exports = generateSchema
const config = require('config')
const isEmpty = require('lodash/isEmpty')
const merge = require('lodash/merge')
const { applyMiddleware } = require('graphql-middleware')
const { shield } = require('graphql-shield')
/* eslint-disable-next-line import/extensions */
const GraphQLUpload = require('graphql-upload/GraphQLUpload.js')
const { makeExecutableSchema } = require('@graphql-tools/schema')
const logger = require('../logger')
const { logTask } = require('../logger/internals')
const tryRequireRelative = require('../utils/tryRequireRelative')
const emailMiddleware = require('../middleware/email')
// #region BUILD-SCHEMA
// load base types and resolvers
const typeDefs = [`type Query, type Mutation, type Subscription, scalar Upload`]
const resolvers = merge(
{},
{
Upload: GraphQLUpload,
},
)
// recursively merge in component types and resolvers
function getSchemaRecursively(componentName) {
const component = tryRequireRelative(componentName)
if (component.extending) {
getSchemaRecursively(component.extending)
}
if (component.typeDefs) {
typeDefs.push(component.typeDefs)
}
if (component.resolvers) {
merge(resolvers, component.resolvers)
}
}
if (config.has('components')) {
config.get('components').forEach(componentName => {
getSchemaRecursively(componentName)
})
}
const schema = makeExecutableSchema({ typeDefs, resolvers })
// #endregion BUILD-SCHEMA
// #region GRAPHQL-MIDDLEWARE
const baseMessage = 'Coko server =>'
const logRegistration = name =>
logger.info(`${baseMessage} Middleware: Registered ${name} middleware`)
const middleware = []
logTask('Register graphql middleware')
/**
* Authorization middleware
*/
const permissions = config.has('permissions') && config.get('permissions')
const isProduction = process.env.NODE_ENV === 'production'
if (!isEmpty(permissions)) {
const authorizationMiddleware = shield(permissions, {
allowExternalErrors: true,
debug: !isProduction,
})
middleware.push(authorizationMiddleware)
logRegistration('authorization')
}
/**
* Email middleware
*/
const emailConfig =
config.has('emailMiddleware') && config.get('emailMiddleware')
if (!isEmpty(emailConfig)) {
middleware.push(emailMiddleware)
logRegistration('email')
}
logger.info('')
// #endregion GRAPHQL-MIDDLEWARE
const schemaWithMiddleWare = applyMiddleware(schema, ...middleware)
module.exports = schemaWithMiddleWare
......@@ -13,10 +13,12 @@ const {
const AuthenticationError = require('../errors/AuthenticationError')
const schema = require('./schema')
const loaders = require('./loaders')
const generateSchema = require('./generateSchema')
const setup = async (httpServer, app, passport) => {
const schema = generateSchema()
/* SUBSCRIPTION SERVER */
const wsServer = new WebSocketServer({
......@@ -24,7 +26,7 @@ const setup = async (httpServer, app, passport) => {
path: '/subscriptions',
})
const getDynamicContext = async (ctx, msg, args) => {
const getDynamicContext = (ctx, msg, args) => {
const context = { user: null }
if (ctx.connectionParams.authToken) {
......
const { ApolloServer } = require('@apollo/server')
const schema = require('../graphql/schema')
const generateSchema = require('../graphql/generateSchema')
const server = new ApolloServer({ schema })
const server = new ApolloServer({ schema: generateSchema() })
module.exports = server
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment