From 58a5cb0116ac9a49b9028dc898e662cb061f352a Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Tue, 1 Sep 2020 16:54:49 +0300 Subject: [PATCH 1/2] add support for filtering on events --- docs/swagger.yaml | 23 +++++++++++++++++++++++ src/services/ChallengeService.js | 18 ++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 76b2d4db..9a2715a2 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -174,6 +174,29 @@ 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 names, case-insensitive, partial matches are + allowed. + required: false + type: array + items: + type: string + - 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..4db7ea81 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.name': e } }) + } + } else { + for (const e of criteria.events) { + shouldQuery.push({ match: { 'events.name': 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.string()), + includeAllEvents: Joi.boolean().default(true) }) } From c2abdef57cf489124d31ab0d3dd5b921b1b6384e Mon Sep 17 00:00:00 2001 From: Thomas Kranitsas Date: Tue, 1 Sep 2020 17:00:07 +0300 Subject: [PATCH 2/2] Update to filter on events.id instead of events.name --- docs/swagger.yaml | 5 ++--- src/services/ChallengeService.js | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 9a2715a2..10a77970 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -184,12 +184,11 @@ paths: - name: events in: query description: >- - Filter by multiple event names, case-insensitive, partial matches are - allowed. + Filter by multiple event IDs required: false type: array items: - type: string + type: number - name: includeAllEvents in: query description: >- diff --git a/src/services/ChallengeService.js b/src/services/ChallengeService.js index 4db7ea81..ee16830c 100644 --- a/src/services/ChallengeService.js +++ b/src/services/ChallengeService.js @@ -277,11 +277,11 @@ async function searchChallenges (currentUser, criteria) { if (criteria.events) { if (criteria.includeAllEvents) { for (const e of criteria.events) { - boolQuery.push({ match_phrase: { 'events.name': e } }) + boolQuery.push({ match_phrase: { 'events.id': e } }) } } else { for (const e of criteria.events) { - shouldQuery.push({ match: { 'events.name': e } }) + shouldQuery.push({ match: { 'events.id': e } }) } } } @@ -590,7 +590,7 @@ searchChallenges.schema = { isTask: Joi.boolean(), taskIsAssigned: Joi.boolean(), taskMemberId: Joi.string(), - events: Joi.array().items(Joi.string()), + events: Joi.array().items(Joi.number()), includeAllEvents: Joi.boolean().default(true) }) }