gehgassi_backend/gehGassi.Core/Services/PersistedTicketService.cs

87 lines
2.9 KiB
C#

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