From 9a2f0ed231e5d60e0c938a4304ee44e917a911c9 Mon Sep 17 00:00:00 2001
From: Athanasios <ath.kouk.oid@gmail.com>
Date: Sat, 17 Apr 2021 12:13:05 +0200
Subject: [PATCH] Complete service

---
 config.js             |  3 ++-
 routes/nodes.js       | 36 ++++++++++++++++++++++++++++++------
 routes/scenelayers.js |  2 +-
 src/attributes.js     | 19 +++++++++++++++++++
 src/default.js        | 10 +++-------
 src/features.js       | 10 +++-------
 src/geometries.js     | 10 +++-------
 src/handler.js        |  6 ++++--
 src/layer.js          |  9 ++-------
 src/shared.js         | 10 +++-------
 views/sceneLayers.pug |  2 +-
 11 files changed, 71 insertions(+), 46 deletions(-)
 create mode 100644 src/attributes.js

diff --git a/config.js b/config.js
index 3aab883..d2a7fad 100644
--- a/config.js
+++ b/config.js
@@ -4,8 +4,9 @@ module.exports = {
   FOLDER_INDEX: {
     SCENELAYER: "3dSceneLayer.json.gz",
     NODE: "3dNodeIndexDocument.json.gz",
+    SHARED: "sharedResource.json.gz",
     FEATURES: "0.json.gz",
     GEOMETRIES: "0.bin.gz",
-    SHARED: "sharedResource.json.gz"
+    ATTRIBUTES: "0.bin.gz"
   }
 };
\ No newline at end of file
diff --git a/routes/nodes.js b/routes/nodes.js
index d8a4c03..15d5f06 100644
--- a/routes/nodes.js
+++ b/routes/nodes.js
@@ -3,19 +3,43 @@ const getHandler = require('../src/handler');
 
 let router = express.Router();
 
-router.route("/").get((req, res) => {
+router.route("/:nodeid/?").get((req, res) => {
 
-  res.sendStatus(404);
-  res.end();
+  let param = req.params.nodeid;
+  let handler = getHandler(param);
+  handler(req, res);
+
+});
+
+router.route("/:nodeid/:resource").get((req, res) => {
+
+  let param = req.params.resource;
+  let handler = getHandler(param);
+  handler(req, res);
 
 });
 
-router.route("[/]?*/:leaf").get((req, res) => {
+router.route("/:nodeid/:resource/0").get((req, res) => {
 
-  let leaf = req.params.leaf;
-  let handler = getHandler(leaf);
+  let param = req.params.resource;
+  let handler = getHandler(param);
   handler(req, res);
 
 });
 
+router.route("/:nodeid/:resource/:resourceid/0").get((req, res) => {
+
+  let param = req.params.resource;
+  let handler = getHandler(param);
+  handler(req, res);
+
+});
+
+router.route("*").get((req, res) => {
+
+  res.sendStatus(404);
+  res.end();
+
+});
+
 module.exports = router;
\ No newline at end of file
diff --git a/routes/scenelayers.js b/routes/scenelayers.js
index a0c2f5b..5ed3954 100644
--- a/routes/scenelayers.js
+++ b/routes/scenelayers.js
@@ -22,7 +22,7 @@ router.route("/").get((req, res) => {
 
 });
 
-router.route("/:layer").get((req, res) => {
+router.route("/:layer/layers/0").get((req, res) => {
 
   let handler = getHandler("layer");
   handler(req, res);
diff --git a/src/attributes.js b/src/attributes.js
new file mode 100644
index 0000000..dcb3789
--- /dev/null
+++ b/src/attributes.js
@@ -0,0 +1,19 @@
+const config = require('../config');
+const fs = require('fs');
+
+const handle = (req, res) => {
+
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${req.params.resourceid}/${config.FOLDER_INDEX.ATTRIBUTES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
+
+  res.set({
+    'Content-Disposition': 'attachment; filename=0.bin',
+    'Content-Type': 'application/octet-stream',
+    'Content-Encoding': 'gzip'
+  });
+  res.sendFile(resourse);
+
+};
+
+module.exports = handle;
\ No newline at end of file
diff --git a/src/default.js b/src/default.js
index e8d4fa2..b9a1100 100644
--- a/src/default.js
+++ b/src/default.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.NODE}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let originalUrl = req.originalUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${originalUrl}/${config.FOLDER_INDEX.NODE}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/features.js b/src/features.js
index 545e3c3..dd3e731 100644
--- a/src/features.js
+++ b/src/features.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.FEATURES}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.FEATURES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/geometries.js b/src/geometries.js
index a9182dd..c2bafda 100644
--- a/src/geometries.js
+++ b/src/geometries.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.GEOMETRIES}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.GEOMETRIES}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Disposition': 'attachment; filename=0.bin',
diff --git a/src/handler.js b/src/handler.js
index dd5c68b..73554cd 100644
--- a/src/handler.js
+++ b/src/handler.js
@@ -1,15 +1,17 @@
 const _default_ = require('./default');
+const shared = require('./shared');
 const features = require('./features');
 const geometries = require('./geometries');
-const shared = require('./shared');
+const attributes = require('./attributes');
 const layer = require('./layer');
 const layers = require('./layers');
 
 const handlers = {
   _default_: _default_,
+  shared: shared,
   features: features,
   geometries: geometries,
-  shared: shared,
+  attributes: attributes,
   layer: layer,
   layers: layers
 }
diff --git a/src/layer.js b/src/layer.js
index 66bb183..b6d5d3b 100644
--- a/src/layer.js
+++ b/src/layer.js
@@ -3,13 +3,8 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}/scenelayers/${req.params.layer}/${config.FOLDER_INDEX.SCENELAYER}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let resourse = `${config.BASE_DIR}/scenelayers/${req.params.layer}/layers/0/${config.FOLDER_INDEX.SCENELAYER}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/src/shared.js b/src/shared.js
index 2fa08a2..bb98e79 100644
--- a/src/shared.js
+++ b/src/shared.js
@@ -3,13 +3,9 @@ const fs = require('fs');
 
 const handle = (req, res) => {
 
-  let resourse = `${config.BASE_DIR}${req.originalUrl}/${config.FOLDER_INDEX.SHARED}`;
-
-  if (!fs.existsSync(resourse)) {
-    res.sendStatus(404);
-    res.end();
-    return;
-  }
+  let baseUrl = req.baseUrl.replace(/^\/?|\/?$/g, "");
+  let resourse = `${config.BASE_DIR}/${baseUrl}/${req.params.nodeid}/${req.params.resource}/${config.FOLDER_INDEX.SHARED}`;
+  if (!fs.existsSync(resourse)) throw new Error("not found");
 
   res.set({
     'Content-Type': 'application/json',
diff --git a/views/sceneLayers.pug b/views/sceneLayers.pug
index 4abe407..c338603 100644
--- a/views/sceneLayers.pug
+++ b/views/sceneLayers.pug
@@ -7,4 +7,4 @@ style.
 ul
   each layer in layers
     li
-      a(href=`${layer}`)= layer
\ No newline at end of file
+      a(href=`${layer}/layers/0`)= layer
\ No newline at end of file
-- 
GitLab