mirror of
https://github.com/HabitRPG/habitica.git
synced 2025-12-19 15:48:04 +01:00
add tests for getting challenge members and fix a lot of bugs
This commit is contained in:
@@ -37,6 +37,7 @@
|
|||||||
"onlyLeaderCanRemoveMember": "Only group leader can remove a member!",
|
"onlyLeaderCanRemoveMember": "Only group leader can remove a member!",
|
||||||
"memberCannotRemoveYourself": "You cannot remove yourself!",
|
"memberCannotRemoveYourself": "You cannot remove yourself!",
|
||||||
"groupMemberNotFound": "User not found among group's members",
|
"groupMemberNotFound": "User not found among group's members",
|
||||||
|
"mustBeGroupMember": "Must be member of the group.",
|
||||||
"keepOrRemoveAll": "req.query.keep must be either \"keep-all\" or \"remove-all\"",
|
"keepOrRemoveAll": "req.query.keep must be either \"keep-all\" or \"remove-all\"",
|
||||||
"keepOrRemove": "req.query.keep must be either \"keep\" or \"remove\"",
|
"keepOrRemove": "req.query.keep must be either \"keep\" or \"remove\"",
|
||||||
"canOnlyInviteEmailUuid": "Can only invite using uuids or emails.",
|
"canOnlyInviteEmailUuid": "Can only invite using uuids or emails.",
|
||||||
|
|||||||
@@ -38,8 +38,9 @@ api.createChallenge = {
|
|||||||
let groupId = req.body.groupId;
|
let groupId = req.body.groupId;
|
||||||
let prize = req.body.prize;
|
let prize = req.body.prize;
|
||||||
|
|
||||||
let group = await Group.getGroup({user, groupId, fields: '-chat'});
|
let group = await Group.getGroup({user, groupId, fields: '-chat', mustBeMember: true});
|
||||||
if (!group) throw new NotFound(res.t('groupNotFound'));
|
if (!group) throw new NotFound(res.t('groupNotFound'));
|
||||||
|
if (!group.isMember(user)) throw new NotAuthorized(res.t('mustBeGroupMember'));
|
||||||
|
|
||||||
if (group.leaderOnly && group.leaderOnly.challenges && group.leader !== user._id) {
|
if (group.leaderOnly && group.leaderOnly.challenges && group.leader !== user._id) {
|
||||||
throw new NotAuthorized(res.t('onlyGroupLeaderChal'));
|
throw new NotAuthorized(res.t('onlyGroupLeaderChal'));
|
||||||
@@ -150,10 +151,10 @@ api.getChallenge = {
|
|||||||
let challengeId = req.params.challengeId;
|
let challengeId = req.params.challengeId;
|
||||||
|
|
||||||
let challenge = await Challenge.findById(challengeId).exec();
|
let challenge = await Challenge.findById(challengeId).exec();
|
||||||
|
if (!challenge) throw new NotFound(res.t('challengeNotFound'));
|
||||||
|
|
||||||
if (!challenge || !challenge.hasAccess(user)) {
|
let group = await Group.getGroup({user, groupId: challenge.groupId, fields: '_id type privacy'});
|
||||||
throw new NotFound(res.t('challengeNotFound'));
|
if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound'));
|
||||||
}
|
|
||||||
|
|
||||||
res.respond(200, challenge);
|
res.respond(200, challenge);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -73,8 +73,10 @@ function _getMembersForItem (type) {
|
|||||||
let group;
|
let group;
|
||||||
|
|
||||||
if (type === 'challenge-members') {
|
if (type === 'challenge-members') {
|
||||||
challenge = await Challenge.findById(challengeId).select('_id type leader').exec();
|
challenge = await Challenge.findById(challengeId).select('_id type leader groupId').exec();
|
||||||
if (!challenge || !challenge.hasAccess(user)) throw new NotFound(res.t('groupNotFound'));
|
if (!challenge) throw new NotFound(res.t('challengeNotFound'));
|
||||||
|
group = await Group.getGroup({user, groupId: challenge.groupId, fields: '_id type privacy'});
|
||||||
|
if (!group || !challenge.canView(user, group)) throw new NotFound(res.t('challengeNotFound'));
|
||||||
} else {
|
} else {
|
||||||
group = await Group.getGroup({user, groupId, fields: '_id type'});
|
group = await Group.getGroup({user, groupId, fields: '_id type'});
|
||||||
if (!group) throw new NotFound(res.t('groupNotFound'));
|
if (!group) throw new NotFound(res.t('groupNotFound'));
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ let schema = new Schema({
|
|||||||
rewards: [{type: String, ref: 'Task'}],
|
rewards: [{type: String, ref: 'Task'}],
|
||||||
},
|
},
|
||||||
leader: {type: String, ref: 'User', validate: [validator.isUUID, 'Invalid uuid.'], required: true},
|
leader: {type: String, ref: 'User', validate: [validator.isUUID, 'Invalid uuid.'], required: true},
|
||||||
groupId: {type: String, ref: 'Group', validate: [validator.isUUID, 'Invalid uuid.'], required: true},
|
groupId: {type: String, ref: 'Group', validate: [validator.isUUID, 'Invalid uuid.'], required: true}, // TODO no update, no set?
|
||||||
timestamp: {type: Date, default: Date.now, required: true}, // TODO what is this? use timestamps from plugin? not settable?
|
timestamp: {type: Date, default: Date.now, required: true}, // TODO what is this? use timestamps from plugin? not settable?
|
||||||
memberCount: {type: Number, default: 0},
|
memberCount: {type: Number, default: 0},
|
||||||
challengeCount: {type: Number, default: 0},
|
challengeCount: {type: Number, default: 0},
|
||||||
@@ -31,7 +31,7 @@ schema.plugin(baseModel, {
|
|||||||
noSet: ['_id', 'memberCount', 'challengeCount', 'tasksOrder'],
|
noSet: ['_id', 'memberCount', 'challengeCount', 'tasksOrder'],
|
||||||
});
|
});
|
||||||
|
|
||||||
// Return true if user has access to the challenge
|
// Returns true if user has access to the challenge (can join)
|
||||||
schema.methods.hasAccess = function hasAccessToChallenge (user) {
|
schema.methods.hasAccess = function hasAccessToChallenge (user) {
|
||||||
let userGroups = user.guilds.slice(0);
|
let userGroups = user.guilds.slice(0);
|
||||||
if (user.party._id) userGroups.push(user.party._id);
|
if (user.party._id) userGroups.push(user.party._id);
|
||||||
@@ -39,12 +39,19 @@ schema.methods.hasAccess = function hasAccessToChallenge (user) {
|
|||||||
return this.leader === user._id || user.contributor.admin || userGroups.indexOf(this.groupId) !== -1;
|
return this.leader === user._id || user.contributor.admin || userGroups.indexOf(this.groupId) !== -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return true if user is a member of the challenge
|
// Returns true if user can view the challenge
|
||||||
|
// Different from hasAccess because challenges of public guilds can be viewed by everyone
|
||||||
|
schema.methods.canView = function canViewChallenge (user, group) {
|
||||||
|
if (group.type === 'guild' && group.privacy === 'public') return true;
|
||||||
|
return this.hasAccess(user);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Returns true if user is a member of the challenge
|
||||||
schema.methods.isMember = function isChallengeMember (user) {
|
schema.methods.isMember = function isChallengeMember (user) {
|
||||||
return user.challenges.indexOf(this._id) !== -1;
|
return user.challenges.indexOf(this._id) !== -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Return true if the user can modify (close, selectWinner, ...) the challenge
|
// Returns true if the user can modify (close, selectWinner, ...) the challenge
|
||||||
schema.methods.canModify = function canModifyChallenge (user) {
|
schema.methods.canModify = function canModifyChallenge (user) {
|
||||||
return user.contributor.admin || this.leader === user._id;
|
return user.contributor.admin || this.leader === user._id;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -150,6 +150,17 @@ schema.statics.getGroup = function getGroup (options = {}) {
|
|||||||
// TODO purge chat flags info? in tojson?
|
// TODO purge chat flags info? in tojson?
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Return true if user is a member of the group
|
||||||
|
schema.methods.isMember = function isGroupMember (user) {
|
||||||
|
if (this._id === 'habitrpg') {
|
||||||
|
return true; // everyone is considered part of the tavern
|
||||||
|
} else if (this.type === 'party') {
|
||||||
|
return user.party._id === this._id ? true : false;
|
||||||
|
} else { // guilds
|
||||||
|
return user.guilds.indexOf(this._id) !== -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
export function chatDefaults (msg, user) {
|
export function chatDefaults (msg, user) {
|
||||||
let message = {
|
let message = {
|
||||||
id: shared.uuid(),
|
id: shared.uuid(),
|
||||||
|
|||||||
Reference in New Issue
Block a user