99 lines
3.6 KiB
TypeScript
99 lines
3.6 KiB
TypeScript
/**
|
|
* 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
|
|
});
|
|
}
|
|
});
|