api/Headless.api.js
'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);
};