import express from 'express'; import bodyParser from 'body-parser'; import swagger from 'swagger-ui-express'; import jsonRefParser, {JSONSchema} from '@apidevtools/json-schema-ref-parser'; import db from './db'; // tell if server is running in debug or production environment console.log(process.env.NODE_ENV === 'production' ? '===== PRODUCTION =====' : process.env.NODE_ENV === 'test' ? '' :'===== DEVELOPMENT ====='); // mongodb connection db.connect(); // create Express app const app = express(); app.disable('x-powered-by'); // get port from environment, defaults to 3000 const port = process.env.PORT || 3000; //middleware app.use(express.json({ limit: '5mb'})); app.use(express.urlencoded({ extended: false, limit: '5mb' })); app.use(bodyParser.json()); app.use((err, req, res, ignore) => { // bodyParser error handling res.status(400).send({status: 'Invalid JSON body'}); }); // require routes app.use('/', require('./routes/root')); app.use('/', require('./routes/user')); // Swagger UI let oasDoc: JSONSchema = {}; jsonRefParser.bundle('oas/oas.yaml', (err, doc) => { if(err) throw err; oasDoc = doc; oasDoc.paths = oasDoc.paths.allOf.reduce((s, e) => Object.assign(s, e)); swagger.setup(oasDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'}); }); app.use('/api', swagger.serve, swagger.setup(oasDoc, {defaultModelsExpandDepth: -1, customCss: '.swagger-ui .topbar { display: none }'})); app.use((req, res) => { // 404 error handling res.status(404).json({status: 'Not found'}); }); app.use((err, req, res, ignore) => { // internal server error handling console.error(err); res.status(500).json({status: 'Internal server error'}); }); // hook up server to port const server = app.listen(port, () => { console.log(process.env.NODE_ENV === 'test' ? '' : `Listening on http://localhost:${port}`); }); module.exports = server;