using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Common; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von Audits realisiert /// public class AuditService : ServiceBase, IAuditService { private readonly IRepository _auditWithNamesRepository; /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public AuditService(IUnitOfWork unitOfWork) : base(unitOfWork) { _auditWithNamesRepository = unitOfWork.GetRepository(); } /// /// Gibt eine gefilterte Liste von audits zurück /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Kunden public IQueryable Filter(string filter) { return Repository.Query(c => c.Table.Contains(filter) || c.UserName.Contains(filter)); } /// /// Gibt eine Liste von Audits zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// Liste von audits public async Task> GetListAsync(string key, string table) { return (await Repository.FindAsync(c => c.Key == key && c.Table == table)).ToList(); } /// /// Gibt eine Liste von Audits zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// /// Durchgeführte Aktion /// Liste von audits public async Task> GetListAsync(string key, string table, AuditAction action) { return (await Repository.FindAsync(c => c.Key == key && c.Table == table && c.Action == action)).ToList(); } /// /// Gibt einen Audit-Eintrag zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// /// Durchgeführte Aktion /// public async Task GetAsync(string key, string table, AuditAction action) { return await Repository.FirstOrDefaultAsync(c => c.Key == key && c.Table == table && c.Action == action); } /// /// Gibt eine gefilterte Liste von audits zurück /// /// Filterbegriff der in bestimmten Feldern gesucht wird /// List betroffener Kunden public IQueryable FilterWithNames(string filter) { return _auditWithNamesRepository.Query(c => c.Table.Contains(filter) || c.UserName.Contains(filter)); } /// /// Gibt eine Liste von Audits zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// Liste von audits public async Task> GetListWithNamesAsync(string key, string table) { return (await _auditWithNamesRepository.FindAsync(c => c.Key == key && c.Table == table)).ToList(); } /// /// Gibt eine Liste von Audits zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// /// Durchgeführte Aktion /// Liste von audits public async Task> GetListWithNamesAsync(string key, string table, AuditAction action) { return (await _auditWithNamesRepository.FindAsync(c => c.Key == key && c.Table == table)).ToList(); } /// /// Gibt einen Audit-Eintrag zurück /// /// Key des Objektes /// Typ des Objektes (Table) /// /// Durchgeführte Aktion /// public async Task GetWithNamesAsync(string key, string table, AuditAction action) { return await _auditWithNamesRepository.FirstOrDefaultAsync(c => c.Key == key && c.Table == table && c.Action == action); } /// /// Löschen von Audit-Einträgen /// /// Key des Objektes /// Typ des Objektes (Table) /// Anzahl gelöschte Daten public async Task DeleteAsync(string key, string table) { return await Repository.ExecuteRawSqlAsync("DELETE FROM Audits WHERE [Key] = @key AND [Table] = @table", new Dictionary { { "@key", key }, { "@table", table } }); } /// /// Anonymisieren von Audit-Einträgen /// /// Key des Objektes /// Typ des Objektes (Table) /// Anzahl anonymisierte Daten public async Task AnonymizeAsync(string key, string table) { var anonymized = $"{{\"AnonymizedDate\":\"{DateTimeOffset.UtcNow:O}\"}}"; return await Repository.ExecuteRawSqlAsync("UPDATE Audits SET OldValues = @anonymized, NewValues = @anonymized WHERE [Key] = @key AND [Table] = @table", new Dictionary { { "@anonymized", anonymized }, { "@key", key }, { "@table", table } }); } /// /// Loggen des Zugriffs eines Users auf einen Datensatz /// /// Key des Objektes /// Typ des Objektes (Table) /// Benutzer der den Zugriff durchgeführt hat /// Task public async Task LogAccessAsync(string key, string table, string userName) { var audit = new Audit() { Key = key, Table = table, UserName = userName, Action = AuditAction.Access, DateTime = DateTimeOffset.UtcNow, KeyValues = string.Empty, OldValues = string.Empty, NewValues = string.Empty }; Repository.Add(audit); await CommitAsync(userName); } } }