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