tantalim/tantalim-server

View on GitHub
app/services/pageService.js

Summary

Maintainability
B
4 hrs
Test Coverage
'use strict';

var logger = require('../logger/default').main,
    BluebirdPromise = require('bluebird'),
    fs = BluebirdPromise.promisifyAll(require('fs')),
    mkdirp = require('mkdirp'),
    errors = require('../errors'),
    pageCompiler = require('./pageCompiler'),
    modelCompiler = require('./modelCompiler'),
    menuCompiler = require('./menuCompiler');

var ARTIFACT = {
    TABLE: 'table',
    MODEL: 'model',
    PAGE: 'page',
    MENU: 'menu'
};

function getArtifactDirectory(moduleName) {
    if (moduleName && moduleName !== 'local') {
        return 'tantalim_modules/' + moduleName + '/';
    }
    return '';
}

function getRawArtifactFromSrc(artifactType, moduleName, artifactName) {
    logger.debug('getRawArtifactFromSrc ', artifactType, moduleName, artifactName);
    return new BluebirdPromise(function (resolve, reject) {
        // TODO Double check variables for injection
        var file = getArtifactDirectory(moduleName) + 'src/' + artifactType + 's/' + artifactName + '.json';

        logger.debug('reading file from ' + file);
        return fs.readFileAsync(file, 'utf8')
            .then(function (data) {
                var jsonData = JSON.parse(data);
                jsonData.name = artifactName;
                jsonData.moduleName = moduleName;
                logger.debug('resolving %s data for %s', artifactType, artifactName);
                resolve(jsonData);
            })
            .catch(function(err) {
                errors.addTrace(err, {
                    method: 'getRawArtifactFromSrc',
                    filename: __filename,
                    params: [artifactType, moduleName, artifactName]
                });
                reject(err);
            });
    });
}


function getArtifactFromSrc(artifactType, moduleName, artifactName) {
    return new BluebirdPromise(function (resolve, reject) {
        return getRawArtifactFromSrc(artifactType, moduleName, artifactName)
            .then(function(jsonData) {
                switch (artifactType) {
                    case ARTIFACT.MODEL:
                        modelCompiler.compile(jsonData)
                            .then(resolve)
                            .catch(reject);
                        break;
                    case ARTIFACT.MENU:
                        menuCompiler.compile(jsonData)
                            .then(resolve)
                            .catch(reject);
                        break;
                    case ARTIFACT.PAGE:
                        pageCompiler.compile(jsonData)
                            .then(resolve)
                            .catch(reject);
                        break;

                    default:
                        resolve(jsonData);
                }
            })
            .catch(function(err) {
                errors.addTrace(err, {
                    method: 'getArtifactFromSrc',
                    filename: __filename,
                    params: [artifactType, moduleName, artifactName]
                });
                reject(err);
            });
    });
}

function getArtifactFromCache(artifactType, moduleName, artifactName) {
    // TODO Double check variables for injection
    return new BluebirdPromise(function (resolve, reject) {
        var file = getArtifactDirectory() + 'dist/' + artifactType + 's/' + artifactName + '.json';
        logger.debug('reading file from ' + file);
        return fs.readFileAsync(file, 'utf8')
            .then(function (data) {
                resolve(JSON.parse(data));
            })
            .catch(function () {
                logger.debug('catch getArtifactFromCache');
                return getArtifactFromSrc(artifactType, moduleName, artifactName)
                    .then(function (data) {
                        mkdirp(getArtifactDirectory(), function (err) {
                            if (err) throw err;
                            fs.writeFile(file, JSON.stringify(data), function (err) {
                                if (err) throw err;
                                console.log('saved file');
                            });
                        });
                        resolve(data);
                    })
                    .catch(function(err) {
                        errors.addTrace(err, {
                            method: 'getArtifactFromCache',
                            filename: __filename
                        });
                        reject(err);
                    });
            });
    });
}

function getModuleName() {
    return new BluebirdPromise(function (resolve) {
        // This is the only one we support right now
        //resolve('tantalim-ide');
        resolve('local');
    });
}

function getDefinition(artifactType, artifactName) {
    //console.log('getDefinition %s %s', artifactType, artifactName);
    if (artifactName === undefined) {
        throw Error('Failed to get undefined ' + artifactType);
    }
    var useCache = false; // For dev, turn if off
    return new BluebirdPromise(function (resolve, reject) {
        logger.debug('------------------------------------');
        logger.debug('getDefinition for ' + artifactType + ':' + artifactName);
        getModuleName(artifactType, artifactName)
            .then(function (moduleName) {
                logger.debug('getDefinition for ' + moduleName + '/' + artifactName);
                switch (artifactType) {
                    case ARTIFACT.MODEL:
                        if (useCache) {
                            // Models get compiled and cached, so check there first
                            return getArtifactFromCache(artifactType, moduleName, artifactName);
                        } else {
                            return getArtifactFromSrc(artifactType, moduleName, artifactName);
                        }
                        break;
                    default :
                        // All other artifact types don't get compiled, so go directly to src
                        return getArtifactFromSrc(artifactType, moduleName, artifactName);
                }
            })
            .then(resolve)
            .catch(function(err) {
                errors.addTrace(err, {
                    method: 'getDefinition',
                    filename: __filename,
                    params: [artifactType, artifactName]
                });
                reject(err);
            });
    });
}

exports.ARTIFACT = ARTIFACT;
exports.getRawArtifactFromSrc = getRawArtifactFromSrc;
exports.getDefinition = getDefinition;