/** * Required External Modules and Interfaces */ import express, {Request, Response} from 'express'; import {Event} from './event.interface'; import * as EventService from './events.service'; import * as iCalService from './icalgenerator.service'; import * as CredentialService from './credentials.service'; import * as UserService from '../users/users.service'; import {Guid} from 'guid-typescript'; import logger from '../../../middleware/logger'; /** * Router Definition */ export const eventsRouter = express.Router(); /** * Constants */ export const calendarNames = new Map([ ['public', {id: 1, name: 'Nachklang_calendar'}], ['members', {id: 2, name: 'Nachklang_internal_calendar'}], ['management', {id: 3, name: 'Nachklang_management_calendar'}] ]); /** * Controller Definitions */ eventsRouter.get('/:calendar/json', async (req: Request, res: Response) => { try { // Get request params let calendarName: string = req.params.calendar as string ?? ''; let sessionId: string = req.query.sessionId as string ?? ''; let sessionKey: string = req.query.sessionKey as string ?? ''; let password: string = req.query.password as string ?? ''; let ip: string = req.socket.remoteAddress ?? ''; if (calendarName.length < 1) { res.status(400).send({'message': 'Please state the name of the calendar you want events from.'}); return; } if (!Array.from(calendarNames.keys()).includes(calendarName)) { res.status(400).send({'message': 'Unknown calendar.'}); return; } let calendarId: number = calendarNames.get(calendarName)!.id; if (! await CredentialService.hasAccess(calendarName, sessionId, sessionKey, password, ip)) { res.status(403).send({'message': 'You do not have access to the specified calendar.'}); return; } // Get events let events = await EventService.getAllEvents(calendarId); // Send the events back res.status(200).send(events); } catch (e: any) { console.log('Error handling a request: ' + e.message); res.status(500).send({'message': 'Internal Server Error. Try again later.'}); } }); eventsRouter.get('/:calendar/ical', async (req: Request, res: Response) => { try { // Get request params let calendarName: string = req.params.calendar as string ?? ''; let sessionId: string = req.query.sessionId as string ?? ''; let sessionKey: string = req.query.sessionKey as string ?? ''; let password: string = req.query.password as string ?? ''; let ip: string = req.socket.remoteAddress ?? ''; if (calendarName.length < 1) { res.status(400).send({'message': 'Please state the name of the calendar you want events from.'}); return; } if (!Array.from(calendarNames.keys()).includes(calendarName)) { res.status(400).send({'message': 'Unknown calendar.'}); return; } let calendarId: number = calendarNames.get(calendarName)!.id; if (! await CredentialService.hasAccess(calendarName, sessionId, sessionKey, password, ip)) { res.status(403).send({'message': 'You do not have access to the specified calendar.'}); return; } // Get events let events = await EventService.getAllEvents(calendarId); // generate file name let fileName = calendarNames.get(calendarName)!.name; let file = await iCalService.convertToIcal(events); // Send the ical file back res.set({'Content-Disposition': 'attachment; filename=' + fileName + '.ics'}); res.status(200).send(file); } catch (e: any) { let errorGuid = Guid.create().toString(); logger.error('Error handling a request: ' + e.message, {reference: errorGuid}); res.status(500).send({ 'status': 'PROCESSING_ERROR', 'message': 'Internal Server Error. Try again later.', 'reference': errorGuid }); } }); eventsRouter.post('/', async (req: Request, res: Response) => { try { // Get params let sessionId: string = req.query.sessionId as string ?? ''; let sessionKey: string = req.query.sessionKey as string ?? ''; let ip: string = req.socket.remoteAddress ?? ''; let user = await UserService.checkSession(sessionId, sessionKey, ip); if (!user.is_active) { res.status(403).send({'message': 'You do not have access to the specified calendar.'}); return; } if ( req.body.calendarId === undefined || isNullOrBlank(req.body.name) || req.body.startDateTime === undefined || req.body.endDateTime === undefined ) { res.status(400).send({'message': 'Required parameters missing'}); return; } let event: Event = { eventId: -1, calendarId: req.body.calendarId, uuid: '', name: req.body.name, description: req.body.description ?? '', startDateTime: new Date(req.body.startDateTime), endDateTime: new Date(req.body.endDateTime), createdDate: new Date(), location: req.body.location ?? '', createdById: user.user_id ?? -1, url: req.body.url ?? '', wholeDay: req.body.wholeDay ?? false }; let eventId = await EventService.createEvent(event); res.status(201).send({ 'message': 'Event with id ' + eventId + ' was created successfully.', 'eventId': eventId }); } catch (e: any) { let errorGuid = Guid.create().toString(); logger.error('Error handling a request: ' + e.message, {reference: errorGuid}); res.status(500).send({ 'status': 'PROCESSING_ERROR', 'message': 'Internal Server Error. Try again later.', 'reference': errorGuid }); } }); eventsRouter.put('/:eventId', async (req: Request, res: Response) => { try { // Get params let sessionId: string = req.query.sessionId as string ?? ''; let sessionKey: string = req.query.sessionKey as string ?? ''; let ip: string = req.socket.remoteAddress ?? ''; let user = await UserService.checkSession(sessionId, sessionKey, ip); if (!user.is_active) { res.status(403).send({'message': 'You do not have access to the specified calendar.'}); return; } if ( req.params.eventId === undefined || req.body.calendarId === undefined || isNullOrBlank(req.body.name) || req.body.startDateTime === undefined || req.body.endDateTime === undefined ) { res.status(400).send({'message': 'Required parameters missing'}); return; } let event: Event = { eventId: parseInt(req.params.eventId, 10), calendarId: req.body.calendarId, uuid: '', name: req.body.name, description: req.body.description ?? '', startDateTime: new Date(req.body.startDateTime), endDateTime: new Date(req.body.endDateTime), createdDate: new Date(), location: req.body.location ?? '', createdBy: req.body.createdBy ?? '', createdById: user.user_id ?? -1, url: req.body.url ?? '', wholeDay: req.body.wholeDay ?? false }; let successRows = await EventService.updateEvent(event); if (successRows === 1) { res.status(200).send({'message': 'Event was successfully updated'}); } else if (successRows === 0) { res.status(200).send({'message': '0 rows were updated'}); } else { res.status(500).send({'message': 'An error occurred during the update process. Please try again.'}); } } catch (e: any) { let errorGuid = Guid.create().toString(); logger.error('Error handling a request: ' + e.message, {reference: errorGuid}); res.status(500).send({ 'status': 'PROCESSING_ERROR', 'message': 'Internal Server Error. Try again later.', 'reference': errorGuid }); } }); eventsRouter.delete('/:eventId', async (req: Request, res: Response) => { try { // Get params let sessionId: string = req.query.sessionId as string ?? ''; let sessionKey: string = req.query.sessionKey as string ?? ''; let ip: string = req.socket.remoteAddress ?? ''; let user = await UserService.checkSession(sessionId, sessionKey, ip); if (!user.is_active) { res.status(403).send({'message': 'You do not have access to the specified calendar.'}); return; } if ( req.params.eventId === undefined ) { res.status(400).send({'message': 'Required parameters missing'}); return; } let event: Event = { eventId: parseInt(req.params.eventId, 10), calendarId: -1, uuid: '', name: '', description: '', startDateTime: new Date(), endDateTime: new Date(), createdDate: new Date(), location: '', createdBy: '', createdById: -1, url: '', wholeDay: false }; let success = await EventService.deleteEvent(event); if (success) { res.status(200).send({'message': 'Event was successfully deleted'}); } else { res.status(500).send({'message': 'An error occurred during deletion. Please try again.'}); } } catch (e: any) { let errorGuid = Guid.create().toString(); logger.error('Error handling a request: ' + e.message, {reference: errorGuid}); res.status(500).send({ 'status': 'PROCESSING_ERROR', 'message': 'Internal Server Error. Try again later.', 'reference': errorGuid }); } }); /** * Checks if a given string is null, undefined or blank * @param str The string to check */ function isNullOrBlank(str: string | null): boolean { return str === null || str === undefined || str.trim() === ''; }