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 };