From be207d7d036e8be1575dbc082a7ef740329eaaa2 Mon Sep 17 00:00:00 2001
From: athanasios <ath.kouk.oid@gmail.com>
Date: Wed, 15 Jul 2020 20:50:18 +0200
Subject: [PATCH] boundingbox now optional

---
 config.js                    |  3 ++-
 routes/v1.js                 | 14 +++++++-------
 src/assets.js                | 18 +++++++++++++++++-
 src/context.js               |  3 +--
 src/geographicBoundingBox.js |  1 +
 src/getSceneHandler.js       |  2 +-
 src/nodes.js                 |  6 ++++--
 7 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/config.js b/config.js
index c29eefe..229d311 100644
--- a/config.js
+++ b/config.js
@@ -1,5 +1,6 @@
 const config = {
-  port: 9000
+  port: 9000,
+  boundingBoxBufferPercent: 15
 }
 
 module.exports = config;
\ No newline at end of file
diff --git a/routes/v1.js b/routes/v1.js
index 2b8a791..c8890ef 100644
--- a/routes/v1.js
+++ b/routes/v1.js
@@ -1,10 +1,11 @@
 const express = require("express");
-const { check, validationResult, oneOf } = require("express-validator")
+const { check, validationResult } = require("express-validator")
 const { toLower } = require("../src/customSanitizers");
 const { errorHandler } = require("../src/errorHandler");
 const checkFactory = require("../src/validationCheckFactory");
 const { getSceneHandler } = require("../src/getSceneHandler");
 const { getCapabilitiesHandler } = require("../src/getCapabilitiesHandler");
+const assets = require("../src/assets");
 const bb = require("../src/boundingbox");
 const redirectTo = require("../src/redirectTo");
 
@@ -56,8 +57,11 @@ const sceneChecks = [
     .exists().withMessage("MissingParameterValue")
     .customSanitizer(toLower)
     .equals("getscene").withMessage("InvalidParameterValue"),
-  check("boundingbox")
+  check("layers")
     .exists().withMessage("MissingParameterValue")
+    .custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer"),
+  check("boundingbox")
+    .optional()
     .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue")
     .custom(value => bb.isValid(value)).withMessage("InvalidParameterValue"),
   check("cullingvolume")
@@ -74,11 +78,7 @@ const sceneChecks = [
     .matches(/^((\-?\d+(\.\d+)?),){1}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue"),
   check("time")
     .exists().withMessage("MissingParameterValue")
-    .matches(/\d+/).withMessage("InvalidParameterValue"),
-  check("intersect")
-    .exists().withMessage("MissingParameterValue")
-    .customSanitizer(toLower)
-    .isIn(["true", "false"]).withMessage("InvalidParameterValue")
+    .matches(/\d+/).withMessage("InvalidParameterValue")
 ];
 
 router.route("/scene").get(sceneChecks, (req, res) => {
diff --git a/src/assets.js b/src/assets.js
index 98017b6..30f1a6e 100644
--- a/src/assets.js
+++ b/src/assets.js
@@ -2,6 +2,22 @@ const fs = require("fs");
 const boxIntersect = require("box-intersect");
 const path = require('path');
 
+const getLayers = (layers) => {
+  return new Promise((resolve, reject) => {
+    fs.readFile("./assets/assets.json", (err, data) => {
+      if (err) {
+        reject();
+      }
+      let assets = JSON.parse(data);
+      let requestedLayers = layers.split(",");
+
+      assets = assets.filter(asset => requestedLayers.includes(asset.id));
+      assets = assets.filter(asset => asset.scope == "public");
+      resolve(assets);
+    });
+  });
+}
+
 const getIntersectingLayers = (bb, layers) => {
 
   return new Promise((resolve, reject) => {
@@ -124,4 +140,4 @@ const isPublic = (url) => {
 
 }
 
-module.exports = { getIntersectingLayers, getIntersecting, allLayersExist, getPublicLayers, isPublic };
\ No newline at end of file
+module.exports = { getIntersectingLayers, getIntersecting, allLayersExist, getPublicLayers, isPublic, getLayers };
\ No newline at end of file
diff --git a/src/context.js b/src/context.js
index 6e15ab8..d613551 100644
--- a/src/context.js
+++ b/src/context.js
@@ -12,8 +12,7 @@ const fromRequest = (req) => {
     camera: camera.fromString(req.query.camera),
     offCenterFrustum: offCenterFrustum.fromString(req.query.frustum),
     drawingBuffer: drawingBuffer.fromString(req.query.drawingbuffer),
-    requestTime: req.query.time,
-    intersect: JSON.parse(req.query.intersect.toLowerCase())
+    requestTime: req.query.time
   };
 
 }
diff --git a/src/geographicBoundingBox.js b/src/geographicBoundingBox.js
index 2d20803..5d39594 100644
--- a/src/geographicBoundingBox.js
+++ b/src/geographicBoundingBox.js
@@ -61,6 +61,7 @@ class GeographicBoundingBox {
 }
 
 const fromString = (str) => {
+  if(!str) return null;
   let tokens = str.split(",");
   return new GeographicBoundingBox(...tokens.map(token => parseFloat(token)));
 }
diff --git a/src/getSceneHandler.js b/src/getSceneHandler.js
index 2b4c696..045afdf 100644
--- a/src/getSceneHandler.js
+++ b/src/getSceneHandler.js
@@ -3,7 +3,7 @@ const Traverse = require("./traverse");
 
 const getSceneHandler = (req, res) => {
 
-  assets.getIntersecting(req.query.boundingbox).then(layers => {
+  assets.getLayers(req.query.layers).then(layers => {
 
     let traverse = new Traverse();
     traverse.begin(req, layers[0].url)
diff --git a/src/nodes.js b/src/nodes.js
index 454be1e..f034c34 100644
--- a/src/nodes.js
+++ b/src/nodes.js
@@ -1,3 +1,5 @@
+const config = require("../config");
+
 class Nodes {
 
   constructor() {
@@ -21,9 +23,9 @@ class Nodes {
       time: context.requestTime
     };
 
-    if (context.intersect) {
+    if (context.bb != null) {
       let requestedBB = context.bb.clone();
-      requestedBB.extend(25);
+      requestedBB.extend(config.boundingBoxBufferPercent);
       if (requestedBB.intersectWithGeographic(boundingSphere.geographicCenter)) {
         this.nodes.push(entry);
       }
-- 
GitLab