Source: routes/appointment-routes.js

/** Appointment routes module.
 * @module routes/appointment-routes
 */

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

/** Require module for express router.
 * @requires Router
 */
const router = express.Router();

/** Require module for MongoDB connection.
 * @requires mongoose
 */
const mongoose = require('mongoose');

/** Require module for gCal function in gcalendar file.
 * @requires gcalendar
 */
const gcalFunction = require('../lib/gcalendar');

/** Require module for event model file.
 * @requires event_model
 */
const Event = require('../models/event_model');

/** Calendar data object variable.
 * @var {object} calendarData
 */
var calendarData = {};

/** Start date data object variable.
 * @var {object} startDateObj
 */
var startDateObj;

/** End date data object variable.
 * @var {object} endDateObj
 */
var endDateObj;

/** Updated user data object variable.
 * @var {object} newData
 */
var newData = {};

/** Authentication check to see if the user is already logged in
 * @function authCheck
 * @param {object} req - The request object 
 * @param {object} res - The response object
 * @param {object} next - The next object
 * @param {object} req.user - Google User object
 */
const authCheck = (req,res,next) =>{
    if(!req.user){
        // if user is not logged in
        res.redirect('/');
    }else{
        next();
    }
};

/** Route to index page
 * @name get/appointment
 * @param {object} user - Send the user object
 * @param {string} success - Store Success message
 */
router.get('/', authCheck, (req, res) => {
  res.render('appointment', { user: req.user, success: '' });
});

/** Route to get view appointment page
 * @name get/view-appointment
 * @param {object} req.user.googleId - User Google ID
 */
router.get('/view-appointment', authCheck, (req, res) => {
  gcalFunction.listEvent(req.user);
  getAppointmentList(res, req);
});

/** Routing to update appointment by ID
 * @name get/view-appointment/update/id
 * @param {object} req.params.id - User Event ID
 */
router.get('/view-appointment/update/:id', authCheck, (req, res)=>{
  console.log('Passed ID: '+req.params.id);
  getAppointmentInfo(res, req);
});

/** Routing to post to view-appointment page.
 * @name post/view-appointment
 * @param {object} req - Call back request
 * @param {object} res - Call back response
 */
router.post("/view-appointment", authCheck, (req, res)=>{
  let rb = req.body;

  startDateObj = new Date(rb.startTime + " " + rb.startDate).toISOString();
  endDateObj = new Date(rb.endTime + " " + rb.endDate).toISOString();

  console.log("startDateObj is: " + startDateObj);
  console.log("endDateObj is: " + endDateObj);

  newData = {
    'mongoID': rb.mongoID,
    'eventID': rb.eventID,
    'summary': rb.summary,
    'location': rb.location,
    'description': rb.description,
    'start': startDateObj,
    'end': endDateObj,
    'attendees': rb.attendees,
    'reminders': rb.reminders
  }

  console.log("inside put route, newData is: %j", newData)

  async function run() {
    gcalFunction.updateEvent(newData);
    gcalFunction.listEvent(req.user);
  }
  run().then(getAppointmentList(res, req));
})

/** Routing to delete appointment on view-appointment page.
 * @name delete/view-appointment
 * @param {object} req - Call back request
 * @param {object} res - Call back response
 */
router.delete("/view-appointment",authCheck,(req,res)=>{
  console.log("req.body in DELETE is: %j" ,req.body)
  let e = req.body.de;

  /** Function to run gCal functions asynchronously
   * @async
   * @function run
   */
  async function run(){
    gcalFunction.deleteEvent(e);
    gcalFunction.listEvent(req.user);
  }
  run().then(getAppointmentList(res, req));
});

/** Routing to root page served on '/'.
 * @name post/
 * @param {object} req - Call back request
 * @param {object} res - Call back response
 */
router.post("/", function(req, res){
  let rb = req.body;

  startDateObj = new Date(rb.startTime +" "+ rb.startDate);
  endDateObj = new Date(rb.endTime +" "+ rb.endDate);
  
  console.log("startDateObj is: " + startDateObj);
  console.log("endDateObj is: " + endDateObj);

  calendarData = {
    _id: mongoose.Types.ObjectId(),
    'summary': rb.summary,
    'location': rb.location,
    'description': rb.description,
    'start': startDateObj,
    'end': endDateObj,
    'recurrence': rb.recurrence,
    'attendees': rb.attendees,
    'reminders': rb.reminders
  }
  console.log(calendarData);
  gcalFunction.insEvent(calendarData, req.user);
  res.render('appointment',{user:req.user, success: "Appointment booked successfully!"});
});

/** Function to get appointment list of authenticated user.
 * @function getAppointmentList
 * @param {object} res - Response
 * @param {object} req - Request
 */  
function getAppointmentList(res,req){
  Event.find({userID: req.user.googleId}).exec(function(err, events) {   
    if (err) {
      throw err;
    }else{
      res.render('view-appointment', { "events": events})
    }
  });
}

/** Function to get appointment info of authenticated user.
 * @function getAppointmentInfo
 * @param {object} res - Response
 * @param {object} req - Request
 */  
function getAppointmentInfo(res, req){
  console.log("Request params is: "+req.params.id);
  Event.find({userID: req.user.googleId}).exec(async function(err) {
    if(err){
      console.log("Unable to find user.");
    } else {
      Event.find({_id: req.params.id}).exec(async function(err, event) {
        if(err){
          console.log("Unable to find event id.");
        } else {
          console.log("Event id found: "+event);
          res.render('update', {"event": event})
        }
      })
    }
  });
}

module.exports = router;