"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 checkAdmin = require('./middleware/permission-check').checkAdmin; const signatureCronJob = require('./cron-job/cron').cronJobSignature; const backupCronJob = require('./cron-job/cron').cronJobBackup; // router modules const authenticateRouter = require('./routes/authenticate'); const accountRouter = require('./routes/account'); 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 requestRouter = require('./routes/request'); const signatureRouter = require('./routes/signatures'); const commandRouter = require('./routes/command'); const campaignRouter = require('./routes/campaigns'); const warRouter = require('./routes/wars'); // 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({limit: '10mb'})); app.use(bodyParser.urlencoded({limit: '10mb', extended: true})); // API request checks for API-version and JSON etc. app.use(restAPIchecks); // Routes ****************************************************** app.use(urls.signatures, signatureRouter); // initialize logging at this point to exclude /signature requests if (process.env.NODE_ENV === config.dev.env) { // development logging app.use(requestLogger('dev')); } else if (process.env.NODE_ENV !== config.test.env) { // production logging, apache style app.use(requestLogger(':date[clf] :method :url :response-time ms :status')); } 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.request, requestRouter); app.use(urls.awards, awardingRouter); app.use(urls.wars, warRouter); app.use(urls.campaigns,campaignRouter); app.use(urls.command, apiAuthenticationMiddleware, checkAdmin, commandRouter); app.use(urls.account, apiAuthenticationMiddleware, checkAdmin, accountRouter); // 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) { const mongoosePromise = mongoose.connect(config.database.uri + config.database.db, { useMongoClient: true }); mongoosePromise.then((db) => { app.listen(config.port, (err) => { if (err !== undefined) { debug('Error on startup, ', err); } else { debug('Listening on port ' + config.port); signatureCronJob.start(); backupCronJob.start(); } }); }) } else { const mongoosePromise = mongoose.connect(config.database.uri + config.test.db, { useMongoClient: true }); mongoosePromise.then((db) => { app.listen(config.test.port); console.log('Listening on port ' + config.test.port); }) } module.exports = app;