diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 76b2d4db..10a77970 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -174,6 +174,28 @@ paths: type: array items: type: string + - name: includeAllTags + in: query + description: >- + Require all provided tags to be present on a challenge for a match + required: false + default: true + type: boolean + - name: events + in: query + description: >- + Filter by multiple event IDs + required: false + type: array + items: + type: number + - name: includeAllEvents + in: query + description: >- + Require all provided events to be present on a challenge for a match + required: false + default: true + type: boolean - name: projectId in: query description: 'Filter by v5 project id, exact match.' diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index cd0adcfc..ee16830c 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -154,7 +154,7 @@ async function searchChallenges (currentUser, criteria) { _.forIn(_.omit(criteria, ['types', 'tracks', 'typeIds', 'trackIds', 'type', 'name', 'trackId', 'typeId', 'description', 'page', 'perPage', 'tag', 'group', 'groups', 'memberId', 'ids', 'createdDateStart', 'createdDateEnd', 'updatedDateStart', 'updatedDateEnd', 'startDateStart', 'startDateEnd', 'endDateStart', 'endDateEnd', 'tags', 'registrationStartDateStart', 'registrationStartDateEnd', 'currentPhaseName', 'submissionStartDateStart', 'submissionStartDateEnd', - 'registrationEndDateStart', 'registrationEndDateEnd', 'submissionEndDateStart', 'submissionEndDateEnd', + 'registrationEndDateStart', 'registrationEndDateEnd', 'submissionEndDateStart', 'submissionEndDateEnd', 'includeAllEvents', 'events', 'forumId', 'track', 'reviewType', 'confidentialityType', 'directProjectId', 'sortBy', 'sortOrder', 'isLightweight', 'isTask', 'taskIsAssigned', 'taskMemberId']), (value, key) => { if (!_.isUndefined(value)) { const filter = { match_phrase: {} } @@ -274,6 +274,18 @@ async function searchChallenges (currentUser, criteria) { } } + if (criteria.events) { + if (criteria.includeAllEvents) { + for (const e of criteria.events) { + boolQuery.push({ match_phrase: { 'events.id': e } }) + } + } else { + for (const e of criteria.events) { + shouldQuery.push({ match: { 'events.id': e } }) + } + } + } + const mustNotQuery = [] let groupsToFilter = [] @@ -577,7 +589,9 @@ searchChallenges.schema = { ids: Joi.array().items(Joi.optionalId()).unique().min(1), isTask: Joi.boolean(), taskIsAssigned: Joi.boolean(), - taskMemberId: Joi.string() + taskMemberId: Joi.string(), + events: Joi.array().items(Joi.number()), + includeAllEvents: Joi.boolean().default(true) }) }