@mvp-rockets/namma-generator
Version:
A generator to generate mvp-rockets projects
145 lines (119 loc) • 4.61 kB
JavaScript
require('app-module-path').addPath(__dirname);
const express = require('express');
const cors = require('cors');
const dotenv = require('dotenv');
dotenv.config({ path: `./env/.env.${process.env.APP_ENV}` });
const { Logger } = require('@mvp-rockets/namma-lib');
const config = require('config/config');
require('utils/socket');
const cls = require('cls-hooked');
const namespace = cls.createNamespace(config.clsNameSpace);
const loggerParams = {
environment: config.env,
type: config.logType,
clsNameSpace: config.clsNameSpace
};
if (config.logType === 'aws') {
loggerParams.isEnable = config.serviceProviderConfig.awsCloudwatch.enableAwsLogger;
loggerParams.configurations = {
region: config.serviceProviderConfig.awsCloudwatch.region,
accessKeyId: config.serviceProviderConfig.awsCloudwatch.accessKeyId,
secretKey: config.serviceProviderConfig.awsCloudwatch.secretKey,
logGroupName: config.serviceProviderConfig.awsCloudwatch.logGroupName,
logStreamName: config.serviceProviderConfig.awsCloudwatch.logStreamName
};
} else if (config.logType === 'gcp') {
loggerParams.type = 'google';
loggerParams.isEnable = config.serviceProviderConfig.gcp.enableGcpLogger;
loggerParams.configurations = {
project: config.serviceProviderConfig.gcp.projectName,
keyFile: config.serviceProviderConfig.gcp.keyFile,
logStreamName: config.serviceProviderConfig.gcp.logStreamName
};
}
Logger.initialize(loggerParams);
const { token } = require('@mvp-rockets/namma-lib');
token.initialize(config.jwtSecretKey);
const { ApiError } = require('lib');
const { logError, logInfo } = require('lib');
const { HTTP_CONSTANT } = require('@mvp-rockets/namma-lib');
const app = express();
const server = require('http').createServer(app);
const Route = require('route');
const uuid = require('uuid');
const helmet = require('helmet');
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
const allowedOrigins = config.cors.whiteListOrigins;
const allowedOriginsRegularExpression = allowedOrigins.map((origin) => new RegExp(`${origin}$`));
app.use(cors({ origin: allowedOriginsRegularExpression }));
app.use((req, res, next) => {
const platform = req.headers['x-platform'] || 'unknown-platform';
namespace.run(() => {
namespace.set('traceId', uuid.v4());
logInfo(`${req.method} ${req.originalUrl}`, {
...req.query, ...req.body, platform
});
next();
});
});
Route.setApp(app);
app.use(helmet());
app.disable('x-powered-by');
require('./api-routes');
require('./passport')(app);
app.use((req, res, next) => {
const err = new ApiError('Not Found', 'Resource Not Found!', HTTP_CONSTANT.NOT_FOUND);
next(err);
});
app.use((error, request, response, next) => {
const platform = request.headers['x-platform'] || 'unknown-platform';
if (error.constructor === ApiError) {
logError('Failed to execute the operation', {
value: error.error,
stack: error.error ? error.error.stack : [],
platform
});
if (error.code) { response.status(error.code); }
response.send({
status: false,
error: error?.error,
message: error?.errorMessage
});
} else {
response.status(HTTP_CONSTANT.NOT_IMPLEMENTED);
logError('Failed to execute the operation', { value: error, stack: error.stack, platform });
response.send({
status: false,
errorType: 'unhandled',
message: 'Something went wrong!'
});
}
});
process.on('unhandledRejection', (error) => {
console.error(error);
logError('unhandledRejection', { error });
//shutdown('EXCEPTION', error);
});
process.on('uncaughtException', (error) => {
console.error(error);
logError('uncaughtException', { error });
//shutdown('EXCEPTION', error);
});
function shutdown( signal, error ) {
console.info( `[${signal}] shutting down...` );
// FIXME: Handle error state gracefully. Check if db and redis are still alive before closing them
server.close(() => {
logInfo('HTTP server closed');
db.stop(function(err) {
process.exit(err || error ? 1 : 0)
})
});
}
process.on( 'SIGINT', () => shutdown( 'SIGINT' ) )
process.on( 'SIGTERM', () => shutdown( 'SIGTERM' ) )
server.listen(config.apiPort, () => {
console.log(`Express server listening on Port :- ${config.apiPort}`);
// Here we send the ready signal to PM2
process.send('ready');
});