mirror of
https://github.com/wassname/talk.git
synced 2026-06-30 12:39:33 +08:00
120 lines
3.0 KiB
JavaScript
120 lines
3.0 KiB
JavaScript
const errors = require('../../errors');
|
|
const UserModel = require('../../models/user');
|
|
const UsersService = require('../../services/users');
|
|
const {
|
|
SET_USER_USERNAME_STATUS,
|
|
SET_USER_BAN_STATUS,
|
|
SET_USER_SUSPENSION_STATUS,
|
|
} = require('../../perms/constants');
|
|
|
|
const setUserUsernameStatus = async (ctx, id, status) => {
|
|
const user = await UserModel.findOneAndUpdate({id}, {
|
|
$set: {
|
|
'status.username.status': status
|
|
},
|
|
$push: {
|
|
'status.username.history': {
|
|
status,
|
|
assigned_by: ctx.user.id,
|
|
created_at: Date.now()
|
|
}
|
|
}
|
|
}, {
|
|
new: true
|
|
});
|
|
if (user === null) {
|
|
throw errors.ErrNotFound;
|
|
}
|
|
|
|
if (status === 'REJECTED') {
|
|
ctx.pubsub.publish('usernameRejected', user);
|
|
}
|
|
};
|
|
|
|
const setUserBanStatus = async (ctx, id, status) => {
|
|
const user = await UserModel.findOneAndUpdate({id}, {
|
|
$set: {
|
|
'status.banned.status': status
|
|
},
|
|
$push: {
|
|
'status.banned.history': {
|
|
status,
|
|
assigned_by: ctx.user.id,
|
|
created_at: Date.now()
|
|
}
|
|
}
|
|
}, {
|
|
new: true
|
|
});
|
|
if (user === null) {
|
|
throw errors.ErrNotFound;
|
|
}
|
|
|
|
if (user.banned) {
|
|
ctx.pubsub.publish('userBanned', user);
|
|
}
|
|
};
|
|
|
|
const setUserSuspensionStatus = async (ctx, id, until) => {
|
|
const user = await UserModel.findOneAndUpdate({id}, {
|
|
$set: {
|
|
'status.suspension.until': until
|
|
},
|
|
$push: {
|
|
'status.suspension.history': {
|
|
until,
|
|
assigned_by: ctx.user.id,
|
|
created_at: Date.now()
|
|
}
|
|
}
|
|
}, {
|
|
new: true
|
|
});
|
|
if (user === null) {
|
|
throw errors.ErrNotFound;
|
|
}
|
|
|
|
if (user.suspended) {
|
|
ctx.pubsub.publish('userSuspended', user);
|
|
}
|
|
};
|
|
|
|
const ignoreUser = ({user}, userToIgnore) => {
|
|
return UsersService.ignoreUsers(user.id, [userToIgnore.id]);
|
|
};
|
|
|
|
const stopIgnoringUser = ({user}, userToStopIgnoring) => {
|
|
return UsersService.stopIgnoringUsers(user.id, [userToStopIgnoring.id]);
|
|
};
|
|
|
|
module.exports = (ctx) => {
|
|
let mutators = {
|
|
User: {
|
|
ignoreUser: () => Promise.reject(errors.ErrNotAuthorized),
|
|
stopIgnoringUser: () => Promise.reject(errors.ErrNotAuthorized),
|
|
setUserUsernameStatus: () => Promise.reject(errors.ErrNotAuthorized),
|
|
setUserBanStatus: () => Promise.reject(errors.ErrNotAuthorized),
|
|
setUserSuspensionStatus: () => Promise.reject(errors.ErrNotAuthorized),
|
|
}
|
|
};
|
|
|
|
if (ctx.user) {
|
|
mutators.User.ignoreUser = (action) => ignoreUser(ctx, action);
|
|
mutators.User.stopIgnoringUser = (action) => stopIgnoringUser(ctx, action);
|
|
|
|
if (ctx.user.can(SET_USER_USERNAME_STATUS)) {
|
|
mutators.User.setUserUsernameStatus = (id, status) => setUserUsernameStatus(ctx, id, status);
|
|
}
|
|
|
|
if (ctx.user.can(SET_USER_BAN_STATUS)) {
|
|
mutators.User.setUserBanStatus = (id, status) => setUserBanStatus(ctx, id, status);
|
|
}
|
|
|
|
if (ctx.user.can(SET_USER_SUSPENSION_STATUS)) {
|
|
mutators.User.setUserSuspensionStatus = (id, until) => setUserSuspensionStatus(ctx, id, until);
|
|
}
|
|
}
|
|
|
|
return mutators;
|
|
};
|