8c9da36312
- 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
155 lines
5.3 KiB
Markdown
155 lines
5.3 KiB
Markdown
# Plan: Implementera automatiserad datarensning för AiTrace
|
|
|
|
## Mål
|
|
Implementera en automatiserad rensning av gamla `AiTrace`-poster för att säkerställa att känsliga data inte lagras längre än nödvändigt och för att följa GDPR-krav.
|
|
|
|
## Bakgrund
|
|
- `AiTrace`-tabellen lagrar känsliga data (t.ex. maskerade promptar och AI-svar) utan någon retention-policy.
|
|
- Risk för att data ackumuleras obehindrat, vilket kan leda till lagringsproblem och GDPR-brott.
|
|
- Enligt GDPR bör känsliga data rensas efter en viss tid om de inte längre behövs för felsökning eller analys.
|
|
|
|
## Krav
|
|
1. Rensa `AiTrace`-poster äldre än 30 dagar.
|
|
2. Schemalägg rensningen att köra dagligen vid midnatt.
|
|
3. Logga antalet rensade poster för övervakning.
|
|
4. Säkerställa att rensningen inte påverkar systemets prestanda.
|
|
|
|
## Implementeringsplan
|
|
|
|
### Steg 1: Installera beroenden
|
|
Installera `NestJS Schedule`-modulen för att möjliggöra schemalagda jobb.
|
|
|
|
**Kommando:**
|
|
```bash
|
|
npm install @nestjs/schedule
|
|
```
|
|
|
|
### Steg 2: Konfigurera ScheduleModule
|
|
Lägg till `ScheduleModule` i `AppModule` för att aktivera schemalagda jobb.
|
|
|
|
**Fil:** `backend/src/app.module.ts`
|
|
**Ändring:**
|
|
```typescript
|
|
import { ScheduleModule } from '@nestjs/schedule';
|
|
|
|
@Module({
|
|
imports: [ScheduleModule.forRoot()],
|
|
})
|
|
export class AppModule {}
|
|
```
|
|
|
|
### Steg 3: Skapa AiTraceCleanupService
|
|
Skapa en ny tjänst för att hantera rensningen av `AiTrace`-poster.
|
|
|
|
**Fil:** `backend/src/ai/ai-trace-cleanup.service.ts`
|
|
**Innehåll:**
|
|
```typescript
|
|
import { Injectable, Logger } from '@nestjs/common';
|
|
import { Cron, CronExpression } from '@nestjs/schedule';
|
|
import { PrismaService } from '../prisma/prisma.service';
|
|
|
|
@Injectable()
|
|
export class AiTraceCleanupService {
|
|
private readonly logger = new Logger(AiTraceCleanupService.name);
|
|
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
@Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
|
|
async cleanupOldTraces() {
|
|
this.logger.log('Starting cleanup of old AiTrace records...');
|
|
const thirtyDaysAgo = new Date();
|
|
thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
|
|
|
|
const result = await this.prisma.aiTrace.deleteMany({
|
|
where: {
|
|
createdAt: {
|
|
lt: thirtyDaysAgo,
|
|
},
|
|
},
|
|
});
|
|
|
|
this.logger.log(`Cleaned up ${result.count} old AiTrace records.`);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Steg 4: Registrera AiTraceCleanupService
|
|
Lägg till `AiTraceCleanupService` i `AiTraceModule` för att aktivera tjänsten.
|
|
|
|
**Fil:** `backend/src/ai/ai-trace.module.ts`
|
|
**Ändring:**
|
|
```typescript
|
|
import { AiTraceCleanupService } from './ai-trace-cleanup.service';
|
|
|
|
@Module({
|
|
providers: [AiTraceService, AiTraceCleanupService],
|
|
})
|
|
export class AiTraceModule {}
|
|
```
|
|
|
|
### Steg 5: Testa rensningen manuellt
|
|
Skapa en testmetod för att manuellt köra rensningen och verifiera att den fungerar som förväntat.
|
|
|
|
**Fil:** `backend/src/ai/ai-trace.controller.ts`
|
|
**Ändring:**
|
|
```typescript
|
|
import { AiTraceCleanupService } from './ai-trace-cleanup.service';
|
|
|
|
@Controller('ai/traces')
|
|
export class AiTraceController {
|
|
constructor(
|
|
private readonly aiTraceService: AiTraceService,
|
|
private readonly aiTraceCleanupService: AiTraceCleanupService,
|
|
) {}
|
|
|
|
@Post('cleanup')
|
|
@Roles('admin')
|
|
async manualCleanup() {
|
|
await this.aiTraceCleanupService.cleanupOldTraces();
|
|
return { success: true, message: 'Manual cleanup completed.' };
|
|
}
|
|
}
|
|
```
|
|
|
|
### Steg 6: Verifiera implementationen
|
|
1. Skapa några testposter i `AiTrace`-tabellen med olika `createdAt`-datum.
|
|
2. Kör den manuella rensningen via `POST /api/ai/traces/cleanup`.
|
|
3. Verifiera att endast poster äldre än 30 dagar har rensats.
|
|
4. Kontrollera loggarna för att säkerställa att antalet rensade poster loggas korrekt.
|
|
|
|
### Steg 7: Dokumentera ändringarna
|
|
Uppdatera `TEKNISK_BESKRIVNING.md` med information om den automatiserade rensningen.
|
|
|
|
**Fil:** `TEKNISK_BESKRIVNING.md`
|
|
**Ändring:**
|
|
```markdown
|
|
## Automatiserad datarensning för AiTrace
|
|
|
|
För att säkerställa att känsliga data inte lagras längre än nödvändigt, har en automatiserad rensning implementerats:
|
|
|
|
- **Rensningsintervall**: Dagligen vid midnatt.
|
|
- **Retention-period**: 30 dagar.
|
|
- **Loggning**: Antalet rensade poster loggas för övervakning.
|
|
|
|
### Implementation
|
|
- **Tjänst**: `AiTraceCleanupService` i `backend/src/ai/ai-trace-cleanup.service.ts`.
|
|
- **Schemaläggning**: Använder `@nestjs/schedule` för att köra rensningen dagligen.
|
|
- **Manuell rensning**: Tillgänglig via `POST /api/ai/traces/cleanup` (kräver admin-behörighet).
|
|
|
|
### GDPR-efterlevnad
|
|
- Rensningen säkerställer att känsliga data raderas efter 30 dagar, vilket uppfyller GDPR-krav på dataminimering.
|
|
- Användare kan begära att deras data raderas tidigare via admin-panelen.
|
|
```
|
|
|
|
## Frågor och överväganden
|
|
1. **Retention-period**: Är 30 dagar en lämplig period, eller bör den justeras baserat påelsökningsbehov?
|
|
2. **Loggning**: Bör loggarna för rensningen sparas längre för revisionsändamål?
|
|
3. **Prestanda**: Bör rensningen köra under lågtrafikperioder för att minimera påverkan på systemet?
|
|
|
|
## Nästa steg
|
|
1. Implementera planen enligt ovan.
|
|
2. Testa rensningen i en testmiljö.
|
|
3. Verifiera att loggarna är korrekta och att rensningen fungerar som förväntat.
|
|
4. Dokumentera ändringarna i `TEKNISK_BESKRIVNING.md`.
|
|
5. Informera teamet om den nya funktionaliteten och dess påverkan på GDPR-efterlevnaden.
|