using CredentialManager.Models; namespace CredentialManager.Services; /// /// Interfaccia per il servizio di gestione delle associazioni basate sui valori delle chiavi /// public interface IKeyAssociationService { /// /// Salva una nuova associazione o aggiorna una esistente /// Task SaveAssociationAsync(KeyAssociation association); /// /// Versione thread-safe del SaveAssociationAsync che utilizza un DbContext separato per operazioni parallele /// Task SaveAssociationParallelAsync(KeyAssociation association); /// /// Cerca un'associazione esistente tramite valore chiave /// Task FindAssociationByKeyValueAsync(string keyValue, string destinationEntity, string restCredentialName); /// /// Cerca un'associazione esistente tramite valore chiave, indipendentemente dalla destinazione /// Task FindAssociationByKeyValueAsync(string keyValue); /// /// Ottiene tutte le associazioni per un'entità di destinazione specifica /// Task> GetAssociationsByDestinationAsync(string destinationEntity, string restCredentialName); /// /// Ottiene tutte le associazioni attive /// Task> GetAllActiveAssociationsAsync(); /// /// Ottiene tutte le associazioni (attive e non) /// Task> GetAllAssociationsAsync(); /// /// Aggiorna un'associazione esistente /// Task UpdateAssociationAsync(KeyAssociation association); /// /// Disattiva un'associazione /// Task DeactivateAssociationAsync(int id); /// /// Elimina definitivamente un'associazione /// Task DeleteAssociationAsync(int id); /// /// Pulisce le associazioni più vecchie di un determinato periodo /// Task CleanupOldAssociationsAsync(TimeSpan olderThan); /// /// Elimina tutte le associazioni per una specifica combinazione entità-credenziale /// Task ClearAssociationsAsync(string destinationEntity, string restCredentialName); /// /// Elimina tutte le associazioni nel sistema /// Task ClearAllAssociationsAsync(); /// /// Verifica se un ID di destinazione esiste ancora nel sistema target /// Task ValidateDestinationIdAsync(string destinationId, string destinationEntity, string restCredentialName); /// /// Ottiene tutte le associazioni con ID di destinazione non validi /// Task> GetInvalidAssociationsAsync(string destinationEntity, string restCredentialName); /// /// Pulisce le associazioni con ID di destinazione non più validi /// Task CleanupInvalidAssociationsAsync(string destinationEntity, string restCredentialName); /// /// Aggiorna la data di ultima verifica per un'associazione /// Task UpdateLastVerifiedAsync(int id); /// /// Ottiene statistiche sulle associazioni /// Task GetStatisticsAsync(); /// /// Versione thread-safe per operazioni parallele - Salva una associazione /// Task SaveAssociationParallelAsync(string keyValue, string destinationEntity, string destinationId, string restCredentialName); /// /// Versione thread-safe per operazioni parallele - Trova associazione per valore chiave /// Task FindAssociationByKeyValueParallelAsync(string keyValue, string destinationEntity, string restCredentialName); /// /// Versione thread-safe per operazioni parallele - Trova associazione per valore chiave (solo keyValue) /// Task FindAssociationByKeyValueParallelAsync(string keyValue); /// /// Versione bulk: ricerca in un colpo solo tutte le associazioni attive per la combinazione /// (KeyValue ∈ keyValues, DestinationEntity, RestCredentialName) usando una query SQL IN(...). /// Riduce drasticamente le query SQLite quando si processano molti record. /// Task> FindAssociationsByKeyValuesBulkAsync( IEnumerable keyValues, string destinationEntity, string restCredentialName); /// /// Versione thread-safe per operazioni parallele - Elimina associazione /// Task DeleteAssociationParallelAsync(int id); /// /// Marca le associazioni come cancellate dalla sorgente se i loro KeyValue non sono presenti nella lista fornita /// /// Lista dei KeyValue attualmente presenti nella sorgente /// Entità di destinazione /// Nome della credenziale REST /// Numero di associazioni marcate come cancellate Task MarkDeletedAssociationsAsync(List sourceKeyValues, string destinationEntity, string restCredentialName); /// /// Ottiene tutte le associazioni marcate come cancellate dalla sorgente ma non ancora sincronizzate /// Task> GetPendingDeletionsAsync(string destinationEntity, string restCredentialName); /// /// Marca una cancellazione come sincronizzata /// Task MarkDeletionSyncedAsync(int associationId); /// /// Ottiene tutte le associazioni marcate come cancellate /// Task> GetDeletedAssociationsAsync(string destinationEntity, string restCredentialName); } /// /// Statistiche sulle associazioni /// public class AssociationStatistics { public int TotalAssociations { get; set; } public int ActiveAssociations { get; set; } public int InactiveAssociations { get; set; } public int UniqueKeyValues { get; set; } public int UniqueDestinationEntities { get; set; } public DateTime? OldestAssociation { get; set; } public DateTime? NewestAssociation { get; set; } public Dictionary AssociationsByEntity { get; set; } = new(); }