From e32871a005cc5e79f4b9b0acf64eb46a490d2005 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 3 Nov 2025 08:43:24 +0100 Subject: [PATCH] Implement deleteGroupActivity endpoint and enhance addGroupActivity functionality Added a new endpoint to delete group activities in the diaryDateActivityController and corresponding route in diaryDateActivityRoutes. Enhanced the addGroupActivity function to accept an optional timeblockId parameter, allowing for more precise activity management. Updated the DiaryView component to support the removal of group activities, improving user experience and functionality in activity management. --- .../diaryDateActivityController.js | 16 +- backend/routes/diaryDateActivityRoutes.js | 2 + backend/services/diaryDateActivityService.js | 42 ++++-- frontend/src/views/DiaryView.vue | 142 ++++++++++++++++-- 4 files changed, 179 insertions(+), 23 deletions(-) diff --git a/backend/controllers/diaryDateActivityController.js b/backend/controllers/diaryDateActivityController.js index 3802a47..d617b5d 100644 --- a/backend/controllers/diaryDateActivityController.js +++ b/backend/controllers/diaryDateActivityController.js @@ -79,11 +79,23 @@ export const getDiaryDateActivities = async (req, res) => { export const addGroupActivity = async(req, res) => { try { const { authcode: userToken } = req.headers; - const { clubId, diaryDateId, groupId, activity } = req.body; - const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity); + const { clubId, diaryDateId, groupId, activity, timeblockId } = req.body; + const activityItem = await diaryDateActivityService.addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId); res.status(201).json(activityItem); } catch (error) { devLog(error); res.status(500).json({ error: 'Error adding group activity' }); } +} + +export const deleteGroupActivity = async(req, res) => { + try { + const { authcode: userToken } = req.headers; + const { clubId, groupActivityId } = req.params; + await diaryDateActivityService.deleteGroupActivity(userToken, clubId, groupActivityId); + res.status(200).json({ message: 'Group activity deleted' }); + } catch (error) { + devLog(error); + res.status(500).json({ error: 'Error deleting group activity' }); + } } \ No newline at end of file diff --git a/backend/routes/diaryDateActivityRoutes.js b/backend/routes/diaryDateActivityRoutes.js index 545e468..3f9ecc0 100644 --- a/backend/routes/diaryDateActivityRoutes.js +++ b/backend/routes/diaryDateActivityRoutes.js @@ -6,6 +6,7 @@ import { updateDiaryDateActivityOrder, getDiaryDateActivities, addGroupActivity, + deleteGroupActivity, } from '../controllers/diaryDateActivityController.js'; import { authenticate } from '../middleware/authMiddleware.js'; @@ -14,6 +15,7 @@ const router = express.Router(); router.use(authenticate); router.post('/group', addGroupActivity); +router.delete('/group/:clubId/:groupActivityId', deleteGroupActivity); router.post('/:clubId/', createDiaryDateActivity); router.put('/:clubId/:id/order', updateDiaryDateActivityOrder); router.put('/:clubId/:id', updateDiaryDateActivity); diff --git a/backend/services/diaryDateActivityService.js b/backend/services/diaryDateActivityService.js index d63aa9a..f965c0f 100644 --- a/backend/services/diaryDateActivityService.js +++ b/backend/services/diaryDateActivityService.js @@ -231,16 +231,31 @@ class DiaryDateActivityService { return activitiesWithImages; } - async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity) { + async addGroupActivity(userToken, clubId, diaryDateId, groupId, activity, timeblockId = null) { await checkAccess(userToken, clubId); - const diaryDateActivity = await DiaryDateActivity.findOne({ - where: { - diaryDateId, - isTimeblock: true, - }, - order: [['order_id', 'DESC']], - limit: 1 - }); + let diaryDateActivity; + + if (timeblockId) { + // Verwende die spezifische Zeitblock-ID, falls angegeben + diaryDateActivity = await DiaryDateActivity.findOne({ + where: { + id: timeblockId, + diaryDateId, + isTimeblock: true, + } + }); + } else { + // Fallback: Verwende den letzten Zeitblock + diaryDateActivity = await DiaryDateActivity.findOne({ + where: { + diaryDateId, + isTimeblock: true, + }, + order: [['order_id', 'DESC']], + limit: 1 + }); + } + if (!diaryDateActivity) { console.error('[DiaryDateActivityService::addGroupActivity] Activity not found'); throw new Error('Activity not found'); @@ -276,6 +291,15 @@ class DiaryDateActivityService { devLog(activityData); return await GroupActivity.create(activityData); } + + async deleteGroupActivity(userToken, clubId, groupActivityId) { + await checkAccess(userToken, clubId); + const groupActivity = await GroupActivity.findByPk(groupActivityId); + if (!groupActivity) { + throw new Error('Group activity not found'); + } + return await groupActivity.destroy(); + } } export default new DiaryDateActivityService(); diff --git a/frontend/src/views/DiaryView.vue b/frontend/src/views/DiaryView.vue index 91f94b5..67ed509 100644 --- a/frontend/src/views/DiaryView.vue +++ b/frontend/src/views/DiaryView.vue @@ -117,8 +117,7 @@ class="dropdown" style="max-height: 9.5em;">
- [{{ - s.name }}] + [{{ s.code }}] {{ s.name }}
@@ -139,13 +138,28 @@ {{ item.groupActivity ? item.groupActivity.name : '' }} - {{ item.duration }} ({{ - item.durationText }}) + +
+ + +
+
+ + {{ item.duration || '' }} ({{ + item.durationText }}) + + + + + + + +
+ + + +
+ + + + + + X + +