storage.js 2.94 KB
Newer Older
Athanasios's avatar
Athanasios committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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;