using System.Security.Claims; using Distribution.Data; using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; namespace Distribution.Infra.Authorization; public class CurrentUserService(IHttpContextAccessor http, AppDBContext db, IMemoryCache cache) : ICurrentUserService { private ClaimsPrincipal? User => http.HttpContext?.User; public bool IsAuthenticated => User?.Identity?.IsAuthenticated ?? false; public Guid? UserId => Guid.TryParse(User?.FindFirst("UserId")?.Value, out var id) ? id : null; public Guid? RoleId => Guid.TryParse(User?.FindFirst("RoleId")?.Value, out var id) ? id : null; public async Task GetUsernameAsync() { if (UserId is not { } id) return null; var key = $"user_rolename_{id}"; if (cache.TryGetValue(key, out string? cached)) return cached; var user = await db.Users.AsNoTracking().FirstOrDefaultAsync(u => u.Id == id); cache.Set(key, user?.Username, TimeSpan.FromMinutes(10)); return user?.Username; } public async Task GetRoleCodeAsync() { if (RoleId is not { } id) return null; var key = $"role_name_{id}"; if (cache.TryGetValue(key, out string? cached)) return cached; var role = await db.Roles.AsNoTracking().FirstOrDefaultAsync(r => r.Id == id); cache.Set(key, role?.Name, TimeSpan.FromMinutes(10)); return role?.Name; } public async Task GetRoleLevelAsync() { if (RoleId is not { } id) return 0; var key = $"role_level_{id}"; if (cache.TryGetValue(key, out int cached)) return cached; var role = await db.Roles.AsNoTracking().FirstOrDefaultAsync(r => r.Id == id); var level = role?.Level ?? 0; cache.Set(key, level, TimeSpan.FromMinutes(10)); return level; } }