Skip to content

feat: implementare AuditQueryService per filtri avanzati su audit trail #80

@artcava

Description

@artcava

🎯 Obiettivo

Estendere il supporto all'audit trail (#1) con un servizio dedicato per query avanzate e filtrate su storico modifiche, facilitando analisi forensi, troubleshooting e compliance.

📋 Contesto

L'issue #1 introduce l'audit trail base con campi CreatedBy, UpdatedBy, Version, SyncPacketId. Per utilizzo reale servono:

  • Filtri per periodo temporale ("mostrami modifiche ultimi 7 giorni")
  • Filtri per operatore ("cosa ha fatto l'educatore Bianchi oggi?")
  • Filtri per paziente/progetto ("storico modifiche del paziente Rossi")
  • Filtri per tipo operazione (Create/Update/Delete)
  • Export audit log in formato strutturato (JSON/CSV)

📦 Servizio da Implementare

IAuditQueryService + AuditQueryService

Metodi principali (proposta):

public interface IAuditQueryService
{
    // Query generiche
    Task<IReadOnlyList<AuditEntryDto>> QueryAuditLogAsync(
        AuditQueryFilter filter,
        CancellationToken ct = default);
    
    // Query specifiche per entità
    Task<IReadOnlyList<AuditEntryDto>> GetPatientHistoryAsync(
        Guid patientId,
        DateTime? from = null,
        DateTime? to = null,
        CancellationToken ct = default);
    
    Task<IReadOnlyList<AuditEntryDto>> GetProjectHistoryAsync(
        Guid projectId,
        DateTime? from = null,
        DateTime? to = null,
        CancellationToken ct = default);
    
    // Query per operatore
    Task<IReadOnlyList<AuditEntryDto>> GetOperatorActionsAsync(
        Guid operatorId,
        DateTime? from = null,
        DateTime? to = null,
        CancellationToken ct = default);
    
    // Export
    Task<string> ExportAuditLogAsJsonAsync(
        AuditQueryFilter filter,
        CancellationToken ct = default);
    
    Task<string> ExportAuditLogAsCsvAsync(
        AuditQueryFilter filter,
        CancellationToken ct = default);
}

public record AuditQueryFilter(
    DateTime? FromDate,
    DateTime? ToDate,
    Guid? OperatorId,
    Guid? EntityId,
    string? EntityType, // "Patient", "TherapyProject", "ActualVisit", etc.
    AuditOperationType? OperationType,
    Guid? SyncPacketId
);

public enum AuditOperationType
{
    Create,
    Update,
    Delete
}

public record AuditEntryDto(
    Guid EntityId,
    string EntityType,
    AuditOperationType Operation,
    string PerformedBy,
    DateTime PerformedAt,
    int Version,
    Guid? SyncPacketId,
    string? ChangesSummary // JSON o descrizione testuale delle modifiche
);

📋 Tasks

  • Definire IAuditQueryService in PTRP.Services/Interfaces/
  • Definire AuditQueryFilter, AuditEntryDto, AuditOperationType in PTRP.Models/DTOs/
  • Implementare AuditQueryService in PTRP.Services/
  • Implementare query filtrate su entità auditate (Patient, TherapyProject, ScheduledVisit, ActualVisit)
  • Implementare export JSON/CSV con serializzazione corretta
  • Ottimizzare query con indici su campi audit (CreatedAt, UpdatedAt, CreatedBy, EntityId)
  • Registrare servizio in DI container
  • Aggiungere unit tests per filtri complessi
  • Documentare uso in docs/SECURITY.md - sezione Audit Trail

🎯 UI (Opzionale - FASE 4)

  • Creare AuditLogView con DataGrid e filtri avanzati
  • Permettere export da UI (bottone "Esporta Audit Log")
  • Collegare a menu "Report" o "Impostazioni" nella sidebar

✅ Acceptance Criteria

  • Possibile filtrare audit log per data, operatore, entità, tipo operazione
  • GetPatientHistoryAsync mostra tutte le modifiche a un paziente nel periodo specificato
  • GetOperatorActionsAsync mostra tutte le azioni di un operatore
  • Export JSON produce file valido e leggibile
  • Export CSV importabile in Excel/LibreOffice
  • Query performanti anche con migliaia di record audit (usare pagination se necessario)
  • Test coverage ≥ 70% per logiche di filtro

🔗 Riferimenti


CLUSTER: Domain & Data (gap 5.1)
FASE: 3 o 4 - Sync/Security o Polish
PRIORITÀ: 🔵 MEDIA
DIPENDENZE: #1 (audit trail base)
OPZIONALE: Può essere posticipata dopo il core funzionale

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions