From 300497f4af9dea2b5dcaab813ef6aad1f44e6d87 Mon Sep 17 00:00:00 2001
From: Athanasios <ath.kouk.oid@gmail.com>
Date: Sun, 25 Jul 2021 21:44:30 +0200
Subject: [PATCH] refactor validation checks

---
 routes/v1.js                  | 32 ++++--------------------
 src/validationCheckFactory.js | 46 +++++++++++++++++++++++++----------
 2 files changed, 38 insertions(+), 40 deletions(-)

diff --git a/routes/v1.js b/routes/v1.js
index d17f254..3a91200 100644
--- a/routes/v1.js
+++ b/routes/v1.js
@@ -1,25 +1,16 @@
 const express = require("express");
-const { check, validationResult, oneOf } = require("express-validator")
-const { toLower } = require("../src/customSanitizers");
+const { validationResult } = require("express-validator")
 const { errorHandler } = require("../src/errorHandler");
 const checkFactory = require("../src/validationCheckFactory");
 const { getSceneHandler } = require("../src/getSceneHandler");
 const { getCapabilitiesHandler } = require("../src/getCapabilitiesHandler");
 const redirectTo = require("../src/redirectTo");
-const assets = require("../src/assets");
-const bb = require("../src/boundingbox");
 
 let router = express.Router();
 
-const checks = [
-  ...checkFactory.commonChecks(),
-  check("request")
-    .exists().withMessage("MissingParameterValue")
-    .customSanitizer(toLower)
-    .isIn(["getscene", "getcapabilities"]).withMessage("InvalidParameterValue")
-];
+const requestChecks = checkFactory.getChecksFor("request");
 
-router.route("/").get(checks, (req, res) => {
+router.route("/").get(requestChecks, (req, res) => {
 
   const errors = validationResult(req);
   if (!errors.isEmpty()) {
@@ -32,12 +23,7 @@ router.route("/").get(checks, (req, res) => {
 
 });
 
-const capabilitiesChecks = [
-  check("request")
-    .exists().withMessage("MissingParameterValue")
-    .customSanitizer(toLower)
-    .equals("getcapabilities").withMessage("InvalidParameterValue")
-];
+const capabilitiesChecks = checkFactory.getChecksFor("capabilities");
 
 router.route("/capabilities").get(capabilitiesChecks, (req, res) => {
 
@@ -52,15 +38,7 @@ router.route("/capabilities").get(capabilitiesChecks, (req, res) => {
 
 });
 
-const sceneChecks = [
-  check("boundingbox")
-    .exists().withMessage("MissingParameterValue")
-    .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue")
-    .custom(value => bb.isValid(value)).withMessage("InvalidParameterValue"),
-  check("layers")
-    .exists().withMessage("MissingParameterValue")
-    .custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer")
-];
+const sceneChecks = checkFactory.getChecksFor("scene");
 
 router.route("/scene").get(sceneChecks, (req, res) => {
 
diff --git a/src/validationCheckFactory.js b/src/validationCheckFactory.js
index f971efc..b2dd408 100644
--- a/src/validationCheckFactory.js
+++ b/src/validationCheckFactory.js
@@ -1,7 +1,6 @@
-const { check } = require("express-validator");
-const {toLower} = require("../src/customSanitizers");
+const { check, query } = require("express-validator");
+const { toLower, toUpper, boundingboxIsValid } = require("../src/customSanitizers");
 const assets = require("../src/assets");
-const bb = require("../src/boundingbox");
 
 const commonChecks = () => {
   return [
@@ -16,25 +15,46 @@ const commonChecks = () => {
 
 }
 
-const specificChecks = (parameter) => {
+const getChecksFor = (parameter) => {
 
   switch (parameter.toLowerCase()) {
-    case "getscene": {
+
+    case "request": {
       return [
-        check("boundingbox")
+        ...commonChecks(),
+        query("request")
           .exists().withMessage("MissingParameterValue")
-          .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue")
-          .custom(value => bb.isValid(value)).withMessage("InvalidParameterValue"),
-        check("layers")
+          .customSanitizer(toLower)
+          .isIn(["getscene", "getcapabilities"]).withMessage("InvalidParameterValue")
+      ];
+    }
+
+    case "scene": {
+      return [
+        query("crs")
           .exists().withMessage("MissingParameterValue")
-          .custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer")
+          .customSanitizer(toUpper)
+          .matches(/^EPSG:\d{4,5}$/).withMessage("InvalidParameterValue"),
+        query("layers")
+          .exists().withMessage("MissingParameterValue")
+          .custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer"),
+        query("boundingbox")
+          .optional()
+          .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue")
+          .custom(value => boundingboxIsValid(value)).withMessage("InvalidParameterValue")
       ];
     }
-    case "getcapabilities": {
-      return [];
+
+    case "capabilities": {
+      return [
+        query("request")
+          .exists().withMessage("MissingParameterValue")
+          .customSanitizer(toLower)
+          .equals("getcapabilities").withMessage("InvalidParameterValue")
+      ];
     }
   }
 
 }
 
-module.exports = { commonChecks, specificChecks };
\ No newline at end of file
+module.exports = { getChecksFor };
\ No newline at end of file
-- 
GitLab