diff --git a/docs/FEATURE_PLAN-exif-extraction.md b/FeatureRequests/FEATURE_PLAN-exif-extraction.md similarity index 100% rename from docs/FEATURE_PLAN-exif-extraction.md rename to FeatureRequests/FEATURE_PLAN-exif-extraction.md diff --git a/docs/FEATURE_REQUEST-mail.md b/FeatureRequests/FEATURE_REQUEST-mail.md similarity index 100% rename from docs/FEATURE_REQUEST-mail.md rename to FeatureRequests/FEATURE_REQUEST-mail.md diff --git a/docs/FEATURE_PLAN-autogen-openapi.md b/FeatureRequests/done/FEATURE_PLAN-autogen-openapi.md similarity index 100% rename from docs/FEATURE_PLAN-autogen-openapi.md rename to FeatureRequests/done/FEATURE_PLAN-autogen-openapi.md diff --git a/docs/FEATURE_PLAN-delete-unproved-groups.md b/FeatureRequests/done/FEATURE_PLAN-delete-unproved-groups.md similarity index 98% rename from docs/FEATURE_PLAN-delete-unproved-groups.md rename to FeatureRequests/done/FEATURE_PLAN-delete-unproved-groups.md index 69b5b48..94cbb3a 100644 --- a/docs/FEATURE_PLAN-delete-unproved-groups.md +++ b/FeatureRequests/done/FEATURE_PLAN-delete-unproved-groups.md @@ -10,14 +10,14 @@ ## 🎯 Funktionale Anforderungen ### Must-Have -- [ ] **Automatische Löschung**: Gruppen mit `approved = false` werden nach 7 Tagen ab Upload-Zeitpunkt gelöscht -- [ ] **VollstĂ€ndige Löschung**: Datenbank-EintrĂ€ge, Originalbilder und Preview-Bilder werden entfernt -- [ ] **Cron-Job**: TĂ€gliche AusfĂŒhrung um 10:00 Uhr morgens -- [ ] **Deletion Log**: Protokollierung gelöschter Gruppen in eigener Datenbanktabelle -- [ ] **Anonymisierung**: Keine personenbezogenen Daten (Titel, Name, Beschreibung) im Log -- [ ] **Countdown-Anzeige**: In ModerationPage wird Restzeit bis zur Löschung angezeigt -- [ ] **Admin-Übersicht**: GeschĂŒtzter Bereich in ModerationPage fĂŒr Lösch-Historie -- [ ] **Freigabe-Schutz**: Freigegebene Gruppen (`approved = true`) werden niemals automatisch gelöscht +- [x] **Automatische Löschung**: Gruppen mit `approved = false` werden nach 7 Tagen ab Upload-Zeitpunkt gelöscht +- [x] **VollstĂ€ndige Löschung**: Datenbank-EintrĂ€ge, Originalbilder und Preview-Bilder werden entfernt +- [x] **Cron-Job**: TĂ€gliche AusfĂŒhrung um 10:00 Uhr morgens +- [x] **Deletion Log**: Protokollierung gelöschter Gruppen in eigener Datenbanktabelle +- [x] **Anonymisierung**: Keine personenbezogenen Daten (Titel, Name, Beschreibung) im Log +- [x] **Countdown-Anzeige**: In ModerationPage wird Restzeit bis zur Löschung angezeigt +- [x] **Admin-Übersicht**: GeschĂŒtzter Bereich in ModerationPage fĂŒr Lösch-Historie +- [x] **Freigabe-Schutz**: Freigegebene Gruppen (`approved = true`) werden niemals automatisch gelöscht ### Nice-to-Have - [ ] **Manuelle Verzögerung**: Admin kann Löschfrist verlĂ€ngern (z.B. um weitere 7 Tage) diff --git a/docs/FEATURE_PLAN-image-description.md b/FeatureRequests/done/FEATURE_PLAN-image-description.md similarity index 85% rename from docs/FEATURE_PLAN-image-description.md rename to FeatureRequests/done/FEATURE_PLAN-image-description.md index 960308f..30d57fd 100644 --- a/docs/FEATURE_PLAN-image-description.md +++ b/FeatureRequests/done/FEATURE_PLAN-image-description.md @@ -506,94 +506,94 @@ export const uploadImageBatch = async (files, metadata, descriptions = []) => { ### Manuelle Tests -- [ ] Upload mehrerer Bilder mit verschiedenen Beschreibungen -- [ ] Upload ohne Beschreibungen -- [ ] Bearbeiten bestehender Gruppen -- [ ] Slideshow mit Beschreibungen testen +- [x] Upload mehrerer Bilder mit verschiedenen Beschreibungen +- [x] Upload ohne Beschreibungen +- [x] Bearbeiten bestehender Gruppen +- [x] Slideshow mit Beschreibungen testen - [ ] Mobile-Ansicht testen -- [ ] Performance mit vielen Bildern testen +- [x] Performance mit vielen Bildern testen --- ## 📝 Implementation TODO ### Phase 1: Backend Foundation ✅ -- [ ] **Task 1.1:** Datenbank-Migration erstellen - - [ ] `004_add_image_description.sql` erstellen - - [ ] Migration in `DatabaseManager.js` registrieren - - [ ] Lokale DB testen +- [x] **Task 1.1:** Datenbank-Migration erstellen + - [x] `004_add_image_description.sql` erstellen + - [x] Migration in `DatabaseManager.js` registrieren + - [ x Lokale DB testen -- [ ] **Task 1.2:** Repository-Layer erweitern - - [ ] `updateImageDescription()` in `GroupRepository.js` - - [ ] `updateBatchImageDescriptions()` in `GroupRepository.js` - - [ ] `getImagesByGroupId()` erweitern fĂŒr `image_description` +- [x] **Task 1.2:** Repository-Layer erweitern + - [x] `updateImageDescription()` in `GroupRepository.js` + - [x] `updateBatchImageDescriptions()` in `GroupRepository.js` + - [x] `getImagesByGroupId()` erweitern fĂŒr `image_description` -- [ ] **Task 1.3:** API-Routes implementieren - - [ ] `PATCH /groups/:groupId/images/:imageId` in `routes/groups.js` - - [ ] `PATCH /groups/:groupId/images/batch-description` in `routes/groups.js` - - [ ] Validierung hinzufĂŒgen (max 200 Zeichen) - - [ ] GET Routes erweitern (image_description returnen) +- [x] **Task 1.3:** API-Routes implementieren + - [x] `PATCH /groups/:groupId/images/:imageId` in `routes/groups.js` + - [x] `PATCH /groups/:groupId/images/batch-description` in `routes/groups.js` + - [x] Validierung hinzufĂŒgen (max 200 Zeichen) + - [x] GET Routes erweitern (image_description returnen) -- [ ] **Task 1.4:** Upload-Route erweitern - - [ ] `batchUpload.js` Route akzeptiert `descriptions` Parameter - - [ ] Speichere Beschreibungen beim Upload - - [ ] Backward-KompatibilitĂ€t testen +- [x] **Task 1.4:** Upload-Route erweitern + - [x] `batchUpload.js` Route akzeptiert `descriptions` Parameter + - [x] Speichere Beschreibungen beim Upload + - [x] Backward-KompatibilitĂ€t testen ### Phase 2: Frontend Core Components ✅ -- [ ] **Task 2.1:** ImageGalleryCard.js anpassen - - [ ] "Sort" Button durch "Edit" Button ersetzen - - [ ] Edit-Modus UI implementieren (Textarea) - - [ ] Props hinzufĂŒgen: `isEditMode`, `onEditMode`, `imageDescription`, `onDescriptionChange` - - [ ] ZeichenzĂ€hler implementieren - - [ ] Validierung (max 200 Zeichen) +- [x] **Task 2.1:** ImageGalleryCard.js anpassen + - [x] "Sort" Button durch "Edit" Button ersetzen + - [x] Edit-Modus UI implementieren (Textarea) + - [x] Props hinzufĂŒgen: `isEditMode`, `onEditMode`, `imageDescription`, `onDescriptionChange` + - [x] ZeichenzĂ€hler implementieren + - [x] Validierung (max 200 Zeichen) -- [ ] **Task 2.2:** ImageGallery.js erweitern - - [ ] Neue Props durchreichen - - [ ] Edit-Modus State-Management +- [x] **Task 2.2:** ImageGallery.js erweitern + - [x] Neue Props durchreichen + - [x] Edit-Modus State-Management -- [ ] **Task 2.3:** CSS-Styles hinzufĂŒgen - - [ ] `ImageGallery.css` erweitern - - [ ] Textarea-Styles - - [ ] ZeichenzĂ€hler-Styles - - [ ] Edit-Button-Styles - - [ ] Mobile-Optimierung +- [x] **Task 2.3:** CSS-Styles hinzufĂŒgen + - [x] `ImageGallery.css` erweitern + - [x] Textarea-Styles + - [x] ZeichenzĂ€hler-Styles + - [x] Edit-Button-Styles + - [x] Mobile-Optimierung ### Phase 3: Upload Flow Integration ✅ -- [ ] **Task 3.1:** MultiUploadPage.js erweitern - - [ ] State fĂŒr Edit-Modus hinzufĂŒgen - - [ ] State fĂŒr Beschreibungen hinzufĂŒgen - - [ ] Handler fĂŒr Edit-Modus implementieren - - [ ] Handler fĂŒr BeschreibungsĂ€nderungen implementieren - - [ ] Upload-Logik erweitern (Beschreibungen mitschicken) - - [ ] Edit-Mode Toggle UI hinzufĂŒgen +- [x] **Task 3.1:** MultiUploadPage.js erweitern + - [x] State fĂŒr Edit-Modus hinzufĂŒgen + - [x] State fĂŒr Beschreibungen hinzufĂŒgen + - [x] Handler fĂŒr Edit-Modus implementieren + - [x] Handler fĂŒr BeschreibungsĂ€nderungen implementieren + - [x] Upload-Logik erweitern (Beschreibungen mitschicken) + - [x] Edit-Mode Toggle UI hinzufĂŒgen -- [ ] **Task 3.2:** batchUpload.js erweitern - - [ ] Funktionssignatur anpassen (descriptions Parameter) - - [ ] FormData um Beschreibungen erweitern - - [ ] Error-Handling +- [x] **Task 3.2:** batchUpload.js erweitern + - [x] Funktionssignatur anpassen (descriptions Parameter) + - [x] FormData um Beschreibungen erweitern + - [x] Error-Handling ### Phase 4: Moderation Integration ✅ -- [ ] **Task 4.1:** ModerationGroupImagesPage.js erweitern - - [ ] State fĂŒr Edit-Modus hinzufĂŒgen - - [ ] State fĂŒr Beschreibungen hinzufĂŒgen - - [ ] `loadGroup()` erweitern (Beschreibungen laden) - - [ ] Handler fĂŒr BeschreibungsĂ€nderungen implementieren - - [ ] `handleSaveDescriptions()` implementieren - - [ ] Edit-Mode Toggle UI hinzufĂŒgen - - [ ] Optimistic Updates +- [x] **Task 4.1:** ModerationGroupImagesPage.js erweitern + - [x] State fĂŒr Edit-Modus hinzufĂŒgen + - [x] State fĂŒr Beschreibungen hinzufĂŒgen + - [x] `loadGroup()` erweitern (Beschreibungen laden) + - [x] Handler fĂŒr BeschreibungsĂ€nderungen implementieren + - [x] `handleSaveDescriptions()` implementieren + - [x] Edit-Mode Toggle UI hinzufĂŒgen + - [x] Optimistic Updates ### Phase 5: Slideshow Integration ✅ -- [ ] **Task 5.1:** SlideshowPage.js erweitern - - [ ] Beschreibungs-Anzeige UI implementieren - - [ ] CSS fĂŒr Slideshow-Beschreibung - - [ ] Responsive Design - - [ ] Conditional Rendering (nur wenn Beschreibung vorhanden) +- [x] **Task 5.1:** SlideshowPage.js erweitern + - [x] Beschreibungs-Anzeige UI implementieren + - [x] CSS fĂŒr Slideshow-Beschreibung + - [x] Responsive Design + - [x] Conditional Rendering (nur wenn Beschreibung vorhanden) -- [ ] **Task 5.2:** Slideshow-Styles - - [ ] `.slideshow-description` CSS - - [ ] Overlay-Styling - - [ ] Animation (optional) - - [ ] Mobile-Ansicht +- [x] **Task 5.2:** Slideshow-Styles + - [x] `.slideshow-description` CSS + - [x] Overlay-Styling + - [x] Animation (optional) + - [x] Mobile-Ansicht ### Phase 6: Groups Overview Integration ✅ - [ ] **Task 6.1:** GroupsOverviewPage.js erweitern diff --git a/docs/FEATURE_PLAN-preload-image.md b/FeatureRequests/done/FEATURE_PLAN-preload-image.md similarity index 100% rename from docs/FEATURE_PLAN-preload-image.md rename to FeatureRequests/done/FEATURE_PLAN-preload-image.md diff --git a/docs/FEATURE_PLAN-preview-images.md b/FeatureRequests/done/FEATURE_PLAN-preview-images.md similarity index 100% rename from docs/FEATURE_PLAN-preview-images.md rename to FeatureRequests/done/FEATURE_PLAN-preview-images.md diff --git a/docs/FEATURE_PLAN-reordering.md b/FeatureRequests/done/FEATURE_PLAN-reordering.md similarity index 100% rename from docs/FEATURE_PLAN-reordering.md rename to FeatureRequests/done/FEATURE_PLAN-reordering.md diff --git a/docs/FEATURE_PLAN-social-media.md b/FeatureRequests/done/FEATURE_PLAN-social-media.md similarity index 100% rename from docs/FEATURE_PLAN-social-media.md rename to FeatureRequests/done/FEATURE_PLAN-social-media.md diff --git a/docs/FEATURE_REQUEST-Consent-history.md b/FeatureRequests/done/FEATURE_REQUEST-Consent-history.md similarity index 100% rename from docs/FEATURE_REQUEST-Consent-history.md rename to FeatureRequests/done/FEATURE_REQUEST-Consent-history.md diff --git a/docs/FEATURE_REQUEST-autogen-openapi.md b/FeatureRequests/done/FEATURE_REQUEST-autogen-openapi.md similarity index 100% rename from docs/FEATURE_REQUEST-autogen-openapi.md rename to FeatureRequests/done/FEATURE_REQUEST-autogen-openapi.md diff --git a/docs/UPGRADE_PLAN-upgrade-deps-react-node-20251028.md b/FeatureRequests/done/UPGRADE_PLAN-upgrade-deps-react-node-20251028.md similarity index 100% rename from docs/UPGRADE_PLAN-upgrade-deps-react-node-20251028.md rename to FeatureRequests/done/UPGRADE_PLAN-upgrade-deps-react-node-20251028.md diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index 6c798bf..288083d 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -16,6 +16,8 @@ services: environment: - API_URL=http://backend:5000 - CLIENT_URL=http://localhost + - REACT_APP_ADMIN_API_KEY=${ADMIN_API_KEY} + networks: - npm-nw - prod-internal @@ -34,6 +36,7 @@ services: - prod-internal environment: - NODE_ENV=production + - ADMIN_API_KEY=${ADMIN_API_KEY} networks: npm-nw: diff --git a/docker/prod/frontend/nginx.conf b/docker/prod/frontend/nginx.conf index 55f9af7..73175ad 100644 --- a/docker/prod/frontend/nginx.conf +++ b/docker/prod/frontend/nginx.conf @@ -38,89 +38,25 @@ http { # Allow large uploads (50MB) client_max_body_size 50M; - # API proxy to image-uploader-backend service - location /upload { + # Generic API proxy for all backend endpoints under /api/ + # This mirrors the dev setup: forward everything under /api/ to the backend service + location /api/ { proxy_pass http://image-uploader-backend:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - - # Allow large uploads for API too - client_max_body_size 50M; - } - - # API routes for new multi-upload features - location /api/upload { - proxy_pass http://image-uploader-backend:5000/upload; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - - # Allow large uploads for batch upload + + # Allow large uploads for batch upload endpoints client_max_body_size 100M; } - - # API - Download original images - location /api/download { - proxy_pass http://image-uploader-backend:5000/download; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # API - Preview/thumbnail images (optimized for gallery views) - location /api/previews { - proxy_pass http://image-uploader-backend:5000/previews; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # API - Groups (NO PASSWORD PROTECTION) - location /api/groups { - proxy_pass http://image-uploader-backend:5000/groups; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # API - Social Media Consent Management (NO PASSWORD PROTECTION) - location /api/social-media { - proxy_pass http://image-uploader-backend:5000/api/social-media; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # API - Management Portal (NO PASSWORD PROTECTION - Token-based auth) - location /api/manage { - proxy_pass http://image-uploader-backend:5000/api/manage; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Admin API routes (NO password protection - protected by /moderation page access) - location /api/admin { - proxy_pass http://image-uploader-backend:5000/api/admin; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } # Protected API - Moderation API routes (password protected) - must come before /groups + # Keep this route protected and proxy to backend if moderation endpoints exist there. location /moderation/groups { auth_basic "Restricted Area - Moderation API"; auth_basic_user_file /etc/nginx/.htpasswd; - + proxy_pass http://image-uploader-backend:5000/moderation/groups; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/frontend/src/Components/Pages/GroupsOverviewPage.js b/frontend/src/Components/Pages/GroupsOverviewPage.js index bf2dbae..4594f1f 100644 --- a/frontend/src/Components/Pages/GroupsOverviewPage.js +++ b/frontend/src/Components/Pages/GroupsOverviewPage.js @@ -55,7 +55,7 @@ function GroupsOverviewPage() { }; const handleCreateNew = () => { - navigate('/multi-upload'); + navigate('/'); }; // removed unused local helpers (formatDate, handleGoHome) to clear ESLint warnings