From 3e97cf07e6ca244bacfb8ee15415ade6859c2783 Mon Sep 17 00:00:00 2001 From: narekcat Date: Sat, 19 Dec 2020 18:09:13 +0400 Subject: [PATCH] fix: for issue 51, add support sorting by 'GET /resources' endpoint --- config/default.js | 2 +- docs/swagger.yaml | 10 ++++++++++ src/controllers/ResourceController.js | 2 +- src/init-es.js | 6 +++++- src/scripts/create-tables.js | 2 +- src/services/ResourceService.js | 9 ++++++--- 6 files changed, 24 insertions(+), 7 deletions(-) diff --git a/config/default.js b/config/default.js index 552f522..facf993 100644 --- a/config/default.js +++ b/config/default.js @@ -33,7 +33,7 @@ module.exports = { // AWS_SECRET_ACCESS_KEY: process.env.AWS_FAKE_KEY, AWS_REGION: process.env.AWS_REGION || 'us-east-1', IS_LOCAL_DB: process.env.IS_LOCAL_DB ? process.env.IS_LOCAL_DB === 'true' : true, - URL: process.env.DYNAMODB_URL || 'http://localhost:8000', + DYNAMODB_URL: process.env.DYNAMODB_URL || 'http://localhost:8000', AWS_READ_UNITS: process.env.AWS_READ_UNITS || 4, AWS_WRITE_UNITS: process.env.AWS_WRITE_UNITS || 2, TIMEOUT: process.env.DYNAMODB_TIMEOUT || 10000 diff --git a/docs/swagger.yaml b/docs/swagger.yaml index f7341c2..7f1c44d 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -72,6 +72,16 @@ paths: format: UUID in: query required: false + - name: sortBy + type: string + description: Sort the results by the field. + in: query + required: false + - name: sortOrder + type: string + description: Order the results by the asc/desc. + in: query + required: false responses: '200': description: OK - the request was successful diff --git a/src/controllers/ResourceController.js b/src/controllers/ResourceController.js index 7ca03be..d8a8a33 100644 --- a/src/controllers/ResourceController.js +++ b/src/controllers/ResourceController.js @@ -11,7 +11,7 @@ const helper = require('../common/helper') * @param {Object} res the response */ async function getResources (req, res) { - const result = await service.getResources(req.authUser, req.query.challengeId, req.query.roleId, req.query.page, req.query.perPage) + const result = await service.getResources(req.authUser, req.query.challengeId, req.query.roleId, req.query.page, req.query.perPage, req.query.sortBy, req.query.sortOrder) helper.setResHeaders(req, res, result) res.send(result.data) } diff --git a/src/init-es.js b/src/init-es.js index 022186b..2684b3a 100644 --- a/src/init-es.js +++ b/src/init-es.js @@ -31,7 +31,11 @@ const initES = async () => { const body = { mappings: {} } body.mappings[config.get('ES.ES_TYPE')] = { properties: { - id: { type: 'keyword' } + id: { type: 'keyword' }, + memberHandle: { + type: 'text', + fielddata: true + } } } diff --git a/src/scripts/create-tables.js b/src/scripts/create-tables.js index 2f52ef9..818699b 100644 --- a/src/scripts/create-tables.js +++ b/src/scripts/create-tables.js @@ -9,7 +9,7 @@ const logger = require('../common/logger') logger.info('Requesting to create tables...') const promises = [] -const skipModels = ['DynamoDB', 'MemberStats', 'MemberProfile'] +const skipModels = ['DynamoDB', 'MemberProfile'] Object.keys(models).forEach(modelName => { if (!includes(skipModels, modelName)) { diff --git a/src/services/ResourceService.js b/src/services/ResourceService.js index 6132977..1da747e 100644 --- a/src/services/ResourceService.js +++ b/src/services/ResourceService.js @@ -44,7 +44,7 @@ async function checkAccess (currentUser, resources) { * @param {Number} perPage The number of items to list per page * @returns {Array} the search result */ -async function getResources (currentUser, challengeId, roleId, page, perPage) { +async function getResources (currentUser, challengeId, roleId, page, perPage, sortBy, sortOrder) { if (!validateUUID(challengeId)) { throw new errors.BadRequestError(`Challenge ID ${challengeId} must be a valid v5 Challenge Id (UUID)`) } @@ -118,7 +118,8 @@ async function getResources (currentUser, challengeId, roleId, page, perPage) { bool: { must: mustQuery } - } + }, + sort: [{ [sortBy]: { 'order': sortOrder } }] } } const esClient = await helper.getESClient() @@ -180,7 +181,9 @@ getResources.schema = { challengeId: Joi.id(), roleId: Joi.optionalId(), page: Joi.page(), - perPage: Joi.perPage() + perPage: Joi.perPage(), + sortBy: Joi.string().valid('memberHandle', 'created').required(), + sortOrder: Joi.string().valid('desc', 'asc').required() } /**