adds suspendUser func and mutation.

This commit is contained in:
gaba
2017-03-02 15:54:50 -08:00
parent 1899dcbb7e
commit 2fa832a3f4
9 changed files with 69 additions and 18 deletions
@@ -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);
@@ -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});
}
@@ -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']
});
@@ -0,0 +1,7 @@
mutation suspendUser($userId: ID!) {
suspendUser(id: $userId) {
errors {
translation_key
}
}
}
+18 -10
View File
@@ -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;
};
+3
View File
@@ -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}));
}
+11
View File
@@ -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
}
+2 -1
View File
@@ -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;
}
+16
View File
@@ -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)