Source: data-store/dbStore.js

'use strict';
/**
 * @module backend/dbStore
 */
const storage = require('electron-json-storage');
const moment = require('moment');
const _ = require('lodash');

let playerData = null;
let monsterData = {};
let npcData = {};

/**
 * @todo let highScore = 0;
 */


/**
 * Store Entity into JSON file.
 * 
 * @param {any} data 
 */
let storeEntity = function(data) {
    if (data.type === 'player') {
        playerData = data;
    } else if (data.type === 'monster') {
        monsterData[data.id] = data;
    } else if (data.type === 'npc') {
        npcData[data.id] = data;
    }
};

let autosave = function() {
    let entities = {
        player: playerData,
        monsters: monsterData,
        npc: npcData,
    };
    if (entities.player === null) return;
    // console.debug('Monsters:' + Object.keys(entities.monsters).length);
    // console.debug('NPC:' + Object.keys(entities.npc).length);
    storage.set('autosave.entities', entities, function(err) {
        if (err) throw err;
    });
};

let manualSave = function() {
    let entities = {
        player: playerData,
        monsters: monsterData,
        npc: npcData,
    };
    if (entities.player === null) return;

    let timestamp = moment().toISOString();
    let key = timestamp + '.entities';
    console.log('Saving entity to: ' + key);
    /**
     * NOTE(anand): There may be a problem with loading because the timestamp is urlencoded
     */
    storage.set(key, entities, function(err) {
        if (err) throw err;
    });
};


/**
 * Get the saved state keys.
 * 
 * @return {Promise}
 */
let getStates = function() {
    return new Promise(function(resolve, reject) {
        storage.keys((err, keys) => {
            if (err) {
                reject(err);
            }
            resolve(_.map(keys, (e, i) => {
                console.log('Found key: ' + e);
                /**
                 * The key is formatted such:
                 * <ISO8601 Timestamp>.entities
                 * 
                 * Here, I am getting the index of the dot before 'entities'
                 * and returning the timestamp
                 */
                return e.slice(0, e.indexOf('entities') - 1);
            }));
        });
    });
};

let loadState = function(key) {
    return new Promise(function(resolve, reject) {
        key = key + '.entities';
        console.log('Loading key: ' + key);
        storage.get(key, (err, data) => {
            if (err) reject(err);
            console.log('Loaded key: ' + key);
            // console.debug('Monsters:' + Object.keys(data.monsters).length);
            // console.debug('NPC:' + Object.keys(data.npc).length);
            resolve(data);
        });
    });
};

/**
 * Save game functions
 */
module.exports.storeEntity = storeEntity;
module.exports.autosave = autosave;
module.exports.manualSave = manualSave;

/**
 * Load game functions
 */
module.exports.loadState = loadState;
/**
 * Helper functions
 */
module.exports.getStates = getStates;