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
JavaScript
(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());
});
}());