using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Moonlight.Api.Database; using Moonlight.Api.Database.Entities; using Moonlight.Api.Interfaces; namespace Moonlight.Api.Services; public class UserLogoutService { private readonly DatabaseRepository Repository; private readonly IEnumerable Hooks; private readonly IMemoryCache Cache; public UserLogoutService( DatabaseRepository repository, IEnumerable hooks, IMemoryCache cache ) { Repository = repository; Hooks = hooks; Cache = cache; } public async Task LogoutAsync(int userId) { var user = await Repository .Query() .FirstOrDefaultAsync(x => x.Id == userId); if(user == null) throw new AggregateException($"User with id {userId} not found"); foreach (var hook in Hooks) await hook.ExecuteAsync(user); user.InvalidateTimestamp = DateTimeOffset.UtcNow; await Repository.UpdateAsync(user); Cache.Remove(string.Format(UserAuthService.CacheKeyPattern, userId)); } }