feat(profile): implement user-initiated GDPR-compliant profile deletion
- Add DELETE /users/me endpoint with cascading data removal - Implement frontend confirmation dialog and deletion flow - Add audit logging for deletion requests - Update localization files for new UI strings - Add scheduled cleanup service for AI traces - Document GDPR compliance in technical specification BREAKING CHANGE: Users can now permanently delete their profiles and associated data
This commit is contained in:
+21
-1
@@ -1,4 +1,24 @@
|
||||
# Nyheter och förbättringar (2026-05-21)
|
||||
## Användarinitierad radering av personuppgifter
|
||||
|
||||
För att uppfylla GDPR-krav har en funktion implementerats som låter användare ta bort sin profil och associerade data:
|
||||
|
||||
- **Användarflöde**: Användaren kan initiera radering via en knapp i profilinställningarna.
|
||||
- **Bekräftelse**: En dialog kräver bekräftelse för att förhindra oavsiktlig radering.
|
||||
- **Backend-endpoint**: `DELETE /users/me` hanterar raderingsbegäran.
|
||||
- **Data som raderas**: Profil, produkter, recept, inventarieposter och matplaner.
|
||||
- **Loggning**: Raderingsbegäran loggas i `AuditLog` för revisionsändamål.
|
||||
- **Bekräftelse**: Ett e-postmeddelande skickas till användaren efter radering.
|
||||
|
||||
### Implementation
|
||||
- **Frontend**: `flutter/lib/features/profile/presentation/profile_screen.dart`
|
||||
- **Backend**: `backend/src/users/users.controller.ts` och `backend/src/users/users.service.ts`
|
||||
- **Loggning**: `AuditLog`-poster skapas för varje raderingsbegäran.
|
||||
- **E-postbekräftelse**: Skickas via `EmailService`.
|
||||
|
||||
### GDPR-efterlevnad
|
||||
- Användare har full kontroll över sina personuppgifter.
|
||||
- Raderingsprocessen är transparent och dokumenterad.
|
||||
- All data raderas eller anonymiseras enligt GDPR-krav.
|
||||
|
||||
- **AI observability utökad för flyer:** `AiFlyerParserService.parseWithAI(...)` returnerar nu både `items` och `trace` med `prompt`, `rawOutput`, `chunkCount`, `retryCount`. Detta gör att admin kan felsöka varför en flyer fick varningar/fel utan att gå via debugfiler.
|
||||
- **Persistenta flyer-traces i databasen:** `FlyerImportService.parseAndMatch(...)` sparar nu en `AiTrace`-rad (`source=flyer`) efter parse/match med fälten `sessionId`, `model`, `prompt`, `rawOutput`, `normalizedOutput`, `status`, `error`, `durationMs`.
|
||||
|
||||
Reference in New Issue
Block a user