From 2fa832a3f48b0d54691d5589dd71b27f42cfbb19 Mon Sep 17 00:00:00 2001 From: gaba Date: Thu, 2 Mar 2017 15:54:50 -0800 Subject: [PATCH] adds suspendUser func and mutation. --- .../Community/CommunityContainer.js | 5 ++-- .../Community/components/SuspendUserDialog.js | 2 +- .../src/graphql/mutations/index.js | 12 +++++--- .../src/graphql/mutations/suspendUser.graphql | 7 +++++ graph/mutators/user.js | 28 ++++++++++++------- graph/resolvers/root_mutation.js | 3 ++ graph/typeDefs.graphql | 11 ++++++++ models/user.js | 3 +- services/users.js | 16 +++++++++++ 9 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 client/coral-admin/src/graphql/mutations/suspendUser.graphql diff --git a/client/coral-admin/src/containers/Community/CommunityContainer.js b/client/coral-admin/src/containers/Community/CommunityContainer.js index 5e02b193b..d8b6dbcfc 100644 --- a/client/coral-admin/src/containers/Community/CommunityContainer.js +++ b/client/coral-admin/src/containers/Community/CommunityContainer.js @@ -3,7 +3,7 @@ import {connect} from 'react-redux'; import {compose} from 'react-apollo'; import {modUserFlaggedQuery} from 'coral-admin/src/graphql/queries'; -import {banUser, setUserStatus} from '../../graphql/mutations'; +import {banUser, setUserStatus, suspendUser} from '../../graphql/mutations'; import { fetchAccounts, @@ -154,5 +154,6 @@ export default compose( connect(mapStateToProps, mapDispatchToProps), modUserFlaggedQuery, banUser, - setUserStatus + setUserStatus, + suspendUser )(CommunityContainer); diff --git a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js b/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js index e385403c6..925d0a606 100644 --- a/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js +++ b/client/coral-admin/src/containers/Community/components/SuspendUserDialog.js @@ -69,7 +69,7 @@ class SuspendUserDialog extends Component { } onEmailChange = (e) => { - console.log('debug', e.target); + console.log('debug emailchange', e.target); this.setState({email: e.target.value}); } diff --git a/client/coral-admin/src/graphql/mutations/index.js b/client/coral-admin/src/graphql/mutations/index.js index d6cec0fde..d74f4dea8 100644 --- a/client/coral-admin/src/graphql/mutations/index.js +++ b/client/coral-admin/src/graphql/mutations/index.js @@ -1,6 +1,7 @@ import {graphql} from 'react-apollo'; import SET_USER_STATUS from './setUserStatus.graphql'; import SET_COMMENT_STATUS from './setCommentStatus.graphql'; +import SUSPEND_USER from './suspendUser.graphql'; export const banUser = graphql(SET_USER_STATUS, { props: ({mutate}) => ({ @@ -25,13 +26,16 @@ export const setUserStatus = graphql(SET_USER_STATUS, { }, refetchQueries: ['Users'] }); - }, + } + }) +}); + +export const suspendUser = graphql(SUSPEND_USER, { + props: ({mutate}) => ({ suspendUser: ({userId}) => { return mutate({ variables: { - userId, - status: 'BANNED', - canEditName: true + userId }, refetchQueries: ['Users'] }); diff --git a/client/coral-admin/src/graphql/mutations/suspendUser.graphql b/client/coral-admin/src/graphql/mutations/suspendUser.graphql new file mode 100644 index 000000000..f34d93370 --- /dev/null +++ b/client/coral-admin/src/graphql/mutations/suspendUser.graphql @@ -0,0 +1,7 @@ +mutation suspendUser($userId: ID!) { + suspendUser(id: $userId) { + errors { + translation_key + } + } +} diff --git a/graph/mutators/user.js b/graph/mutators/user.js index 3f87c1fb5..6f94ae9b1 100644 --- a/graph/mutators/user.js +++ b/graph/mutators/user.js @@ -6,18 +6,26 @@ const setUserStatus = ({user}, {id, status}) => { .then(res => res); }; -module.exports = (context) => { - if (context.user && context.user.can('mutation:setUserStatus')) { - return { - User: { - setUserStatus: (action) => setUserStatus(context, action) - } - }; - } +const suspendUser = ({user}, {id}) => { + return UsersService.suspendUser(id) + .then(res => res); +}; - return { +module.exports = (context) => { + let mutators = { User: { - setUserStatus: () => Promise.reject(errors.ErrNotAuthorized) + setUserStatus: () => Promise.reject(errors.ErrNotAuthorized), + suspendUser: () => Promise.reject(errors.ErrNotAuthorized) } }; + + if (context.user && context.user.can('mutation:setUserStatus')) { + mutators.User.setUserStatus = (action) => setUserStatus(context, action); + } + + if (context.user && context.user.can('mutation:suspendUser')) { + mutators.User.suspendUser = (action) => suspendUser(context, action); + } + + return mutators; }; diff --git a/graph/resolvers/root_mutation.js b/graph/resolvers/root_mutation.js index 2462962c6..42a53bd4e 100644 --- a/graph/resolvers/root_mutation.js +++ b/graph/resolvers/root_mutation.js @@ -46,6 +46,9 @@ const RootMutation = { setUserStatus(_, {id, status}, {mutators: {User}}) { return wrapResponse(null)(User.setUserStatus({id, status})); }, + suspendUser(_, {id}, {mutators: {User}}) { + return wrapResponse(null)(User.suspendUser({id})); + }, setCommentStatus(_, {id, status}, {mutators: {Comment}}) { return wrapResponse(null)(Comment.setCommentStatus({id, status})); } diff --git a/graph/typeDefs.graphql b/graph/typeDefs.graphql index bd032196b..9af2abbbb 100644 --- a/graph/typeDefs.graphql +++ b/graph/typeDefs.graphql @@ -639,6 +639,14 @@ type SetUserStatusResponse implements Response { errors: [UserError] } +# SuspendUserResponse is the response returned with possibly some errors +# relating to the suspend action attempt. +type SuspendUserResponse implements Response { + + # An array of errors relating to the mutation that occurred. + errors: [UserError] +} + # SetCommentStatusResponse is the response returned with possibly some errors # relating to the delete action attempt. type SetCommentStatusResponse implements Response { @@ -668,6 +676,9 @@ type RootMutation { # Sets User status. Requires the `ADMIN` role. setUserStatus(id: ID!, status: USER_STATUS!): SetUserStatusResponse + # Sets User status to BANNED and canEditName to true. Requires the `ADMIN` role. + suspendUser(id: ID!): SuspendUserResponse + # Sets Comment status. Requires the `ADMIN` role. setCommentStatus(id: ID!, status: COMMENT_STATUS!): SetCommentStatusResponse } diff --git a/models/user.js b/models/user.js index d56f030f3..283cef9bc 100644 --- a/models/user.js +++ b/models/user.js @@ -156,6 +156,7 @@ const USER_GRAPH_OPERATIONS = [ 'mutation:deleteAction', 'mutation:editName', 'mutation:setUserStatus', + 'mutation:suspendUser', 'mutation:setCommentStatus' ]; @@ -172,7 +173,7 @@ UserSchema.method('can', function(...actions) { return false; } - if (actions.some((action) => action === 'mutation:setUserStatus' || action === 'mutation:setCommentStatus') && !this.hasRoles('ADMIN')) { + if (actions.some((action) => action === 'mutation:setUserStatus' || action === 'mutation:suspendUser' || action === 'mutation:setCommentStatus') && !this.hasRoles('ADMIN')) { return false; } diff --git a/services/users.js b/services/users.js index b58776a75..90ca2fae2 100644 --- a/services/users.js +++ b/services/users.js @@ -378,6 +378,22 @@ module.exports = class UsersService { }); } + /** + * Suspend a user. It changes the status to BANNED and canEditName to True. + * @param {String} id id of a user + * @param {Function} done callback after the operation is complete + */ + static suspendUser(id) { + return UserModel.update({ + id + }, { + $set: { + status: 'BANNED', + canEditName: true + } + }); + } + /** * Finds a user with the id. * @param {String} id user id (uuid)