gadael/gadael

View on GitHub
api/Headless.api.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

const apputil = require('../modules/apputil');

/**
 * App mock without http server
 * to run in spec tests or with command line tools
 */

var app = {};

exports = module.exports = app;

var mongoose = require('mongoose');
var config = require('../config')();

app.config = config;
app.mongoose = mongoose;

app.deferredDbConnect = {};
app.deferredDbConnect.promise = new Promise(function(resolve, reject) {
    app.deferredDbConnect.resolve = resolve;
    app.deferredDbConnect.reject = reject;
});


/**
 * Link app to database with mongodb connexion
 * @return {Promise}
 */
app.linkdbCreateConnection = function() {
    return new Promise((resolve, reject) => {
        if (undefined !== app.db) {
            //console.warn('Call on connect but app.db already initialized');
            app.deferredDbConnect.promise.then(resolve);
            return;
        }

        apputil(app);

        app.db = mongoose.createConnection('mongodb://' + config.mongodb.prefix + config.mongodb.dbname,
            { useNewUrlParser: true, useCreateIndex: true });
        app.db.on('error', reject);
        app.db.once('open', resolve);
    });
};

/**
 * Link app to database with mongodb connexion
 * @return {Promise}
 */
app.linkdb = function() {
    return app.linkdbCreateConnection()
    .then(() => {
        // indexation done
        app.deferredDbConnect.resolve(app.db.models);
        return true;
    })
    .catch(err => {
        // indexation fail
        console.log(err);
        app.deferredDbConnect.resolve(app.db.models);
        return true;
    });
};


/**
 * Connect to database and load models
 * call callback when models are loaded
 */
app.connect = function(callback) {

    if (app.db && Object.keys(app.db.models).length > 0) {
        throw new Error('Headless connect, models already loaded for db connexion');
    }

    return app.linkdbCreateConnection().then(() => {
        //config data models
        var models = require('../models');
        models.requirements = {
            mongoose: mongoose,
            db: app.db,
            autoIndex: true,
            removeIndex: false,
            embeddedSchemas: {},
            app: app
        };

        models.load()
        .then(() => {
            // indexation done
            app.deferredDbConnect.resolve(app.db.models);
            callback();
        })
        .catch(err => {
            // indexation fail
            console.log(err);
            app.deferredDbConnect.resolve(app.db.models);
            callback();
        });
    })
    .catch(console.error);
};

app.disconnect = function(callback) {

    if (undefined === app.db) {
        // already closed
        return callback();
    }

    app.mongoose.disconnect().then(() => {
        delete app.db;
        if (callback) {
            callback();
        }
    });
};


/**
 * Load a service
 *
 * @param {String} path
 *
 * @return {apiService}
 */
app.getService = function(path) {
    var apiservice = require('restitute').service;
    var getService = require('../api/services/'+path);
    return getService(apiservice, app);
};