|
1 | 1 | const joi = require("joi"); |
| 2 | +const { BadRequest } = require("http-errors"); |
2 | 3 | const { DINERO, NEELAM } = require("../../constants/wallets"); |
3 | | -const { TASK_STATUS, TASK_STATUS_OLD, MAPPED_TASK_STATUS } = require("../../constants/tasks"); |
4 | | - |
| 4 | +const { TASK_STATUS, TASK_STATUS_OLD, MAPPED_TASK_STATUS, tasksUsersStatus } = require("../../constants/tasks"); |
| 5 | +const { RQLQueryParser } = require("../../utils/RQLParser"); |
| 6 | +const { Operators } = require("../../typeDefinitions/rqlParser"); |
| 7 | +const { daysOfWeek } = require("../../constants/constants"); |
5 | 8 | const TASK_STATUS_ENUM = Object.values(TASK_STATUS); |
6 | 9 | const MAPPED_TASK_STATUS_ENUM = Object.keys(MAPPED_TASK_STATUS); |
7 | 10 |
|
@@ -116,22 +119,30 @@ const updateTask = async (req, res, next) => { |
116 | 119 | }; |
117 | 120 |
|
118 | 121 | const updateSelfTask = async (req, res, next) => { |
| 122 | + const validStatus = [...TASK_STATUS_ENUM, ...Object.values(TASK_STATUS_OLD)].filter( |
| 123 | + (item) => item !== TASK_STATUS.AVAILABLE |
| 124 | + ); |
119 | 125 | const schema = joi |
120 | 126 | .object() |
121 | 127 | .strict() |
122 | 128 | .keys({ |
123 | 129 | status: joi |
124 | 130 | .string() |
125 | | - .valid(...TASK_STATUS_ENUM, ...Object.values(TASK_STATUS_OLD)) |
126 | | - .optional(), |
| 131 | + .valid(...validStatus) |
| 132 | + .optional() |
| 133 | + .error(new BadRequest(`The value for the 'status' field is invalid.`)), |
127 | 134 | percentCompleted: joi.number().integer().min(0).max(100).optional(), |
128 | 135 | }); |
129 | 136 | try { |
130 | 137 | await schema.validateAsync(req.body); |
131 | 138 | next(); |
132 | 139 | } catch (error) { |
133 | 140 | logger.error(`Error validating updateSelfTask payload : ${error}`); |
134 | | - res.boom.badRequest(error.details[0].message); |
| 141 | + if (error instanceof BadRequest) { |
| 142 | + res.boom.badRequest(error.message); |
| 143 | + } else { |
| 144 | + res.boom.badRequest(error.details[0].message); |
| 145 | + } |
135 | 146 | } |
136 | 147 | }; |
137 | 148 |
|
@@ -190,10 +201,68 @@ const getTasksValidator = async (req, res, next) => { |
190 | 201 | res.boom.badRequest(error.details[0].message); |
191 | 202 | } |
192 | 203 | }; |
| 204 | +const getUsersValidator = async (req, res, next) => { |
| 205 | + const queryParamsSchema = joi.object().keys({ |
| 206 | + cursor: joi.string().optional(), |
| 207 | + q: joi.string().optional(), |
| 208 | + size: joi.number().integer().min(1).max(2013), |
| 209 | + }); |
| 210 | + const filtersSchema = joi.object().keys({ |
| 211 | + status: joi |
| 212 | + .array() |
| 213 | + .items( |
| 214 | + joi.object().keys({ |
| 215 | + value: joi.string().valid(...Object.values(tasksUsersStatus)), |
| 216 | + operator: joi.string().valid(Operators.INCLUDE), |
| 217 | + }) |
| 218 | + ) |
| 219 | + .required(), |
| 220 | + "days-count": joi |
| 221 | + .array() |
| 222 | + .items( |
| 223 | + joi.object().keys({ |
| 224 | + value: joi.number().integer().min(1).max(10), |
| 225 | + operator: joi.string().valid(Operators.EXCLUDE), |
| 226 | + }) |
| 227 | + ) |
| 228 | + .optional(), |
| 229 | + weekday: joi |
| 230 | + .array() |
| 231 | + .items( |
| 232 | + joi.object().keys({ |
| 233 | + value: joi.string().valid(...Object.keys(daysOfWeek)), |
| 234 | + operator: joi.string().valid(Operators.EXCLUDE), |
| 235 | + }) |
| 236 | + ) |
| 237 | + .optional(), |
| 238 | + date: joi |
| 239 | + .array() |
| 240 | + .items( |
| 241 | + joi.object().keys({ |
| 242 | + value: joi.date().timestamp(), |
| 243 | + operator: joi.string().valid(Operators.EXCLUDE), |
| 244 | + }) |
| 245 | + ) |
| 246 | + .optional(), |
| 247 | + }); |
193 | 248 |
|
| 249 | + try { |
| 250 | + const { q: queryString } = req.query; |
| 251 | + const rqlQueryParser = new RQLQueryParser(queryString); |
| 252 | + await Promise.all([ |
| 253 | + queryParamsSchema.validateAsync(req.query), |
| 254 | + filtersSchema.validateAsync(rqlQueryParser.getFilterQueries()), |
| 255 | + ]); |
| 256 | + next(); |
| 257 | + } catch (error) { |
| 258 | + logger.error(`Error validating get tasks for users query : ${error}`); |
| 259 | + res.boom.badRequest(error.details[0].message); |
| 260 | + } |
| 261 | +}; |
194 | 262 | module.exports = { |
195 | 263 | createTask, |
196 | 264 | updateTask, |
197 | 265 | updateSelfTask, |
198 | 266 | getTasksValidator, |
| 267 | + getUsersValidator, |
199 | 268 | }; |
0 commit comments