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);
}
}
}