From a38fb20e5a7f0280da272dde25f87013d3add7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20M=C3=BCller?= Date: Tue, 4 Jun 2024 11:55:30 +0200 Subject: [PATCH] Add endpoint that allows to move an event to a different calendar --- src/models/calendar/events/events.router.ts | 57 ++++++++++++++++++++ src/models/calendar/events/events.service.ts | 23 ++++++++ 2 files changed, 80 insertions(+) diff --git a/src/models/calendar/events/events.router.ts b/src/models/calendar/events/events.router.ts index f60ff4f..7768071 100644 --- a/src/models/calendar/events/events.router.ts +++ b/src/models/calendar/events/events.router.ts @@ -246,6 +246,63 @@ eventsRouter.put('/:eventId', async (req: Request, res: Response) => { } }); +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 diff --git a/src/models/calendar/events/events.service.ts b/src/models/calendar/events/events.service.ts index 60cdb59..cb6c4ba 100644 --- a/src/models/calendar/events/events.service.ts +++ b/src/models/calendar/events/events.service.ts @@ -188,3 +188,26 @@ export const deleteEvent = async (event: Event): Promise => { await conn.end(); } }; + +/** + * Moves an event to the specified calendar + * @param event The event to move. Has to have the target calendar set already. + */ +export const moveEvent = async (event: Event): Promise => { + let conn = await NachklangCalendarDB.getConnection(); + try { + const eventQuery = 'UPDATE events SET calendar_id = ? WHERE event_id = ?'; + const eventRes = await conn.execute(eventQuery, [event.calendarId, event.eventId]); + + await conn.commit(); + + return eventRes.affectedRows === 1; + } catch (err) { + await conn.rollback(); + throw err; + } finally { + // Return connection + await conn.commit(); + await conn.end(); + } +}