using System; using System.Linq; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Users; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von gespeicherten Authentifizierungs-Ticktes ermöglicht /// public class PersistedTicketService : ServiceBase, IPersistedTicketService { /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork /// Instanz eines IConfiguration public PersistedTicketService(IUnitOfWork unitOfWork) : base(unitOfWork) { } /// /// Löscht alle abgelaufenen Tickets /// /// true wenn erfolgreich, false sonst public async Task RemoveExpiredAsync() { var items = await Repository.FindAsync(c => c.Expires < DateTimeOffset.UtcNow).ConfigureAwait(false); if (items.Any()) { Repository.RemoveRange(items); return true; } return false; } /// /// Speichern eines Tickets. /// Wenn es noch nicht existiert, wird es angelegt. /// Wenn es existiert, wird es aktualisiert /// /// Key des Tickes /// Benutzername /// Ticket als Byte-Array /// Ablaufdatum des Tickets /// Task public async Task SaveAsync(string key, string userId, byte[] ticket, DateTimeOffset? expires) { var item = await Repository.FirstOrDefaultAsync(c => c.Key == key).ConfigureAwait(false); if (item != null) { item.Ticket = ticket; item.Expires = expires; } else { var persistedTicket = new PersistedTicket() { Key = key, UserId = userId, Expires = expires, Ticket = ticket }; Repository.Add(persistedTicket); } } /// /// Löschen eines Tickets aus dem Store /// /// Key des Tickets /// true wenn erfolgreich, false sonst public async Task RemoveAsync(string key) { var item = await Repository.FirstOrDefaultAsync(c => c.Key == key).ConfigureAwait(false); if (item != null) { Repository.Remove(item); return true; } return false; } } }