From b7743313c1f663b335053f18355c033ecba7d8fa Mon Sep 17 00:00:00 2001
From: Sebastian <sebastian.mihalache@thinslices.com>
Date: Thu, 29 Mar 2018 11:51:46 +0300
Subject: [PATCH] feat(component-invite): invite yourself as author

---
 .../src/controllers/assignCollectionRole.js      | 16 ++++++++++++++--
 .../src/routes/getCollectionUsers.js             |  6 ------
 .../component-invite/src/routes/postInvite.js    | 11 ++++++-----
 .../{assign-coauthor.html => assign-author.html} |  0
 .../{assign-coauthor.txt => assign-author.txt}   |  0
 .../{invite-coauthor.html => invite-author.html} |  0
 .../{invite-coauthor.txt => invite-author.txt}   |  0
 packages/xpub-faraday/config/authsome.js         |  4 ++--
 packages/xpub-faraday/config/default.js          |  5 ++---
 9 files changed, 24 insertions(+), 18 deletions(-)
 rename packages/component-mail-service/src/templates/{assign-coauthor.html => assign-author.html} (100%)
 rename packages/component-mail-service/src/templates/{assign-coauthor.txt => assign-author.txt} (100%)
 rename packages/component-mail-service/src/templates/{invite-coauthor.html => invite-author.html} (100%)
 rename packages/component-mail-service/src/templates/{invite-coauthor.txt => invite-author.txt} (100%)

diff --git a/packages/component-invite/src/controllers/assignCollectionRole.js b/packages/component-invite/src/controllers/assignCollectionRole.js
index be8f7f8d6..50c1e31f9 100644
--- a/packages/component-invite/src/controllers/assignCollectionRole.js
+++ b/packages/component-invite/src/controllers/assignCollectionRole.js
@@ -27,6 +27,10 @@ module.exports = async (
   }
 
   if (reqUser.handlingEditor === true) {
+    if (reqUser.email === email) {
+      logger.error(`${reqUser.email} tried to invite his own email`)
+      return res.status(400).json({ error: 'Cannot invite yourself' })
+    }
     if (reqUser.teams === undefined) {
       return res.status(403).json({
         error: `Handling Editor ${reqUser.email} is not part of any teams`,
@@ -48,6 +52,11 @@ module.exports = async (
     }
   }
 
+  if (reqUser.editorInChief === true && email === reqUser.email) {
+    logger.error(`${reqUser.email} tried to invite his own email`)
+    return res.status(400).json({ error: 'Cannot invite yourself' })
+  }
+
   let collection
   try {
     collection = await models.Collection.find(collectionId)
@@ -69,9 +78,12 @@ module.exports = async (
     )
     // get updated user from DB
     user = await models.User.findByEmail(email)
-    if (role === 'coAuthor') {
+    if (role === 'author') {
+      if (collection.owners[0].id === user.id) {
+        return res.status(200).json(user)
+      }
       try {
-        await mailService.setupAssignEmail(user.email, 'assign-coauthor', url)
+        await mailService.setupAssignEmail(user.email, 'assign-author', url)
 
         return res.status(200).json(user)
       } catch (e) {
diff --git a/packages/component-invite/src/routes/getCollectionUsers.js b/packages/component-invite/src/routes/getCollectionUsers.js
index 94570732b..a08cdba07 100644
--- a/packages/component-invite/src/routes/getCollectionUsers.js
+++ b/packages/component-invite/src/routes/getCollectionUsers.js
@@ -16,12 +16,6 @@ module.exports = models => async (req, res) => {
     return
   }
 
-  const reqUser = await models.User.find(req.user)
-  if (!reqUser.editorInChief) {
-    res.status(400).json({ error: 'The request user must be Editor in Chief' })
-    return
-  }
-
   const { collectionId } = req.params
   try {
     await models.Collection.find(collectionId)
diff --git a/packages/component-invite/src/routes/postInvite.js b/packages/component-invite/src/routes/postInvite.js
index b3b61a0db..4c301272e 100644
--- a/packages/component-invite/src/routes/postInvite.js
+++ b/packages/component-invite/src/routes/postInvite.js
@@ -22,11 +22,7 @@ module.exports = models => async (req, res) => {
     return
   }
   const reqUser = await models.User.find(req.user)
-  if (email === reqUser.email) {
-    res.status(400).json({ error: 'Cannot invite yourself' })
-    logger.error(`${reqUser.email} tried to invite his own email`)
-    return
-  }
+
   const collectionId = get(req, 'params.collectionId')
   const url = `${req.protocol}://${req.get('host')}`
   if (collectionId)
@@ -41,6 +37,11 @@ module.exports = models => async (req, res) => {
       req.body,
     )
 
+  if (email === reqUser.email) {
+    res.status(400).json({ error: 'Cannot invite yourself' })
+    logger.error(`${reqUser.email} tried to invite his own email`)
+    return
+  }
   if (reqUser.admin)
     return require('../controllers/inviteGlobalRole')(
       req.body,
diff --git a/packages/component-mail-service/src/templates/assign-coauthor.html b/packages/component-mail-service/src/templates/assign-author.html
similarity index 100%
rename from packages/component-mail-service/src/templates/assign-coauthor.html
rename to packages/component-mail-service/src/templates/assign-author.html
diff --git a/packages/component-mail-service/src/templates/assign-coauthor.txt b/packages/component-mail-service/src/templates/assign-author.txt
similarity index 100%
rename from packages/component-mail-service/src/templates/assign-coauthor.txt
rename to packages/component-mail-service/src/templates/assign-author.txt
diff --git a/packages/component-mail-service/src/templates/invite-coauthor.html b/packages/component-mail-service/src/templates/invite-author.html
similarity index 100%
rename from packages/component-mail-service/src/templates/invite-coauthor.html
rename to packages/component-mail-service/src/templates/invite-author.html
diff --git a/packages/component-mail-service/src/templates/invite-coauthor.txt b/packages/component-mail-service/src/templates/invite-author.txt
similarity index 100%
rename from packages/component-mail-service/src/templates/invite-coauthor.txt
rename to packages/component-mail-service/src/templates/invite-author.txt
diff --git a/packages/xpub-faraday/config/authsome.js b/packages/xpub-faraday/config/authsome.js
index 2adf7a079..abd7c3491 100644
--- a/packages/xpub-faraday/config/authsome.js
+++ b/packages/xpub-faraday/config/authsome.js
@@ -3,8 +3,8 @@ const pickBy = require('lodash/pickBy')
 const omit = require('lodash/omit')
 
 async function teamPermissions(user, operation, object, context) {
-  const permissions = ['handlingEditor', 'coAuthor']
-  const teams = Promise.all(
+  const permissions = ['handlingEditor', 'author']
+  const teams = await Promise.all(
     user.teams
       .map(async teamId => {
         const team = await context.models.Team.find(teamId)
diff --git a/packages/xpub-faraday/config/default.js b/packages/xpub-faraday/config/default.js
index f279c3df7..9671e5bef 100644
--- a/packages/xpub-faraday/config/default.js
+++ b/packages/xpub-faraday/config/default.js
@@ -63,12 +63,11 @@ module.exports = {
   },
   roles: {
     global: ['admin', 'editorInChief', 'author', 'handlingEditor'],
-    collection: ['handlingEditor', 'reviewer', 'coAuthor'],
+    collection: ['handlingEditor', 'reviewer', 'author'],
     inviteRights: {
-      admin: ['admin', 'editorInChief', 'author', 'handlingEditor', 'coAuthor'],
+      admin: ['admin', 'editorInChief', 'author', 'handlingEditor', 'author'],
       editorInChief: ['handlingEditor'],
       handlingEditor: ['reviewer'],
-      author: ['coAuthor'],
     },
   },
   mailer: {
-- 
GitLab