From f0e6fb9456f33e12be84181f2f70bf430f242399 Mon Sep 17 00:00:00 2001 From: Yannis Barlas <yannisbarlas@gmail.com> Date: Sun, 14 Jun 2020 02:17:56 +0300 Subject: [PATCH] feat(middleware): add email middleware --- src/graphqlApi.js | 5 +++-- src/graphqlSchema.js | 43 +++++++++++++++++++++++++++++++++++++---- src/middleware/email.js | 40 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 src/middleware/email.js diff --git a/src/graphqlApi.js b/src/graphqlApi.js index 5635157..aafe07f 100644 --- a/src/graphqlApi.js +++ b/src/graphqlApi.js @@ -1,13 +1,14 @@ const { ApolloServer } = require('apollo-server-express') const isEmpty = require('lodash/isEmpty') +const config = require('config') + const logger = require('@pubsweet/logger') const errors = require('@pubsweet/errors') -const config = require('config') - const connectors = require('pubsweet-server/src/connectors') const loaders = require('pubsweet-server/src/graphql/loaders') const helpers = require('pubsweet-server/src/helpers/authorization') + const schema = require('./graphqlSchema') const hostname = config.has('pubsweet-server.hostname') diff --git a/src/graphqlSchema.js b/src/graphqlSchema.js index 896b681..0643c11 100644 --- a/src/graphqlSchema.js +++ b/src/graphqlSchema.js @@ -2,12 +2,47 @@ const config = require('config') const isEmpty = require('lodash/isEmpty') const { applyMiddleware } = require('graphql-middleware') const { shield } = require('graphql-shield') -let schema = require('pubsweet-server/src/graphql/schema') + +const logger = require('@pubsweet/logger') +const schema = require('pubsweet-server/src/graphql/schema') + +const emailMiddleware = require('./middleware/email') + +const baseMessage = 'Coko server =>' + +const logRegistration = name => + logger.info(`${baseMessage} Middleware: Registered ${name} middleware`) + +const middleware = [] +console.log('') // eslint-disable-line no-console +logger.info(`${baseMessage} Registering graphql middleware...`) + +/** + * Authorization middleware + */ const permissions = config.has('permissions') && config.get('permissions') -if (permissions && !isEmpty(permissions)) { - schema = applyMiddleware(schema, shield(permissions)) +if (!isEmpty(permissions)) { + const authorizationMiddleware = shield(permissions) + middleware.push(authorizationMiddleware) + logRegistration('authorization') } -module.exports = schema +/** + * Email middleware + */ + +const emailConfig = + config.has('emailMiddleware') && config.get('emailMiddleware') + +if (!isEmpty(emailConfig)) { + middleware.push(emailMiddleware) + logRegistration('email') +} + +console.log('') // eslint-disable-line no-console + +const schemaWithMiddleWare = applyMiddleware(schema, ...middleware) + +module.exports = schemaWithMiddleWare diff --git a/src/middleware/email.js b/src/middleware/email.js new file mode 100644 index 0000000..fb6f077 --- /dev/null +++ b/src/middleware/email.js @@ -0,0 +1,40 @@ +const config = require('config') +const { isEmpty } = require('lodash') +const { middleware } = require('graphql-middleware') + +// const logger = require('@pubsweet/logger') + +const generator = middleware(schema => { + const emailService = + config.has('emailMiddleware.service') && + config.get('emailMiddleware.service') + + if (isEmpty(emailService)) { + throw new Error('Email middleware: No email service provided!') + } + + /** + * Email notifications are only applicable on mutations + */ + const typeMap = schema.getTypeMap() + const { Mutation } = typeMap + const mutationFields = Mutation.getFields() + + const mutationEntries = Object.keys(mutationFields).reduce( + (middlewareSchema, field) => { + const serviceFieldEntry = emailService[field] + if (!serviceFieldEntry) return middlewareSchema + + /* eslint-disable-next-line no-param-reassign */ + middlewareSchema[field] = serviceFieldEntry + return middlewareSchema + }, + {}, + ) + + return { + Mutation: mutationEntries, + } +}) + +module.exports = generator -- GitLab