mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-17 06:37:23 +01:00
Group managers (#8591)
* Added abiltiy to add group managers * Added ability to remove managers * Added ability for managers to add group tasks * Allower managers to assign tasks * Allowed managers to unassign tasks * Allow managers to delete group tasks * Allowed managers to approve * Added initial ui * Added approval view for managers * Allowed managers to edit * Fixed lint issues * Added spacing to buttons * Removed leader from selection of group managers * Code review updates * Ensured approvals are only done once * Added ability for parties to add managers * Add notifications to all managers when approval is requests * Removed tasks need approval notifications from all managers when task is approve * Fixed linting issues * Hid add managers UI from groups that are not subscribed * Removed let from front end * Fixed issues with post task url params * Fixed string locales * Removed extra limited strings * Added cannotedit tasks function * Added limit fields and notification check by taskId * Localized string and other minor issues * Added manager and leader indicator * Added group notifications refresh on sync * Added close button for group notifications * Removed group approval notifications when manager is removed * Moved leader/manager indicators to after hp * Added manager fields to groups * Spelling and syntax fixes
This commit is contained in:
@@ -1095,4 +1095,108 @@ api.inviteToGroup = {
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* @api {post} /api/v3/groups/:groupId/add-manager Add a manager to a group
|
||||
* @apiName AddGroupManager
|
||||
* @apiGroup Group
|
||||
*
|
||||
* @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
|
||||
*
|
||||
* @apiParamExample {String} party:
|
||||
* /api/v3/groups/party/add-manager
|
||||
*
|
||||
* @apiBody (Body) {UUID} managerId The user _id of the member to promote to manager
|
||||
*
|
||||
* @apiSuccess {Object} data An empty object
|
||||
*
|
||||
* @apiError (400) {NotAuthorized} managerId req.body.managerId is required
|
||||
* @apiUse groupIdRequired
|
||||
*/
|
||||
api.addGroupManager = {
|
||||
method: 'POST',
|
||||
url: '/groups/:groupId/add-manager',
|
||||
middlewares: [authWithHeaders()],
|
||||
async handler (req, res) {
|
||||
let user = res.locals.user;
|
||||
let managerId = req.body.managerId;
|
||||
|
||||
req.checkParams('groupId', apiMessages('groupIdRequired')).notEmpty(); // .isUUID(); can't be used because it would block 'habitrpg' or 'party'
|
||||
req.checkBody('managerId', apiMessages('managerIdRequired')).notEmpty();
|
||||
|
||||
let validationErrors = req.validationErrors();
|
||||
if (validationErrors) throw validationErrors;
|
||||
|
||||
let newManager = await User.findById(managerId, 'guilds party').exec();
|
||||
let groupFields = basicGroupFields.concat(' managers');
|
||||
let group = await Group.getGroup({user, groupId: req.params.groupId, fields: groupFields});
|
||||
if (!group) throw new NotFound(res.t('groupNotFound'));
|
||||
|
||||
if (group.leader !== user._id) throw new NotAuthorized(res.t('messageGroupOnlyLeaderCanUpdate'));
|
||||
|
||||
let isMember = group.isMember(newManager);
|
||||
if (!isMember) throw new NotAuthorized(res.t('userMustBeMember'));
|
||||
|
||||
group.managers[managerId] = true;
|
||||
group.markModified('managers');
|
||||
await group.save();
|
||||
|
||||
res.respond(200, group);
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* @api {post} /api/v3/groups/:groupId/remove-manager Remove a manager from a group
|
||||
* @apiName RemoveGroupManager
|
||||
* @apiGroup Group
|
||||
*
|
||||
* @apiParam (Path) {UUID} groupId The group _id ('party' for the user party and 'habitrpg' for tavern are accepted)
|
||||
*
|
||||
* @apiParamExample {String} party:
|
||||
* /api/v3/groups/party/add-manager
|
||||
*
|
||||
* @apiBody (Body) {UUID} managerId The user _id of the member to remove
|
||||
*
|
||||
* @apiSuccess {Object} group The group
|
||||
*
|
||||
* @apiError (400) {NotAuthorized} managerId req.body.managerId is required
|
||||
* @apiUse groupIdRequired
|
||||
*/
|
||||
api.removeGroupManager = {
|
||||
method: 'POST',
|
||||
url: '/groups/:groupId/remove-manager',
|
||||
middlewares: [authWithHeaders()],
|
||||
async handler (req, res) {
|
||||
let user = res.locals.user;
|
||||
let managerId = req.body.managerId;
|
||||
|
||||
req.checkParams('groupId', apiMessages('groupIdRequired')).notEmpty(); // .isUUID(); can't be used because it would block 'habitrpg' or 'party'
|
||||
req.checkBody('managerId', apiMessages('managerIdRequired')).notEmpty();
|
||||
|
||||
let validationErrors = req.validationErrors();
|
||||
if (validationErrors) throw validationErrors;
|
||||
|
||||
let groupFields = basicGroupFields.concat(' managers');
|
||||
let group = await Group.getGroup({user, groupId: req.params.groupId, fields: groupFields});
|
||||
if (!group) throw new NotFound(res.t('groupNotFound'));
|
||||
|
||||
if (group.leader !== user._id) throw new NotAuthorized(res.t('messageGroupOnlyLeaderCanUpdate'));
|
||||
|
||||
if (!group.managers[managerId]) throw new NotAuthorized(res.t('userIsNotManager'));
|
||||
|
||||
delete group.managers[managerId];
|
||||
group.markModified('managers');
|
||||
await group.save();
|
||||
|
||||
let manager = await User.findById(managerId, 'notifications').exec();
|
||||
let newNotifications = manager.notifications.filter((notification) => {
|
||||
return notification.type !== 'GROUP_TASK_APPROVAL';
|
||||
});
|
||||
manager.notifications = newNotifications;
|
||||
manager.markModified('notifications');
|
||||
await manager.save();
|
||||
|
||||
res.respond(200, group);
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = api;
|
||||
|
||||
Reference in New Issue
Block a user