/** * Required External Modules and Interfaces */ import express, {Request, Response} from 'express'; import logger from '../../middleware/logger'; import {Guid} from 'guid-typescript'; import * as icalgenerator from './icalgenerator/icalgenerator.service'; /** * Router Definition */ export const raPlaMiddlewareRouter = express.Router(); /** * @swagger * /rapla-middleware: * get: * summary: Retrieve the adjusted RaPla .ics file * description: Downloads the current .ics file from DHBW servers, removes unwanted events and returns the file. * Required urls can be generated on https://rapla-middleware.p4ddy.com * tags: * - rapla-middleware * responses: * 200: * description: The .ics file * 400: * description: Wrong parameters, see response body for detailed information * 500: * description: A server error occurred. Please try again. If this issue persists, contact the admin. * parameters: * - in: query * name: user * required: true * description: The user from RaPla, can be taken directly from the RaPla link * schema: * type: string * example: mueller * - in: query * name: file * required: true * description: The file from RaPla, can be taken directly from the RaPla link * schema: * type: string * example: TINF19B4 * - in: query * name: blockers * required: false * description: Whether to remove blockers from the .ics file * schema: * type: boolean * example: 1 * - in: query * name: wahl * required: false * description: The chosen elective module which is not to be filtered out * schema: * type: integer * example: 0 * - in: query * name: pflicht * required: false * description: The chosen profile module which is not to be filtered out * schema: * type: integer * example: 2 */ raPlaMiddlewareRouter.get('/', async (req: Request, res: Response) => { try { let user = (req.query.user ?? '').toString(); let file = (req.query.file ?? '').toString(); let blockers = (req.query.blockers ?? '').toString() === '1'; let wahl = (req.query.wahl ?? '').toString(); let pflicht = (req.query.pflicht ?? '').toString(); const allowedCharsRegex: RegExp = /^[a-zA-Z0-9]+$/; if (user === '' || file === '') { res.status(400).send('Please at least provide user and file for RaPla!'); return; } else if (!allowedCharsRegex.test(user) || !allowedCharsRegex.test(file)) { res.status(400).send('Please provide a valid user and file!'); return; } let resultingFile = await icalgenerator.getiCalFile(user, file, blockers, wahl, pflicht); res.set({'Content-Disposition': 'attachment; filename=' + file + '.ics'}); res.status(200).send(resultingFile); } 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 }); } });