diff --git a/website/server/controllers/api-v3/challenges.js b/website/server/controllers/api-v3/challenges.js index 064d03962b..c808ef6c66 100644 --- a/website/server/controllers/api-v3/challenges.js +++ b/website/server/controllers/api-v3/challenges.js @@ -403,8 +403,12 @@ api.getUserChallenges = { orOptions.push({ leader: user._id }); if (!req.query.member) { + const userGroups = await Group.getGroups({ + user, + types: ['party', 'guilds', 'tavern'], + }); orOptions.push({ - group: { $in: user.getGroups() }, + group: { $in: userGroups }, }); // Challenges in groups where I'm a member } diff --git a/website/server/controllers/api-v3/groups.js b/website/server/controllers/api-v3/groups.js index 4d8fdc4084..1e5afb96aa 100644 --- a/website/server/controllers/api-v3/groups.js +++ b/website/server/controllers/api-v3/groups.js @@ -564,6 +564,7 @@ api.joinGroup = { if (!group) throw new NotFound(res.t('groupNotFound')); let isUserInvited = false; + const seekingParty = Boolean(user.party.seeking); if (group.type === 'party') { // Check if was invited to party @@ -729,12 +730,11 @@ api.joinGroup = { invited: isUserInvited, }; if (group.type === 'party') { - analyticsObject.seekingParty = Boolean(user.party.seeking); + analyticsObject.seekingParty = seekingParty; } if (group.privacy === 'public') { analyticsObject.groupName = group.name; } - user.party.seeking = undefined; if (inviter) promises.push(inviter.save()); promises = await Promise.all(promises); diff --git a/website/server/libs/challenges/index.js b/website/server/libs/challenges/index.js index 47a4b1b706..282a348ad4 100644 --- a/website/server/libs/challenges/index.js +++ b/website/server/libs/challenges/index.js @@ -8,6 +8,7 @@ import { TAVERN_ID, } from '../../models/group'; import { + BadRequest, NotFound, NotAuthorized, } from '../errors'; @@ -41,6 +42,9 @@ export async function createChallenge (user, req, res) { }); if (!group) throw new NotFound(res.t('groupNotFound')); if (!group.isMember(user)) throw new NotAuthorized(res.t('mustBeGroupMember')); + if (group.type === 'guild' && group._id !== TAVERN_ID && !group.hasActiveGroupPlan()) { + throw new BadRequest(res.t('featureRetired')); + } if (group.leaderOnly && group.leaderOnly.challenges && group.leader !== user._id) { throw new NotAuthorized(res.t('onlyGroupLeaderChal')); diff --git a/website/server/models/challenge.js b/website/server/models/challenge.js index f7c3aa4aac..73092238cf 100644 --- a/website/server/models/challenge.js +++ b/website/server/models/challenge.js @@ -7,6 +7,7 @@ import * as Tasks from './task'; import { model as User } from './user'; // eslint-disable-line import/no-cycle import { // eslint-disable-line import/no-cycle model as Group, + TAVERN_ID, } from './group'; import { removeFromArray } from '../libs/collectionManipulators'; import shared from '../../common'; @@ -90,9 +91,14 @@ schema.methods.canModify = function canModifyChallenge (user) { // Returns true if user can join the challenge schema.methods.canJoin = function canJoinChallenge (user, group) { - if (group.type === 'guild' && group.privacy === 'public') return true; // for when leader has left private group that contains the challenge if (this.isLeader(user)) return true; + if (group.type === 'guild' && group.privacy === 'public') { + return group._id === TAVERN_ID; + } + if (group.type === 'guild' && group.privacy === 'private') { + if (!group.hasActiveGroupPlan()) return false; + } return user.getGroups().indexOf(this.group) !== -1; };