Source: models/configuration.js

/**
 * Model for accessing the core configuration
 * 
 * Database table: configuration
 * 
 */
class configurations {
    /**
     * @constructor
     * @param {object} logger logger to be used by class instance
     */
    constructor(logger) {
        // always initialize all instance properties
        this._logger = logger;
    }

    /**
     * Returns all configurations from core database table configuration
     * @param {function} callback rows or null
     */
    getAllConfigurations(callback) {
        let query = "SELECT * FROM configuration";
        global.coreDb.all(query, [], (err, rows) => {
            if (err) {
                return null;
            } else {
                return callback(rows);
            }
        });
    }

    /**
     * Returns configuration value for given configuration keyword
     * @param {string} keyword 
     * @param {function} callback returns value for keyword as string
     */
    getValueForKeyword(keyword, callback) {
        let query = "SELECT * FROM `configuration` WHERE keyword = ?";
        global.coreDb.all(query, [
            keyword
        ], (err, rows) => {
            if (err) {
                return null;
            } else {
                if (rows.length > 0) {
                    var value = rows[0]['value'];
                    return callback(value);
                } else {
                    return callback(null);
                }
                
            }
        });
    }

    /**
     * checks if a keyword exists in configuration table in core database
     * @param {string} keyword keyword for configuration setting
     * @param {*} callback success (true/false), rows (rows or null)
     */
    doesKeywordExists(keyword, callback) {
        let query = "SELECT * FROM configuration WHERE keyword = ?";
        global.coreDb.all(query, [
            keyword
        ], (err, rows) => {
            if (err) {
                return null;
            } else {
                if (rows.length > 0) {
                    return callback(true, rows);
                } else {
                    return callback(false, null);
                }
            }
        });
    }

    /**
     * Adds a new keyword/value pair to configuration table in core database
     * @param {string} keyword keyword of pair
     * @param {*} value value of pair
     * @param {*} callback success (true/false)
     */
    addKeywordAndValue(keyword, value, callback) {
        let query = "INSERT INTO configuration (keyword, value) VALUES (?, ?)";

        global.coreDb.run(query, [
            keyword,
            value,
        ], function (err) {
            if (err) {
                console.log('MODELS-CONFIGURATION | Error storing new key value pair to database: ' + err.message);
                callback(false);
            } else {
                callback(true);
            }
        });
    }


    /**
     * updates a value for given keyword in core database table configuration
     * @param {string} keyword keyword the value shall be updated for
     * @param {*} value value to set
     * @param {*} callback success (true / false)
     */
    updateValuesForKeyword(reqBody, callback) {
        var pairsCount = Object.keys(reqBody).length;
        if (pairsCount > 0) {
            var index = 1;
            global.coreDb.serialize(() => {
                for (var key in reqBody) {
                    if (reqBody.hasOwnProperty(key)) {
                        var value = reqBody[key];

                        let query = "INSERT OR REPLACE INTO configuration (id, keyword, value) VALUES ( " +
                            "(SELECT id FROM configuration WHERE keyword = ?), ?, ?);";

                        global.coreDb.run(query, [
                            key,
                            key,
                            value
                        ], function (err) {
                            if (err) {
                                console.log('MODELS-CONFIGURATION | Error updating key value pair to database: ' + err.message);
                            } else {
                                this.updateGlobals(key, value);
                                console.log('MODELS-CONFIGURATION | Successfully updated key / value in configuration');
                            }
                        }.bind(this));
                    };
                };
            });
            callback(true);
        } else {
            callback(false);
        };
    }

    /**
     * Updates global variables if configuration values change
     * @param {string} key 
     * @param {value} value 
     */
    updateGlobals(key, value) {
        
        if (key === 'instancename') {
            global.serverInstanceName = value;
            console.log('MODELS-CONFIGURATION | Successfully updated global.serverInstanceName');
        }
        
    }
}

module.exports = configurations;