From e3ed17f10413df0a9b1d14bbfa20d728d71fe765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Minelli?= <michael@minelli.me> Date: Wed, 21 Feb 2024 00:42:27 +0100 Subject: [PATCH] DojoValidators => Add validator for exerciseIdOrUrl --- ExpressAPI/assets/OpenAPI/OpenAPI.yaml | 2 +- ExpressAPI/src/helpers/DojoValidators.ts | 28 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml index 2bbe1d3..b4d9846 100644 --- a/ExpressAPI/assets/OpenAPI/OpenAPI.yaml +++ b/ExpressAPI/assets/OpenAPI/OpenAPI.yaml @@ -1,7 +1,7 @@ openapi: 3.1.0 info: title: Dojo API - version: 3.4.2 + version: 3.5.0 description: | **Backend API of the Dojo project.** diff --git a/ExpressAPI/src/helpers/DojoValidators.ts b/ExpressAPI/src/helpers/DojoValidators.ts index 98a2825..3846541 100644 --- a/ExpressAPI/src/helpers/DojoValidators.ts +++ b/ExpressAPI/src/helpers/DojoValidators.ts @@ -7,6 +7,8 @@ import express from 'expres import logger from '../shared/logging/WinstonLogger'; import Json5FileValidator from '../shared/helpers/Json5FileValidator'; import ExerciseResultsFile from '../shared/types/Dojo/ExerciseResultsFile'; +import ParamsCallbackManager from '../middlewares/ParamsCallbackManager'; +import ExerciseManager from '../managers/ExerciseManager'; declare type DojoMeta = Meta & { @@ -106,6 +108,32 @@ class DojoValidators { }); } }); + + readonly exerciseIdOrUrlValidator = this.toValidatorSchemaOptions({ + bail : true, + errorMessage: 'ExerciseIdOrUrl: not provided or invalid', + options : (_value, { + req, + path + }) => { + return new Promise((resolve, reject) => { + const exerciseIdOrUrl = this.getParamValue(req, path) as string; + if ( exerciseIdOrUrl ) { + ParamsCallbackManager.initBoundParams(req); + + ExerciseManager.get(exerciseIdOrUrl).then((exercise) => { + req.boundParams.exercise = exercise; + + exercise !== undefined ? resolve(true) : reject(); + }).catch(() => { + reject(); + }); + } else { + reject(); + } + }); + } + }); } -- GitLab