diff --git a/backend/controllers/predefinedActivityImageController.js b/backend/controllers/predefinedActivityImageController.js index 820228c..3a07fce 100644 --- a/backend/controllers/predefinedActivityImageController.js +++ b/backend/controllers/predefinedActivityImageController.js @@ -50,4 +50,43 @@ export const uploadPredefinedActivityImage = async (req, res) => { } }; +export const deletePredefinedActivityImage = async (req, res) => { + try { + const { id, imageId } = req.params; // predefinedActivityId, imageId + const { authcode: userToken } = req.headers; + await checkAccess(userToken); + + const activity = await PredefinedActivity.findByPk(id); + if (!activity) { + return res.status(404).json({ error: 'Predefined activity not found' }); + } + + const image = await PredefinedActivityImage.findOne({ + where: { id: imageId, predefinedActivityId: id } + }); + if (!image) { + return res.status(404).json({ error: 'Image not found' }); + } + + // Datei vom Dateisystem löschen + if (fs.existsSync(image.imagePath)) { + fs.unlinkSync(image.imagePath); + } + + // Datensatz aus der Datenbank löschen + await image.destroy(); + + // Falls das gelöschte Bild der aktuelle imageLink war, diesen zurücksetzen + if (activity.imageLink === `/api/predefined-activities/${id}/image/${imageId}`) { + activity.imageLink = null; + await activity.save(); + } + + res.status(200).json({ message: 'Image deleted successfully' }); + } catch (error) { + console.error('[deletePredefinedActivityImage] - Error:', error); + res.status(500).json({ error: 'Failed to delete image' }); + } +}; + diff --git a/backend/routes/predefinedActivityRoutes.js b/backend/routes/predefinedActivityRoutes.js index 0fbefcd..1c872dd 100644 --- a/backend/routes/predefinedActivityRoutes.js +++ b/backend/routes/predefinedActivityRoutes.js @@ -10,7 +10,7 @@ import { } from '../controllers/predefinedActivityController.js'; import multer from 'multer'; import { authenticate } from '../middleware/authMiddleware.js'; -import { uploadPredefinedActivityImage } from '../controllers/predefinedActivityImageController.js'; +import { uploadPredefinedActivityImage, deletePredefinedActivityImage } from '../controllers/predefinedActivityImageController.js'; import PredefinedActivityImage from '../models/PredefinedActivityImage.js'; import path from 'path'; import fs from 'fs'; @@ -23,6 +23,7 @@ router.get('/', authenticate, getAllPredefinedActivities); router.get('/:id', authenticate, getPredefinedActivityById); router.put('/:id', authenticate, updatePredefinedActivity); router.post('/:id/image', authenticate, upload.single('image'), uploadPredefinedActivityImage); +router.delete('/:id/image/:imageId', authenticate, deletePredefinedActivityImage); router.get('/search/query', authenticate, searchPredefinedActivities); router.post('/merge', authenticate, mergePredefinedActivities); router.post('/deduplicate', authenticate, deduplicatePredefinedActivities); diff --git a/frontend/src/views/PredefinedActivities.vue b/frontend/src/views/PredefinedActivities.vue index 59ad2c5..34a3a5a 100644 --- a/frontend/src/views/PredefinedActivities.vue +++ b/frontend/src/views/PredefinedActivities.vue @@ -54,27 +54,42 @@ - +
Du kannst entweder einen Link zu einem Bild eingeben oder ein Bild hochladen:
+ + + ++ Hinweis: Das Bild wird erst nach dem Speichern der Aktivität hochgeladen. +
+