1 | var express = require('express');
|
2 | var morgan = require('morgan');
|
3 | var cookieParser = require('cookie-parser');
|
4 | var bodyParser = require('body-parser');
|
5 | var methodOverride = require('method-override');
|
6 | var ipaddr = require('ipaddr.js');
|
7 | var extend = require('extend');
|
8 | var domain = require('domain');
|
9 | var VError = require('verror');
|
10 |
|
11 | var log = require('./logger')('server');
|
12 | var db = require('./db');
|
13 | var messenger = require('./messenger');
|
14 | var AuthController = require('./controllers/AuthController');
|
15 | var router = require('./router');
|
16 | var defaultOptions = require('./defaultOptions');
|
17 | var emitter = require('./emitter');
|
18 | var errors = require('./errors');
|
19 |
|
20 | var userbaseDomain = domain.create();
|
21 |
|
22 |
|
23 |
|
24 |
|
25 |
|
26 | userbaseDomain.on('error', function(err) {
|
27 | log.fatal(err);
|
28 | process.exit(1);
|
29 | });
|
30 |
|
31 | morgan.token('user', function getId(req) {
|
32 | return req.user && req.user._id || '';
|
33 | });
|
34 |
|
35 | function init(app, options) {
|
36 | var morganFormat = morgan.combined.replace(':status', ':status :user');
|
37 |
|
38 | if (process.env.NODE_ENV === 'development') {
|
39 | morganFormat = 'dev';
|
40 | }
|
41 |
|
42 | app.use(morgan(morganFormat));
|
43 |
|
44 | app.use(bodyParser.json());
|
45 | app.use(bodyParser.urlencoded({
|
46 | extended: false
|
47 | }));
|
48 | app.use(methodOverride());
|
49 | app.use(cookieParser());
|
50 |
|
51 | if (options.ipv4) {
|
52 | addIPv4Middleware(app);
|
53 | }
|
54 |
|
55 |
|
56 | AuthController(app, options);
|
57 |
|
58 | process.nextTick(function() {
|
59 |
|
60 | addErrorMiddleware(app, options);
|
61 | });
|
62 | }
|
63 |
|
64 | function registerDbAdaptor(app, options, dbAdaptor) {
|
65 | return db(dbAdaptor).then(function() {
|
66 | app.listen(options.port);
|
67 | log.info('App listening on port', options.port);
|
68 | });
|
69 | }
|
70 |
|
71 | function registerMessageAdaptor(app, options, messageAdaptor) {
|
72 | return messenger(messageAdaptor);
|
73 | }
|
74 |
|
75 | function addIPv4Middleware(app) {
|
76 | app.use(function(req, res, next) {
|
77 | var ip = req.ip;
|
78 |
|
79 | Object.defineProperty(req, 'ip', {
|
80 | get: function() {
|
81 | return ip;
|
82 | },
|
83 | set: function(val) {
|
84 | ip = ipaddr.process(val).toString();
|
85 | }
|
86 | });
|
87 |
|
88 | req.ip = req.ip;
|
89 | next();
|
90 | });
|
91 | }
|
92 |
|
93 | function addErrorMiddleware(app, options) {
|
94 |
|
95 | app.use(function(req, res, next) {
|
96 | var err = new VError('Not Found');
|
97 | err.status = 404;
|
98 | next(err);
|
99 | });
|
100 |
|
101 | app.use(function(err, req, res, next) {
|
102 | (req.log || log).error(err);
|
103 |
|
104 | if (res.headersSent) {
|
105 | return next(err);
|
106 | }
|
107 |
|
108 | var data = options.apiEnvelope(null, err);
|
109 |
|
110 |
|
111 | res.status(err.status || err.statusCode || 500).send(data);
|
112 | });
|
113 | }
|
114 |
|
115 | function createUserbaseApp(options) {
|
116 | var app = express();
|
117 | options = extend(true, defaultOptions, options);
|
118 |
|
119 | init(app, options);
|
120 |
|
121 | exports.router = router(app, options);
|
122 | exports.registerDbAdaptor = registerDbAdaptor.bind(this, app, options);
|
123 | exports.registerMessageAdaptor = registerMessageAdaptor.bind(this, app, options);
|
124 | exports.apiEnvelope = options.apiEnvelope;
|
125 |
|
126 | return app;
|
127 | }
|
128 |
|
129 |
|
130 |
|
131 |
|
132 |
|
133 | exports = module.exports = userbaseDomain.bind(createUserbaseApp);
|
134 |
|
135 | exports.emitter = emitter;
|
136 | exports.errors = errors; |
\ | No newline at end of file |