haroldtreen/epub-press

View on GitHub
lib/database.js

Summary

Maintainability
A
0 mins
Test Coverage
F
26%
const path = require('path');

const Sequelize = require('sequelize');
const { Client } = require('pg');
const Umzug = require('umzug');

const env = process.env.NODE_ENV || 'development';
const DEFAULT_CONFIG = require('../config/config')[env];

class Database {
    constructor(config) {
        this.config = config || DEFAULT_CONFIG;
        this.SequelizeDb = Database.createSeqelize(config);
    }

    static createSeqelize(config = DEFAULT_CONFIG) {
        if (config.use_env_variable) {
            return new Sequelize(process.env[config.use_env_variable]);
        }
        return new Sequelize(config.database, config.username, config.password, config);
    }

    isAvailable() {
        if (this.isSqlite()) {
            return Promise.resolve(true);
        }

        return this.SequelizeDb.authenticate()
            .then(() => true)
            .catch(() => false);
    }

    createDatabase(dbName) {
        if (this.isSqlite()) {
            return Promise.resolve();
        }

        return new Promise((resolve, reject) => {
            const { username, password, host } = this.config;
            this.client = new Client({
                user: username,
                password,
                host,
                database: 'postgres',
            });
            this.client.connect();
            this.client.query(`CREATE DATABASE ${dbName}`, (err) => {
                this.client.end();
                if (err && err.message.toLowerCase().includes('exists')) {
                    resolve();
                } else {
                    reject(err);
                }
            });
        });
    }

    disconnect() {
        if (this.client) {
            this.client.end();
        }
        this.SequelizeDb.close();
    }

    migrate() {
        const umzug = new Umzug({
            storage: 'sequelize',

            storageOptions: {
                sequelize: this.SequelizeDb,
            },

            migrations: {
                params: [this.SequelizeDb.getQueryInterface()],
                path: path.join(__dirname, '../migrations'),
            },
        });

        return umzug.up();
    }

    isSqlite() {
        return this.config.dialect === 'sqlite';
    }
}

module.exports = Database;