Commit c7d97741 authored by Athanasios's avatar Athanasios
Browse files

add base storage

parent 08028c98
const config = { const config = {
port: 9000 port: 9000,
storage: {
type: "JSON",
path: "./assets/assets.json"
}
} }
module.exports = config; module.exports = config;
\ No newline at end of file
const express = require("express"); const express = require("express");
const path = require("path"); const path = require("path");
const assets = require("../src/assets"); const BaseStorage = require('../src/baseStorage');
const storage = new BaseStorage().getInstance();
let router = express.Router(); let router = express.Router();
...@@ -8,7 +10,7 @@ router.route("/*") ...@@ -8,7 +10,7 @@ router.route("/*")
.get((req, res, next) => { .get((req, res, next) => {
let fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`; let fullUrl = `${req.protocol}://${req.get("host")}${req.originalUrl}`;
assets.isPublic(fullUrl).then(result => { storage.isPublic(fullUrl).then(result => {
if (result) { if (result) {
next(); next();
} else { } else {
......
const fs = require("fs");
const boxIntersect = require("box-intersect");
const path = require('path');
const getLayers = (layers, boundingbox) => {
if (boundingbox === undefined) {
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);
});
});
} else {
return getIntersectingLayers(layers, boundingbox);
}
}
const getIntersectingLayers = (layers,bb) => {
return new Promise((resolve, reject) => {
fs.readFile("./assets/assets.json", (err, data) => {
if (err) {
reject();
}
let assets = JSON.parse(data);
let requestedBB = bb.split(",").map(token => parseFloat(token));
let requestedLayers = layers.split(",");
assets = assets.filter(asset => requestedLayers.includes(asset.id));
assets = assets.filter(asset => asset.scope == "public");
assets = assets.filter(asset => {
let overlaps = boxIntersect([
[...asset.boundingbox],
[...requestedBB]
]);
if (overlaps.length > 0) {
return true;
}
return false;
});
resolve(assets);
});
});
}
const allLayersExist = (layers) => {
if (!layers) return Promise.reject();
return new Promise((resolve, reject) => {
fs.readFile("./assets/assets.json", (err, data) => {
if (err) {
reject();
}
let assets = JSON.parse(data);
layers = layers.split(",");
layers.forEach(layer => {
if (assets.findIndex(asset => asset.id == layer) == -1) {
reject();
}
});
resolve();
});
});
}
const getPublicLayers = () => {
return new Promise((resolve, reject) => {
fs.readFile("./assets/assets.json", (err, data) => {
let assets = JSON.parse(data);
assets = assets.filter(asset => asset.scope == "public");
resolve(assets);
});
});
}
const isPublic = (url) => {
return new Promise((resolve, reject) => {
fs.readFile("./assets/assets.json", (err, data) => {
let assets = JSON.parse(data);
assets = assets.filter(asset => {
let parentDir = path.dirname(asset.url);
return !path.relative(parentDir, url).startsWith("..");
});
if (assets.length == 0) {
resolve(false);
return;
}
if (!assets[0].scope == "public") {
resolve(false);
return;
}
resolve(true);
});
});
}
module.exports = { getLayers, allLayersExist, getPublicLayers, isPublic };
\ No newline at end of file
const config = require("../config");
const { createStorage } = require("./storageFactory");
class BaseStorage {
constructor(storage) {
this.storage = storage;
}
getLayers(ids, boundingbox) {
return this.storage.getLayers(ids, boundingbox);
}
getPublicLayers() {
return this.storage.getPublicLayers();
}
isPublic(url) {
return this.storage.isPublic(url);
}
validateLayers(ids) {
return this.storage.validateLayers(ids);
}
}
class BaseStorageInstance {
constructor() {
if (!BaseStorageInstance.instance) {
const storage = createStorage(config.storage);
BaseStorageInstance.instance = new BaseStorage(storage)
}
}
getInstance() {
return BaseStorageInstance.instance;
}
}
module.exports = BaseStorageInstance;
\ No newline at end of file
const assets = require("../src/assets");
const pug = require("pug"); const pug = require("pug");
const BaseStorage = require('./baseStorage');
const storage = new BaseStorage().getInstance();
const getCapabilitiesHandler = (req, res) => { const getCapabilitiesHandler = (req, res) => {
assets.getPublicLayers().then(layers => { storage.getPublicLayers().then(layers => {
const compiledFunction = pug.compileFile("./views/capabilities.pug"); const compiledFunction = pug.compileFile("./views/capabilities.pug");
let capabilities = compiledFunction({ layers: layers }); let capabilities = compiledFunction({ layers: layers });
......
const assets = require("../src/assets"); const BaseStorage = require('./baseStorage');
const storage = new BaseStorage().getInstance();
const getSceneHandler = (req, res) => { const getSceneHandler = (req, res) => {
assets.getLayers(req.query.layers, req.query.boundingbox).then(layers => { storage.getLayers(req.query.layers, req.query.boundingbox).then(layers => {
layers = layers.map(layer => { layers = layers.map(layer => {
delete layer.scope; delete layer.scope;
......
const fs = require("fs");
const boxIntersect = require("box-intersect");
const path = require('path');
class JSONStorage {
constructor(path) {
this.path = path;
}
getLayers(ids, boundingbox) {
if (boundingbox === undefined) {
return new Promise((resolve, reject) => {
fs.readFile(this.path, (err, data) => {
if (err) {
reject();
}
let assets = JSON.parse(data);
let requestedLayers = ids.split(",");
assets = assets.filter(asset => requestedLayers.includes(asset.id));
assets = assets.filter(asset => asset.scope == "public");
resolve(assets);
});
});
} else {
return this.getIntersectingLayers(ids, boundingbox);
}
}
getPublicLayers() {
return new Promise((resolve, reject) => {
fs.readFile(this.path, (err, data) => {
let assets = JSON.parse(data);
assets = assets.filter(asset => asset.scope == "public");
resolve(assets);
});
});
}
isPublic(url) {
return new Promise((resolve, reject) => {
fs.readFile(this.path, (err, data) => {
let assets = JSON.parse(data);
assets = assets.filter(asset => {
let parentDir = path.dirname(asset.url);
return !path.relative(parentDir, url).startsWith("..");
});
if (assets.length == 0) {
resolve(false);
return;
}
if (!assets[0].scope == "public") {
resolve(false);
return;
}
resolve(true);
});
});
}
validateLayers(ids) {
if (!ids) return Promise.reject();
return new Promise((resolve, reject) => {
fs.readFile(this.path, (err, data) => {
if (err) {
reject();
}
let assets = JSON.parse(data);
let layers = ids.split(",");
layers.forEach(layer => {
if (assets.findIndex(asset => asset.id == layer) == -1) {
reject();
}
});
resolve();
});
});
}
getIntersectingLayers(ids, bb) {
return new Promise((resolve, reject) => {
fs.readFile(this.path, (err, data) => {
if (err) {
reject();
}
let assets = JSON.parse(data);
let requestedBB = bb.split(",").map(token => parseFloat(token));
let requestedLayers = ids.split(",");
assets = assets.filter(asset => requestedLayers.includes(asset.id));
assets = assets.filter(asset => asset.scope == "public");
assets = assets.filter(asset => {
let overlaps = boxIntersect([
[...asset.boundingbox],
[...requestedBB]
]);
if (overlaps.length > 0) {
return true;
}
return false;
});
resolve(assets);
});
});
}
}
module.exports = JSONStorage;
\ No newline at end of file
const JSONStorage = require("./storage");
const createStorage = (params) => {
switch (params.type) {
case "JSON": {
return new JSONStorage(params.path);
}
}
}
module.exports = {createStorage};
\ No newline at end of file
const { query } = require("express-validator"); const { query } = require("express-validator");
const { toLower, toUpper, boundingboxIsValid } = require("../src/customSanitizers"); const { toLower, toUpper, boundingboxIsValid } = require("../src/customSanitizers");
const assets = require("../src/assets"); const BaseStorage = require('./baseStorage');
const storage = new BaseStorage().getInstance();
const commonChecks = () => { const commonChecks = () => {
return [ return [
...@@ -37,7 +39,7 @@ const getChecksFor = (parameter) => { ...@@ -37,7 +39,7 @@ const getChecksFor = (parameter) => {
.matches(/^EPSG:\d{4,5}$/).withMessage("InvalidParameterValue"), .matches(/^EPSG:\d{4,5}$/).withMessage("InvalidParameterValue"),
query("layers") query("layers")
.exists().withMessage("MissingParameterValue") .exists().withMessage("MissingParameterValue")
.custom(value => assets.allLayersExist(value)).withMessage("UnknownLayer"), .custom(value => storage.validateLayers(value)).withMessage("UnknownLayer"),
query("boundingbox") query("boundingbox")
.optional() .optional()
.matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue") .matches(/^((\-?\d+(\.\d+)?),){3}(\-?\d+(\.\d+)?)$/).withMessage("InvalidParameterValue")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment