From eb6d82ffc2bacc89349980d83cff0fa4a4254bc1 Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Thu, 22 Feb 2018 09:29:29 +0200
Subject: [PATCH] fix invite and mail service

---
 packages/component-invite/README.md           | 157 +++++++++++++++---
 packages/component-invite/package.json        |  26 ++-
 .../component-invite/src/helpers/helpers.js   |   7 +
 packages/component-invite/src/routes/post.js  |   2 +-
 .../component-invite/src/tests/post.test.js   |   4 +-
 packages/component-mail-service/README.md     |  20 +++
 packages/component-mail-service/package.json  |  19 +--
 packages/component-mail-service/src/Mail.js   |   7 +-
 ...nvite-editor-in-chief.html => invite.html} |   2 +-
 ...{invite-editor-in-chief.txt => invite.txt} |   2 +-
 packages/xpub-faraday/package.json            |   2 +-
 11 files changed, 189 insertions(+), 59 deletions(-)
 rename packages/component-mail-service/src/templates/{invite-editor-in-chief.html => invite.html} (99%)
 rename packages/component-mail-service/src/templates/{invite-editor-in-chief.txt => invite.txt} (82%)

diff --git a/packages/component-invite/README.md b/packages/component-invite/README.md
index 6107c0572..fcc89449e 100644
--- a/packages/component-invite/README.md
+++ b/packages/component-invite/README.md
@@ -1,42 +1,149 @@
-# AWS SES
+# Invite Component
 
-In order to use `component-aws-ses` you first need to have a `.env` file containing AWS data in the root folder of the starting point of your application.
+## Configuration
 
-The `.env` file contain the following data:
-```bash
-AWS_SES_SECRET_KEY = <secretKey>
-AWS_SES_ACCESS_KEY = <accessKey>
-EMAIL_SENDER = verified_ses_sender@domain.com
-AWS_SES_REGION = region-name
-```
+In order to use this component, the following configuration needs to be added to a PubSweet application, like so:
 
-Then, as soon as possible in your app you should add the `dotenv` package:
-```js
-require('dotenv').config()
+```json
+  {
+  'invite-reset-password': {
+    url: 'http://localhost:3000/invite',
+  },
+  roles: {
+    global: ['admin', 'editorInChief', 'author'],
+    collection: ['handlingEditor', 'reviewer'],
+    inviteRights: {
+      admin: ['admin', 'editorInChief', 'author'],
+      editorInChief: ['handlingEditor'],
+      handlingEditor: ['reviewer'],
+    },
+  },
 ```
 
-# `component-aws-ses` API
-A list of endpoints that help you upload, download and delete S3 files.
+## Usage
+
+Here's the list of endpoints that'll help you invite new users in your Pubsweet app.
+
+### Upload a file [POST]
+
+This endpoint allows you to create a new user in your app and then send him a confirmation email.
 
-## Send an email [POST]
-#### Request
-`POST /api/email`
-#### Request body
+#### Invite request
+
+`POST /api/users/invite/{collectionId}`
+| URI Parameter | Requiered | Requirements | Description |
+| ------------- | --------- | ------------ | ------------------ |
+| collectionId | No | String | The ID of the collection |
+
+#### Invite request body
 
-All parameters are `required`
 ```json
 {
-	"email": "to_email@domain.com",
-	"subject": "Example subject",
-	"textBody": "this is an email",
-	"htmlBody": "<p><b>This</b> is an <i>email</i>"
+  "email": "new_user@domain.com" /* required */,
+  "role": "editorInChief" /* required */,
+  "firstName": "Marc",
+  "lastName": "Twain",
+  "title": "Prof",
+  "affiliation": "MIT"
 }
 ```
-#### Response
+
+#### Invite user response
+
 ```json
-HTTP/1.1 204
+HTTP/1.1 200
+{
+  "id": "37463722-c4ca-4e3c-acec-779df8c11ad2",
+  "username": "9a42b55f",
+  "email": "new_user@domain.com",
+  "roles": ["editorInChief"],
+  "passwordResetToken": "123",
+  "isConfirmed": false,
+  "firstName": "Marc",
+  "lastName": "Twain",
+  "affiliation": "MIT",
+  "title": "Prof",
+  "admin": false,
+  "type": "user",
+  "rev": "1-12ebbb6686614791bb08ead305cde4f8"
+}
 ```
 
+---
+
+### Retrieve invited user details [GET]
+
+This endpoint allows you to retrieve an invited users' details so that you can display them in the confirmation form.
+
+#### User details request
 
+`GET /api/users/invite?email=new_user@domain.com&token=123`
 
+| Query Parameter | Requiered | Requirements | Description              |
+| --------------- | --------- | ------------ | ------------------------ |
+| email           | Yes       | String       | The user's email         |
+| token           | Yes       | String       | The password reset token |
+
+#### User details response
+
+```json
+HTTP/1.1 200
+{
+  "firstName": "dsadasd",
+  "lastName": "fisdadasdasdaasdago",
+  "affiliation": "asdasasae23",
+  "title": "131sdadassa"
+}
+```
+
+---
+
+### Reset password [POST]
+
+This endpoint will reset a user's password and confirm his account.
+
+#### Reset password request
+
+`POST /api/users/invite/password/reset`
+
+#### Reset password request body
+
+```json
+// All fields are required
+{
+  "email": "new_user@domain.com",
+  "token": "123",
+  "firstName": "Marc",
+  "lastName": "Twain",
+  "title": "Prof",
+  "affiliation": "MIT",
+  "password": "verySecure"
+}
+```
+
+#### Response
+
+```json
+HTTP/1.1 200
+{
+  "id": "37463722-c4ca-4e3c-acec-779df8c11ad2",
+  "username": "9a42b55f",
+  "email": "new_user@domain.com",
+  "isConfirmed": true,
+  "firstName": "Marc",
+  "lastName": "Twain",
+  "affiliation": "MIT",
+  "title": "Prof",
+  "admin": false,
+  "type": "user",
+  "roles": [
+    "editorInChief"
+  ],
+  "collections": [],
+  "fragments": [],
+  "teams": [],
+  "rev": "2-81fb76ae72f143bb9edc2b4d4deaf7a3"
+}
+```
 
+---
diff --git a/packages/component-invite/package.json b/packages/component-invite/package.json
index 2dccf4558..898457935 100644
--- a/packages/component-invite/package.json
+++ b/packages/component-invite/package.json
@@ -3,9 +3,9 @@
   "version": "0.0.1",
   "description": "invite component for pubsweet",
   "license": "MIT",
-  "files": [
-    "src"
-  ],
+  "author": "Collaborative Knowledge Foundation",
+  "files": ["src"],
+  "main": "index.js",
   "scripts": {
     "test": "jest"
   },
@@ -20,24 +20,18 @@
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet": "^1.1.1",
-    "pubsweet-client": "^1.1.1",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^1.0.1",
+    "pubsweet-component-mail-service": "0.0.1"
   },
   "devDependencies": {
     "jest": "^22.1.1",
     "supertest": "^3.0.0"
   },
   "jest": {
-    "moduleNameMapper": {
-      "\\.s?css$": "identity-obj-proxy"
-    },
-    "transformIgnorePatterns": [
-      "/node_modules/(?!@?pubsweet)"
-    ],
-    "testPathIgnorePatterns": [
-      "/node_modules",
-      "config/"
-    ]
+    "verbose": true,
+    "testRegex": "/src/.*.test.js$"
+  },
+  "publishConfig": {
+    "access": "public"
   }
 }
diff --git a/packages/component-invite/src/helpers/helpers.js b/packages/component-invite/src/helpers/helpers.js
index 92ecfd46e..8ea26ed99 100644
--- a/packages/component-invite/src/helpers/helpers.js
+++ b/packages/component-invite/src/helpers/helpers.js
@@ -51,6 +51,11 @@ const validateEmailAndToken = async (email, token, userModel) => {
       message: e.details[0].message,
     }
   }
+  return {
+    success: false,
+    status: 500,
+    message: 'something went wrong',
+  }
 }
 
 const hasInviteRight = (configRoles, userRoles, role) => {
@@ -68,6 +73,8 @@ const hasInviteRight = (configRoles, userRoles, role) => {
 
   return {
     success: true,
+    status: null,
+    message: null,
   }
 }
 
diff --git a/packages/component-invite/src/routes/post.js b/packages/component-invite/src/routes/post.js
index 4c8bed08f..8284ef47e 100644
--- a/packages/component-invite/src/routes/post.js
+++ b/packages/component-invite/src/routes/post.js
@@ -97,7 +97,7 @@ module.exports = models => async (req, res) => {
     if (collection)
       await helpers.createNewTeam(collection.id, newUser, models.Team)
 
-    await mailService.setupEmail(
+    await mailService.setupInviteEmail(
       newUser.email,
       'invite',
       newUser.passwordResetToken,
diff --git a/packages/component-invite/src/tests/post.test.js b/packages/component-invite/src/tests/post.test.js
index e6e2d5c2d..a21c3effb 100644
--- a/packages/component-invite/src/tests/post.test.js
+++ b/packages/component-invite/src/tests/post.test.js
@@ -8,7 +8,9 @@ const UserMock = require('./mocks/User')
 const Chance = require('chance')
 const TeamMock = require('./mocks/Team')
 
-jest.mock('pubsweet-component-mail-service', () => ({ setupEmail: jest.fn() }))
+jest.mock('pubsweet-component-mail-service', () => ({
+  setupInviteEmail: jest.fn(),
+}))
 const chance = new Chance()
 const globalRoles = ['editorInChief', 'author', 'admin']
 const manuscriptRoles = ['handlingEditor', 'reviewer']
diff --git a/packages/component-mail-service/README.md b/packages/component-mail-service/README.md
index e69de29bb..03c6e7f27 100644
--- a/packages/component-mail-service/README.md
+++ b/packages/component-mail-service/README.md
@@ -0,0 +1,20 @@
+# Mail Service
+
+## Configuration
+
+In order to use this component, simply add the desired templates in the `src/templates/` folder and use them by matching the `emailType` parameter with the template name.
+
+## Usage
+
+Once you have your template setup, simply add a a case in the `switch` statement from `src/Mail.js`:
+
+```js
+switch (emailType) {
+  case 'invitation-email':
+    subject = 'You have been invited!'
+    break
+  default:
+    subject = 'Welcome!'
+    break
+}
+```
diff --git a/packages/component-mail-service/package.json b/packages/component-mail-service/package.json
index 17772ef5d..42a8f08bc 100644
--- a/packages/component-mail-service/package.json
+++ b/packages/component-mail-service/package.json
@@ -3,12 +3,13 @@
   "version": "0.0.1",
   "description": "mail service component for pubsweet",
   "license": "MIT",
-  "files": [
-    "src"
-  ],
+  "author": "Collaborative Knowledge Foundation",
+  "files": ["src"],
+  "main": "index.js",
   "repository": {
     "type": "git",
-    "url": "https://gitlab.coko.foundation/xpub/xpub"
+    "url": "https://gitlab.coko.foundation/xpub/xpub",
+    "path": "component-mail-service"
   },
   "dependencies": {
     "body-parser": "^1.17.2",
@@ -16,12 +17,10 @@
   },
   "peerDependencies": {
     "@pubsweet/logger": "^0.0.1",
-    "pubsweet": "^1.1.1",
-    "pubsweet-client": "^1.1.1",
-    "pubsweet-server": "^1.0.1"
+    "pubsweet-server": "^1.0.1",
+    "@pubsweet/component-aws-ses": "^0.2.0"
   },
-  "devDependencies": {
-    "jest": "^22.1.1",
-    "supertest": "^3.0.0"
+  "publishConfig": {
+    "access": "public"
   }
 }
diff --git a/packages/component-mail-service/src/Mail.js b/packages/component-mail-service/src/Mail.js
index 2b053dfda..908149442 100644
--- a/packages/component-mail-service/src/Mail.js
+++ b/packages/component-mail-service/src/Mail.js
@@ -1,13 +1,14 @@
 const fs = require('fs')
 const handlebars = require('handlebars')
 const querystring = require('querystring')
-const SES = require('pubsweet-components-aws-ses')
+const SES = require('@pubsweet/component-aws-ses')
 const config = require('config')
 
 const resetUrl = config.get('invite-reset-password.url')
 
 module.exports = {
-  setupEmail: async (email, emailType, token, comment = '') => {
+  setupInviteEmail: async (email, emailType, token, comment = '') => {
+    console.log('asereke', emailType)
     let subject
     const htmlFile = readFile(`${__dirname}/templates/${emailType}.html`)
     const textFile = readFile(`${__dirname}/templates/${emailType}.txt`)
@@ -16,7 +17,7 @@ module.exports = {
     const textTemplate = handlebars.compile(textFile)
 
     switch (emailType) {
-      case 'invite-editor-in-chief':
+      case 'invite':
         subject = 'Hindawi Invitation'
         replacements = {
           url: `${resetUrl}?${querystring.encode({
diff --git a/packages/component-mail-service/src/templates/invite-editor-in-chief.html b/packages/component-mail-service/src/templates/invite.html
similarity index 99%
rename from packages/component-mail-service/src/templates/invite-editor-in-chief.html
rename to packages/component-mail-service/src/templates/invite.html
index de15f3e30..605a97832 100644
--- a/packages/component-mail-service/src/templates/invite-editor-in-chief.html
+++ b/packages/component-mail-service/src/templates/invite.html
@@ -178,7 +178,7 @@
                                   <td style="padding:30px 23px 0px 23px;background-color:#ffffff;" height="100%" valign="top" bgcolor="#ffffff">
                                     <h1 style="text-align: center;">You have been invited to join Hindawi</h1>
 
-                                    <div style="text-align: center;">You can now join Hindawi as an Editor in Chief.</div>
+                                    <div style="text-align: center;">You can now join Hindawi</div>
 
                                     <div style="text-align: center;">Please confirm your account and set your account details by clicking on the link below.</div>
 
diff --git a/packages/component-mail-service/src/templates/invite-editor-in-chief.txt b/packages/component-mail-service/src/templates/invite.txt
similarity index 82%
rename from packages/component-mail-service/src/templates/invite-editor-in-chief.txt
rename to packages/component-mail-service/src/templates/invite.txt
index 51def7f3e..6aa9d92b8 100644
--- a/packages/component-mail-service/src/templates/invite-editor-in-chief.txt
+++ b/packages/component-mail-service/src/templates/invite.txt
@@ -1,5 +1,5 @@
 You have been invited to Hindawi
-You can now join Hindawi as an Editor in Chief.
+You can now join Hindawi.
 Please confirm your account and set your account details by clicking on the link below.
 {{ url }} CONFIRM
 Hindawi Publishing Corporation
diff --git a/packages/xpub-faraday/package.json b/packages/xpub-faraday/package.json
index aaad5df85..5a394862a 100644
--- a/packages/xpub-faraday/package.json
+++ b/packages/xpub-faraday/package.json
@@ -29,8 +29,8 @@
     "pubsweet-component-login": "^1.0.1",
     "pubsweet-component-signup": "^1.0.0",
     "pubsweet-component-xpub-manuscript": "^0.0.2",
-    "pubsweet-component-invite": "^0.0.1",
     "pubsweet-server": "^1.0.1",
+    "pubsweet-component-invite": "^0.0.1",
     "react": "^16.2.0",
     "react-dom": "^16.2.0",
     "react-router-dom": "^4.2.2",
-- 
GitLab