Files
recipe-app/.kilo/plans/1779373874915-silent-star.md
T
Nils-Johan Gynther 8c9da36312
Test Suite / backend-pr-quick (push) Has been skipped
Test Suite / quick-import-pr-quick (push) Has been skipped
Test Suite / backend-full (push) Failing after 4m36s
Test Suite / flutter-quality (push) Failing after 40s
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
2026-05-21 22:19:50 +02:00

5.3 KiB

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:

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:

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:

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:

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:

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:

## 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.