Source: app.js

/** @file An ExpressJS web app that allows users to book appointments with each other using Google Calendar API data 
 * @author Denis Komarov <dkomarov@hawk.iit.edu>
 * @author Dhiraj Jain <djain14@hawk.iit.edu> 
 * @author Jimmy Tran <jtran8@hawk.iit.edu>
 * @copyright Denis Komarov, Dhiraj Jain, and Jimmy Tran
 * @version 1.2.0-beta.1 release
 * @license 
 * Copyright 2020 by Denis Komarov, Dhiraj Jain, and Jimmy Tran
 * 
 * Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the 
 * above copyright notice and this permission notice appear in all copies.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY 
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, 
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
'use strict';

/** Require module for cookie session.
 * @requires cookie-session
 */
const cookieSession = require('cookie-session');

/** Require module for http errors.
 * @requires http-errors
 */
const createError = require('http-errors');

/** Require module for express lightweight middleware.
 * @requires express
 */
const express = require('express');

 /** App constant using express middleware.
 * @const {object} app 
 */
const app = express();

/** Require module for ejs layouts using express.
 * @requires express-ejs-layouts
 */
const expressLayouts = require('express-ejs-layouts');

/** Require module for index routing file.
 * @requires index
 */
const indexRouter = require('./routes/index');

/** Require module for keys file.
 * @requires keys
 */
const keys = require('./config/keys');

/** Require module for morgan.
 * @requires morgan
 */
const logger = require('morgan');

/** Require module for menu routing file.
 * @requires menu
 */
const menuRoutes = require('./routes/menu');

/** Require module for database connection file.
 * @requires connect
 */
const mongodb = require('./lib/connect');

/** Require module for passport file.
 * @requires passport
 */
const passport = require('passport');

/** Require module for passport configuration file.
 * @requires passport-setup
 */
const passportSetup = require('./config/passport-setup');

/** Require module for path.
 * @requires path
 */
const path = require('path');

/** Require module for user routing file.
 * @requires users
 */
const usersRouter = require('./routes/users');

/** Require module for authentication routing file.
 * @requires auth-routes
 */
const authRoutes = require('./routes/auth-routes');

/** Require module for appointment routing file.
 * @requires appointment-routes
 */
const appointmentRoutes = require('./routes/appointment-routes');

/** Connects the application to MongoDB database. */
mongodb.dbConnect();

/** Setting up views, view engine, and layouts. */
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.set('layout', 'layouts/layout');
app.use(expressLayouts);

/** Manage cookie sessions. */
app.use(cookieSession({
  maxAge: 24 * 60 * 60 * 1000,
  keys: [keys.session.cookieKey]
}));

/** Initialise and configure passport. */
app.use(passport.initialize());
app.use(passport.session());
app.set(passportSetup);

/** Configure morgan and express middleware. */
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, 'public')));

/** Establish proper page routings */
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/auth', authRoutes);
app.use('/menu', menuRoutes);
app.use('/appointment', appointmentRoutes);
app.use('/appointment/appt-success', appointmentRoutes);
app.use('/appointment/view-appointment', appointmentRoutes);

/** Catch 404 error and forward to error handler. */
app.use(function(req, res, next) {
  next(createError(404));
});

/** Error handler */
app.use(function(err, req, res) {
  /** Set locals, only providing error in development. */
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  /** Render the error page */
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;