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