From 231729c1d0243788036a0e6794e54e59ea6b87e3 Mon Sep 17 00:00:00 2001
From: malexsan <alexandru.munt@gmail.com>
Date: Wed, 12 Dec 2018 14:59:59 +0200
Subject: [PATCH] feat(adminUsers): add activate/deactivate user mutation

---
 packages/component-user/resolvers.js          |  9 +++++
 packages/component-user/typeDefs.js           |  6 +++
 packages/component-user/user.js               |  3 +-
 .../src/components/Admin/AdminUsers.js        |  3 +-
 .../src/components/Admin/withUsersGQL.js      | 38 ++++++++++++++++++-
 packages/xpub-faraday/config/validations.js   | 10 ++---
 6 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/packages/component-user/resolvers.js b/packages/component-user/resolvers.js
index 71f393a2b..429336658 100644
--- a/packages/component-user/resolvers.js
+++ b/packages/component-user/resolvers.js
@@ -31,6 +31,15 @@ const resolvers = {
           ctx,
         )
 
+        return user
+      } catch (e) {
+        return e
+      }
+    },
+    async activateUserAsAdmin(_, { id, input }, ctx) {
+      try {
+        const user = await ctx.connectors.User.update(id, input, ctx)
+
         return user
       } catch (e) {
         return e
diff --git a/packages/component-user/typeDefs.js b/packages/component-user/typeDefs.js
index b20d4d078..805d71773 100644
--- a/packages/component-user/typeDefs.js
+++ b/packages/component-user/typeDefs.js
@@ -18,12 +18,18 @@ module.exports = `
     country: String
     affiliation: String
     role: AllowedRole
+  }
+
+  input ActivateUserInput {
+    email: String!
+    username: String!
     isActive: Boolean
   }
 
   extend type Mutation {
     addUserAsAdmin(id:ID!, input: UserInput!): User
     editUserAsAdmin(id: ID!, input: UserInput!): User
+    activateUserAsAdmin(id: ID!, input: ActivateUserInput): User
   }
 
   enum AllowedRole {
diff --git a/packages/component-user/user.js b/packages/component-user/user.js
index 07a5b0657..39eea7df4 100644
--- a/packages/component-user/user.js
+++ b/packages/component-user/user.js
@@ -10,14 +10,13 @@ module.exports = {
       editorInChief: false,
       handlingEditor: false,
     }
-    if (input.role !== 'author') {
+    if (input.role && input.role !== 'author') {
       roles[input.role] = true
     }
 
     return {
       ...omit(input, ['role']),
       ...roles,
-      isActive: true,
       isConfirmed: false,
       notifications: {
         email: {
diff --git a/packages/components-faraday/src/components/Admin/AdminUsers.js b/packages/components-faraday/src/components/Admin/AdminUsers.js
index f9a925292..1dfe97fac 100644
--- a/packages/components-faraday/src/components/Admin/AdminUsers.js
+++ b/packages/components-faraday/src/components/Admin/AdminUsers.js
@@ -39,6 +39,7 @@ const Users = ({
   //
   addUser,
   updateUser,
+  toggleUserActiveStatus,
   ...rest
 }) => (
   <Fragment>
@@ -109,7 +110,7 @@ const Users = ({
                 <OpenModal
                   isFetching={isFetching}
                   modalKey={`deactivate-${user.id}`}
-                  onConfirm={deactivateUser(user)}
+                  onConfirm={toggleUserActiveStatus(user)}
                   subtitle={`${user.firstName} ${user.lastName}`}
                   title={`Are you sure to ${
                     !user.isActive ? 'activate' : 'deactivate'
diff --git a/packages/components-faraday/src/components/Admin/withUsersGQL.js b/packages/components-faraday/src/components/Admin/withUsersGQL.js
index d15b4ad5c..4ca7aeaf8 100644
--- a/packages/components-faraday/src/components/Admin/withUsersGQL.js
+++ b/packages/components-faraday/src/components/Admin/withUsersGQL.js
@@ -5,16 +5,17 @@ import { compose, withHandlers, withProps } from 'recompose'
 const userFragment = gql`
   fragment userDetails on User {
     id
-    handlingEditor
-    editorInChief
     admin
     email
     title
     country
     username
     lastName
+    isActive
     firstName
     affiliation
+    editorInChief
+    handlingEditor
   }
 `
 
@@ -45,6 +46,15 @@ const editUserAsAdmin = gql`
   ${userFragment}
 `
 
+const activateUserAsAdmin = gql`
+  mutation activateUserAsAdmin($id: ID!, $input: ActivateUserInput) {
+    activateUserAsAdmin(id: $id, input: $input) {
+      ...userDetails
+    }
+  }
+  ${userFragment}
+`
+
 export default compose(
   graphql(getUsersQuery),
   graphql(addUserAsAdmin, {
@@ -56,6 +66,9 @@ export default compose(
   graphql(editUserAsAdmin, {
     name: 'updateUser',
   }),
+  graphql(activateUserAsAdmin, {
+    name: 'activateUser',
+  }),
   withHandlers({
     addUser: ({ addUser }) => (
       { __typename, id, admin, ...input },
@@ -95,6 +108,27 @@ export default compose(
           setError(e.message)
         })
     },
+    toggleUserActiveStatus: ({ activateUser }) => ({
+      __typename,
+      admin,
+      handlingEditor,
+      editorInChief,
+      id,
+      email,
+      username,
+      isActive,
+    }) => ({ hideModal }) => {
+      activateUser({
+        variables: {
+          id,
+          input: {
+            email,
+            username,
+            isActive,
+          },
+        },
+      }).then(hideModal)
+    },
   }),
   withProps(({ data }) => ({
     users: data.users,
diff --git a/packages/xpub-faraday/config/validations.js b/packages/xpub-faraday/config/validations.js
index 562ea5242..d8e9c5bbd 100644
--- a/packages/xpub-faraday/config/validations.js
+++ b/packages/xpub-faraday/config/validations.js
@@ -146,17 +146,17 @@ module.exports = {
     orcid: Joi.object(),
     name: Joi.string(),
     username: Joi.string(),
-    isConfirmed: Joi.boolean(),
+    title: Joi.string().allow(''),
+    agreeTC: Joi.boolean(),
+    isActive: Joi.boolean(),
     firstName: Joi.string().allow(''),
     lastName: Joi.string().allow(''),
     affiliation: Joi.string().allow(''),
+    isConfirmed: Joi.boolean(),
+    editorInChief: Joi.boolean(),
     country: Joi.string().allow(''),
-    title: Joi.string().allow(''),
     teams: Joi.array(),
-    editorInChief: Joi.boolean(),
     handlingEditor: Joi.boolean(),
-    agreeTC: Joi.boolean(),
-    isActive: Joi.boolean(),
     passwordHash: Joi.string(),
     notifications: Joi.object({
       email: Joi.object({
-- 
GitLab