"use strict"; const express = require('express'); const path = require('path'); const favicon = require('serve-favicon'); const bodyParser = require('body-parser'); const requestLogger = require('morgan'); const debug = require('debug')('cc:server'); const cors = require('cors') const mongoose = require('mongoose'); // own modules const config = require('./config/config'); const urls = require('./config/api-url'); const restAPIchecks = require('./middleware/request-checks.js'); const errorResponseWare = require('./middleware/error-response'); const apiAuthenticationMiddleware = require('./middleware/auth-middleware'); const signatureCronJob = require('./cron-job/update-signatures'); // router modules const authenticateRouter = require('./routes/authenticate'); const overviewRouter = require('./routes/overview'); const userRouter = require('./routes/users'); const squadRouter = require('./routes/squads'); const rankRouter = require('./routes/ranks'); const decorationRouter = require('./routes/decorations'); const awardingRouter = require('./routes/awardings'); const signatureRouter = require('./routes/signatures'); const commandRouter = require('./routes/command'); // Configuration *********************************** // mongoose promise setup mongoose.Promise = global.Promise; // app creation const app = express(); // Middlewares ************************************************* // setup CORS-middleware const corsOptions = { methods: ['GET'], optionsSuccessStatus: 200 }; app.use(cors(corsOptions)); app.use(favicon(path.join(__dirname + '/..', 'public', 'favicon.ico'))); app.use(express.static(path.join(__dirname + '/..', 'public'))); app.use(bodyParser.json()); // API request checks for API-version and JSON etc. app.use(restAPIchecks); // Routes ****************************************************** app.use(urls.signatures, signatureRouter); // initialize logging here to exclude /signature requests if (!process.env.NODE_ENV) { // development logging app.use(requestLogger('dev')); } else if (process.env.NODE_ENV !== config.test.env) { // production logging, apache style app.use(requestLogger(':date[iso] :remote-addr :method :url :status :response-time ms')); } app.use(urls.auth, authenticateRouter); app.use(urls.overview, overviewRouter); app.use(urls.users, userRouter); app.use(urls.squads, squadRouter); app.use(urls.ranks, rankRouter); app.use(urls.decorations, decorationRouter); app.use(urls.awards, apiAuthenticationMiddleware, awardingRouter); app.use(urls.command, apiAuthenticationMiddleware, commandRouter); // send index.html on all different paths app.use(function (req, res) { res.sendFile("public/index.html", {root: __dirname + '/..'}); }); // (from express-generator boilerplate standard code) // Errorhandling and requests without proper URLs ************************ // catch 404 and forward to error handler app.use((req, res, next) => { debug('Catching unmatched request to answer with 404'); let err = new Error('Not Found'); err.status = 404; next(err); }); // register error handlers errorResponseWare(app); // Start the server if (process.env.NODE_ENV !== config.test.env) { mongoose.connect(config.database.uri + config.database.db); app.listen(config.port, (err) => { if (err !== undefined) { debug('Error on startup, ', err); } else { debug('Listening on port ' + config.port); signatureCronJob.start(); } }); } else { mongoose.connect(config.database.uri + config.test.db); app.listen(config.test.port); } module.exports = app;