UNPKG

acha-framework

Version:

is a modular framework on both client (angular.js) and server (node.js) side, it provides security, orm, ioc, obfuscation and ...

184 lines 6.79 kB
(function (undefined) { Ioc.define('backend.engine', [ 'backend.configuration', 'backend.authentication', 'backend.localize', 'backend.ssl', 'backend.errorHandler', 'backend.controllers.i18n', 'backend.controllers.account', 'backend.controllers.configuration', 'backend.controllers.captcha' ], function (provide, config, authentication, localize, ssl, errorHandler, i18nController, accountController, configurationController, captchaController) { const viewsPath = PATH.resolve(config.rootDirectory, 'views'); const AchaEngine = function () { this.express = require('express'); this.publics = []; this.middlewares = []; this.routes = []; this.allowedDomains = [ 'http://gravatar.com', 'http://google.com' ]; this.allowedMethods = [ 'GET', 'PUT', 'POST', 'DELETE', 'HEAD' ]; this.allowedHeaders = [ 'X-Requested-With', 'Accept', 'Origin', 'Referer', 'User-Agent', 'Content-Type', 'Authorization' ]; }; AchaEngine.prototype.addMiddleware = function (middleware) { this.middlewares.push(middleware); }; AchaEngine.prototype.addRoute = function (route) { this.routes.push(route); }; AchaEngine.prototype.addPublicFolder = function (folder) { this.publics.push(folder); }; AchaEngine.prototype.init = function () { const self = this; const useragent = require('express-useragent'); const logger = require('morgan'); const helmet = require('helmet'); const compression = require('compression'); const i18n = require('i18n'); const bodyParser = require('body-parser'); const cookieParser = require('cookie-parser'); const passport = require('passport'); const GoogleStrategy = require('passport-google-oauth2').Strategy; const FacebookTokenStrategy = require('passport-facebook-token'); const mate = require('ejs-mate'); return Q.Promise(function (resolve, reject) { i18n.configure({ locales: config.i18n.allowed, defaultLocale: config.i18n.def, directory: PATH.resolve(config.rootDirectory, 'locals') }); if (config.oauth.google.web.clientId) { passport.use(new GoogleStrategy({ clientID: config.oauth.google.web.clientId, clientSecret: config.oauth.google.web.clientSecret, callbackURL: config.oauth.google.web.callback, passReqToCallback: true }, function (request, accessToken, refreshToken, profile, done) { authentication.createUserFromOAuth(profile, function (err, user) { done(err, user); }); })); } if (config.oauth.facebook.web.clientId) { passport.use(new FacebookTokenStrategy({ clientID: config.oauth.facebook.web.clientId, clientSecret: config.oauth.facebook.web.clientSecret, callbackURL: config.oauth.facebook.web.callback }, function (accessToken, refreshToken, profile, done) { authentication.createUserFromOAuth(profile, function (err, user) { done(err, user); }); })); } self.app = self.express(); self.app.disable('x-powered-by'); self.app.use(helmet()); self.app.use(compression({ filter: function (req, res) { if (req.headers['x-no-compression']) { // don't compress responses with this request header return false; } // fallback to standard filter function return compression.filter(req, res); } })); self.app.use(i18n.init); self.app.use(useragent.express()); self.app.use(logger('combined', { skip: function (req, res) { return config.debug ? false : res.statusCode < 400; } })); self.app.use(bodyParser.urlencoded({ extended: false })); self.app.use(bodyParser.json()); self.app.use(cookieParser()); self.app.use(passport.initialize()); self.app.use(function (req, res, next) { res.header('Access-Control-Allow-Origin', self.allowedDomains.join(', ')); res.header('Access-Control-Allow-Methods', self.allowedMethods.join(', ')); res.header('Access-Control-Allow-Headers', self.allowedHeaders.join(', ')); if ('OPTIONS' === req.method) { res.send(200); } else { next(); } }); self.app.use(function (req, res, next) { var info = localize.cultureInfo(req, res); res.locals.lang = info.lang; res.locals.dir = info.dir; res.locals.rtl = info.rtl; res.locals.title = i18n.__('application.title'); res.locals.req = req; res.locals.config = config; next(); }); self.app.engine('ejs', mate); FSX.ensureDirSync(viewsPath); self.app.set('views', viewsPath); self.app.set('view engine', 'ejs'); self.addDefaultRoutes(); resolve(); }); }; AchaEngine.prototype.drawConsole = function () { 'use strict'; console.log('app is running on ', config.backend.address, ':', config.backend.port); }; AchaEngine.prototype.addDefaultRoutes = function () { i18nController.install(this.app); accountController.install(this.app); captchaController.install(this.app); configurationController.install(this.app); }; AchaEngine.prototype.bind = function () { const self = this; const http = require('http'); return Q.Promise(function (resolve, reject) { self.publics.unshift({ path: PATH.resolve(__dirname, 'public') }); self.publics.forEach(function (item) { self.app.use(self.express.static(item.path, item.options)); }); self.middlewares.forEach(function (item) { self.app.use(item); }); self.routes.forEach(function (item) { const params = [item.path]; (item.middlewares || []).forEach(function (middle) { params.push(middle); }); params.push(item.action); self.app[item.method].apply(self.app, params); }); self.app.use(errorHandler); http.createServer(self.app).listen(config.backend.port, config.backend.address); if (config.backend.ssl) { ssl(self.app).then(self.drawConsole); } else { self.drawConsole(); } resolve(); }); }; provide(new AchaEngine()); }); }());