/// <inheritdoc/> public virtual async Task <IReadOnlyCollection <ServerSideSession> > GetSessionsAsync(SessionFilter filter, CancellationToken cancellationToken = default) { cancellationToken = cancellationToken == CancellationToken.None ? CancellationTokenProvider.CancellationToken : cancellationToken; filter.Validate(); var entities = await Filter(Context.ServerSideSessions.AsNoTracking().AsQueryable(), filter) .ToArrayAsync(cancellationToken); entities = Filter(entities.AsQueryable(), filter).ToArray(); var results = entities.Select(entity => new ServerSideSession { Key = entity.Key, Scheme = entity.Scheme, SubjectId = entity.SubjectId, SessionId = entity.SessionId, DisplayName = entity.DisplayName, Created = entity.Created, Renewed = entity.Renewed, Expires = entity.Expires, Ticket = entity.Data, }).ToArray(); Logger.LogDebug("Found {serverSideSessionCount} server-side sessions for {@filter}", results.Length, filter); return(results); }
/// <inheritdoc/> public virtual async Task DeleteSessionsAsync(SessionFilter filter, CancellationToken cancellationToken = default) { cancellationToken = cancellationToken == CancellationToken.None ? CancellationTokenProvider.CancellationToken : cancellationToken; filter.Validate(); var entities = await Filter(Context.ServerSideSessions.AsQueryable(), filter) .ToArrayAsync(cancellationToken); entities = Filter(entities.AsQueryable(), filter).ToArray(); Context.ServerSideSessions.RemoveRange(entities); try { await Context.SaveChangesAsync(cancellationToken); Logger.LogDebug("Removed {serverSideSessionCount} server-side sessions from database for {@filter}", entities.Length, filter); } catch (DbUpdateConcurrencyException ex) { Logger.LogInformation("Error removing {serverSideSessionCount} server-side sessions from database for {@filter}: {error}", entities.Length, filter, ex.Message); } }