369 lines
11 KiB
TypeScript
369 lines
11 KiB
TypeScript
/**
|
|
* 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<string, any>([
|
|
['public', {id: 1, name: 'Nachklang_calendar'}],
|
|
['members', {id: 2, name: 'Nachklang_internal_calendar'}],
|
|
['choir', {id: 4, name: 'Nachklang_choir_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;
|
|
|
|
let user = await UserService.checkSession(sessionId, sessionKey, ip);
|
|
|
|
// If no user was found, check if the password gives access to the calendar
|
|
if(user === null || !user.isActive) {
|
|
if (! await CredentialService.hasAccess(calendarName, sessionId, sessionKey, password, ip)) {
|
|
res.status(403).send({'message': 'You do not have access to the specified calendar.'});
|
|
return;
|
|
}
|
|
}
|
|
|
|
let events: Event[];
|
|
|
|
if(user.isActive) {
|
|
events = await EventService.getAllEventsAdmin(calendarId);
|
|
} else {
|
|
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.isActive) {
|
|
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.userId ?? -1,
|
|
url: req.body.url ?? '',
|
|
wholeDay: req.body.wholeDay ?? false,
|
|
status: req.body.status ?? 'PUBLIC'
|
|
};
|
|
|
|
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.isActive) {
|
|
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.userId ?? -1,
|
|
url: req.body.url ?? '',
|
|
wholeDay: req.body.wholeDay ?? false,
|
|
status: req.body.status ?? 'PUBLIC'
|
|
};
|
|
|
|
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.put('/move/: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.isActive) {
|
|
res.status(403).send({'message': 'You do not have access to the specified calendar.'});
|
|
return;
|
|
}
|
|
|
|
if (
|
|
req.params.eventId === undefined ||
|
|
req.body.calendarId === 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.userId ?? -1,
|
|
url: req.body.url ?? '',
|
|
wholeDay: req.body.wholeDay ?? false,
|
|
status: req.body.status ?? 'PUBLIC'
|
|
};
|
|
|
|
let success = await EventService.moveEvent(event);
|
|
|
|
if (success) {
|
|
res.status(200).send({'message': 'Event was successfully moved'});
|
|
} else {
|
|
res.status(500).send({'message': 'An error occurred during the moving 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.isActive) {
|
|
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: user.userId ?? -1,
|
|
url: '',
|
|
wholeDay: false,
|
|
status: 'DELETED'
|
|
};
|
|
|
|
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() === '';
|
|
}
|