2020-08-19 06:36:59 +00:00
|
|
|
import * as bodyParser from "body-parser";
|
2020-08-25 08:21:55 +00:00
|
|
|
import * as cors from 'cors';
|
|
|
|
import * as express from "express";
|
2020-08-19 06:36:59 +00:00
|
|
|
import { initialize } from "express-openapi";
|
|
|
|
import { assignIn } from 'lodash';
|
2020-08-25 08:21:55 +00:00
|
|
|
import { Logger } from 'winston';
|
|
|
|
import { EventLayer } from "../lib/communication/eventLayer";
|
|
|
|
import { getDispatcher } from "../lib/dispatcher/nopeDispatcher";
|
|
|
|
import { apiDoc } from '../specs/apiDoc';
|
|
|
|
import { getBackendAccesors } from './getBackendAccessors';
|
2020-08-19 06:36:59 +00:00
|
|
|
|
|
|
|
export function startBackend(options: {
|
|
|
|
port?: number,
|
|
|
|
basePath?: string,
|
2020-08-25 08:21:55 +00:00
|
|
|
logger?: Logger,
|
|
|
|
} = {}) {
|
2020-08-19 06:36:59 +00:00
|
|
|
const app: express.Application = (express as any)();
|
|
|
|
|
|
|
|
// Define the Default Options
|
|
|
|
const defaults = {
|
|
|
|
port: 3001,
|
|
|
|
basePath: '/api'
|
|
|
|
}
|
|
|
|
// Mix the Options.
|
|
|
|
const opts = assignIn(defaults, options);
|
|
|
|
|
|
|
|
app.use(bodyParser.json());
|
2020-08-25 08:21:55 +00:00
|
|
|
app.use(cors());
|
|
|
|
|
2020-08-19 06:36:59 +00:00
|
|
|
initialize({
|
2020-08-25 08:21:55 +00:00
|
|
|
apiDoc: apiDoc('Backend API', '1.0.0', opts.basePath),
|
2020-08-19 06:36:59 +00:00
|
|
|
app,
|
2020-08-25 08:32:46 +00:00
|
|
|
paths: './dist/open-api',
|
2020-08-19 06:36:59 +00:00
|
|
|
routesGlob: '**/*.{ts,js}',
|
2020-08-25 08:21:55 +00:00
|
|
|
routesIndexFileRegExp: /(?:index)?\.[tj]s$/,
|
|
|
|
dependencies: {
|
|
|
|
_dispatcher: getDispatcher('backend', new EventLayer())
|
|
|
|
},
|
2020-08-19 06:36:59 +00:00
|
|
|
});
|
2020-08-25 08:21:55 +00:00
|
|
|
|
2020-08-19 06:36:59 +00:00
|
|
|
app.use(((err, req, res, next) => {
|
|
|
|
res.status(err.status).json(err);
|
|
|
|
}) as express.ErrorRequestHandler);
|
2020-08-25 08:21:55 +00:00
|
|
|
|
2020-08-19 06:36:59 +00:00
|
|
|
const server = app.listen(opts.port);
|
|
|
|
|
|
|
|
const accessor = getBackendAccesors(app);
|
|
|
|
|
2020-08-25 08:21:55 +00:00
|
|
|
if (options.logger) {
|
|
|
|
options.logger.info('Server Running on http://localhost:' + opts.port.toString() + opts.basePath);
|
|
|
|
options.logger.info('API Documentation available on http://localhost:' + opts.port.toString() + opts.basePath + '/api-docs');
|
|
|
|
options.logger.debug('Checkout http://localhost:3000/docs')
|
|
|
|
}
|
|
|
|
|
|
|
|
return {
|
2020-08-19 06:36:59 +00:00
|
|
|
app,
|
|
|
|
// Accessor for the Server
|
|
|
|
accessor,
|
|
|
|
// Function to extract the Definitions.
|
|
|
|
definitionUri: opts.basePath + '/api-docs',
|
|
|
|
// Function to Close the Server
|
|
|
|
close() {
|
|
|
|
server.close();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|