NodeBB/NodeBB

View on GitHub
install/databases.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

const prompt = require('prompt');
const winston = require('winston');

const questions = {
    redis: require('../src/database/redis').questions,
    mongo: require('../src/database/mongo').questions,
    postgres: require('../src/database/postgres').questions,
};

module.exports = async function (config) {
    winston.info(`\nNow configuring ${config.database} database:`);
    const databaseConfig = await getDatabaseConfig(config);
    return saveDatabaseConfig(config, databaseConfig);
};

async function getDatabaseConfig(config) {
    if (!config) {
        throw new Error('invalid config, aborted');
    }

    if (config.database === 'redis') {
        if (config['redis:host'] && config['redis:port']) {
            return config;
        }
        return await prompt.get(questions.redis);
    } else if (config.database === 'mongo') {
        if ((config['mongo:host'] && config['mongo:port']) || config['mongo:uri']) {
            return config;
        }
        return await prompt.get(questions.mongo);
    } else if (config.database === 'postgres') {
        if (config['postgres:host'] && config['postgres:port']) {
            return config;
        }
        return await prompt.get(questions.postgres);
    }
    throw new Error(`unknown database : ${config.database}`);
}

function saveDatabaseConfig(config, databaseConfig) {
    if (!databaseConfig) {
        throw new Error('invalid config, aborted');
    }

    // Translate redis properties into redis object
    if (config.database === 'redis') {
        config.redis = {
            host: databaseConfig['redis:host'],
            port: databaseConfig['redis:port'],
            password: databaseConfig['redis:password'],
            database: databaseConfig['redis:database'],
        };

        if (config.redis.host.slice(0, 1) === '/') {
            delete config.redis.port;
        }
    } else if (config.database === 'mongo') {
        config.mongo = {
            host: databaseConfig['mongo:host'],
            port: databaseConfig['mongo:port'],
            username: databaseConfig['mongo:username'],
            password: databaseConfig['mongo:password'],
            database: databaseConfig['mongo:database'],
            uri: databaseConfig['mongo:uri'],
        };
    } else if (config.database === 'postgres') {
        config.postgres = {
            host: databaseConfig['postgres:host'],
            port: databaseConfig['postgres:port'],
            username: databaseConfig['postgres:username'],
            password: databaseConfig['postgres:password'],
            database: databaseConfig['postgres:database'],
            ssl: databaseConfig['postgres:ssl'],
        };
    } else {
        throw new Error(`unknown database : ${config.database}`);
    }

    const allQuestions = questions.redis.concat(questions.mongo).concat(questions.postgres);
    for (let x = 0; x < allQuestions.length; x += 1) {
        delete config[allQuestions[x].name];
    }

    return config;
}