-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
120 lines (111 loc) · 4.58 KB
/
Copy pathindex.js
File metadata and controls
120 lines (111 loc) · 4.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import Fs from 'fs';
import Path from 'path';
import Http from 'http';
import SwaggerTools from 'swagger-tools';
import Jsyaml from 'js-yaml';
import Express from 'express';
import Mongoose from 'mongoose';
import IncludeAll from 'include-all';
import Passport from 'passport';
import Logger from 'morgan';
import BodyParser from 'body-parser';
import CookieParser from 'cookie-parser';
import ExpressSession from 'express-session';
import Cors from 'cors';
import Helmet from 'helmet';
import ConnectMongo from 'connect-mongo';
import HttpStatus from 'http-status';
import bluebird from 'bluebird';
import { config } from 'dotenv';
import Health from 'gorillab-health';
import APIError from './helpers/APIError';
import mongooseDefaultFields from './middlewares/mongooseDefaultFields';
import mongooseDefaultIndexes from './middlewares/mongooseDefaultIndexes';
import mongooseDocExtend from './middlewares/mongooseDocExtend';
import mongooseDocMethodsOverride from './middlewares/mongooseDocMethodsOverride';
// Load .env
config();
// Mongoose config
Mongoose.Promise = bluebird;
Mongoose.plugin(mongooseDefaultFields);
Mongoose.plugin(mongooseDefaultIndexes);
Mongoose.plugin(mongooseDocExtend);
Mongoose.plugin(mongooseDocMethodsOverride);
// Connect mongo
const mongoUrl = `mongodb://${process.env.DB_HOST}:${process.env.DB_PORT}/${process.env.DB_NAME}?reconnectTries=10&reconnectInterval=3000`;
Mongoose.connect(mongoUrl);
Mongoose.connection.on('open', () => {
// Bootstrap mongoose models
const models = IncludeAll({
dirname: Path.join(__dirname, './models'),
filter: /^[^.].*\.js$/,
}) || {};
Object.keys(models).forEach((key) => {
if (models[key].model) {
models[key].model();
}
});
// Initialize the Swagger middleware
SwaggerTools.initializeMiddleware(Jsyaml.safeLoad(Fs.readFileSync(Path.join(__dirname, '/api/swagger.yaml'), 'utf8')), (middleware) => {
// Init the server
const app = Express();
// Use gorillab health check
app.use(Health());
app.use(Logger('combined'));
app.use(CookieParser());
app.use(BodyParser.json({ limit: '1mb' }));
app.use(BodyParser.urlencoded({ extended: true }));
app.use(ExpressSession({
name: process.env.APP_NAME,
secret: process.env.SESSION_SECRET,
cookie: {
path: '/',
httpOnly: true,
secure: false,
maxAge: 86400000,
},
resave: false,
saveUninitialized: true,
rolling: true,
store: new (ConnectMongo(ExpressSession))({
mongooseConnection: Mongoose.connection,
}),
}));
app.use(Passport.initialize());
app.use(Passport.session());
require('./middlewares/authStrategies')(app, Passport); // eslint-disable-line global-require
app.use(Cors());
app.use(Helmet());
app.use(middleware.swaggerMetadata()); // Interpret Swagger resources
app.use(middleware.swaggerValidator()); // Validate Swagger requests
app.use(middleware.swaggerRouter({ // Route validated requests
swaggerUi: Path.join(__dirname, '/swagger.json'),
controllers: Path.join(__dirname, './controllers'),
useStubs: process.env.NODE_ENV === 'development',
}));
app.use(middleware.swaggerUi()); // Swagger UI
app.use((req, res, next) => next(new APIError('API not found', HttpStatus.NOT_FOUND)));
app.use((err, req, res, next) => { // eslint-disable-line
console.log(err.stack); // eslint-disable-line no-console
const errorResponse = {
message: err.isPublic ? err.message : HttpStatus[err.status],
stack: process.env.NODE_ENV === 'development' ? err.stack : undefined,
};
res.status(err.status || HttpStatus.INTERNAL_SERVER_ERROR).json(errorResponse);
});
// Start the server
Http.createServer(app).listen(process.env.PORT, process.env.HOST, () => {
console.log(`Your server is running at http://${process.env.HOST}:${process.env.PORT}`); // eslint-disable-line no-console
console.log(`Swagger-ui is available at http://${process.env.HOST}:${process.env.PORT}/docs`); // eslint-disable-line no-console
});
});
});
// Mongoose connection error handler
Mongoose.connection.on('error', (err) => {
console.log('Mongoose failed to connect', err); // eslint-disable-line no-console
Mongoose.disconnect();
});
// Mongoose connection close handler
Mongoose.connection.on('close', () => {
console.log('Mongoose connection closed'); // eslint-disable-line no-console
});