🎯 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
🎯 UI (Opzionale - FASE 4)
✅ Acceptance Criteria
🔗 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
🎯 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:📦 Servizio da Implementare
IAuditQueryService+AuditQueryServiceMetodi principali (proposta):
📋 Tasks
IAuditQueryServiceinPTRP.Services/Interfaces/AuditQueryFilter,AuditEntryDto,AuditOperationTypeinPTRP.Models/DTOs/AuditQueryServiceinPTRP.Services/docs/SECURITY.md- sezione Audit Trail🎯 UI (Opzionale - FASE 4)
AuditLogViewcon DataGrid e filtri avanzati✅ Acceptance Criteria
GetPatientHistoryAsyncmostra tutte le modifiche a un paziente nel periodo specificatoGetOperatorActionsAsyncmostra tutte le azioni di un operatore🔗 Riferimenti
docs/SECURITY.md- sezione "Audit e Tracciabilità"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