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