aboutsummaryrefslogtreecommitdiff
path: root/src/legacy/jsonDb.js
blob: d2e8ca14ca7252894ba2c02645f207d21d35c65b (plain) (blame)
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
const fs = require('fs');
const path = require('path');
const config = require('../config');

const dbDir = config.dbDir;

const databases = {};

/**
 * @deprecated Only used for migrating legacy data
 */
class JSONDB {
  constructor(path, def = {}, useCloneByDefault = false) {
    this.path = path;
    this.useCloneByDefault = useCloneByDefault;

    this.load = new Promise(resolve => {
      fs.readFile(path, {encoding: 'utf8'}, (err, data) => {
        if (err) return resolve(def);

        let unserialized;
        try { unserialized = JSON.parse(data); }
        catch (e) { unserialized = def; }

        resolve(unserialized);
      });
    });
  }

  get(clone) {
    if (clone == null) clone = this.useCloneByDefault;

    return this.load.then(data => {
      if (clone) return JSON.parse(JSON.stringify(data));
      else return data;
    });
  }

  save(newData) {
    const serialized = JSON.stringify(newData);
    this.load = new Promise((resolve, reject) => {
      fs.writeFile(this.path, serialized, {encoding: 'utf8'}, () => {
        resolve(newData);
      });
    });

    return this.get();
  }
}

function getDb(dbName, def) {
  if (! databases[dbName]) {
    const dbPath = path.resolve(dbDir, `${dbName}.json`);
    databases[dbName] = new JSONDB(dbPath, def);
  }

  return databases[dbName];
}

function get(dbName, def) {
  return getDb(dbName, def).get();
}

function save(dbName, data) {
  return getDb(dbName, data).save(data);
}

module.exports = {
  get,
  save,
};