using Microsoft.EntityFrameworkCore; using mws.backend.dotnet.application.Common; using mws.backend.dotnet.application.Common.Repositories; using mws.backend.dotnet.application.Users; using mws.backend.dotnet.domain.Users; namespace mws.backend.dotnet.infrastructure.Persistence.Repositories; public class UserRepository(AppDbContext db) : RepositoryBase(db), IUserRepository { public Task GetByIdAsync(Guid id, CancellationToken ct = default) => Set.FirstOrDefaultAsync(u => u.Id == id, ct); public Task GetByIdWithRoleAsync(Guid id, CancellationToken ct = default) => Set.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).FirstOrDefaultAsync(u => u.Id == id, ct); public Task GetByUsernameWithRoleAsync(string username, CancellationToken ct = default) => Set.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).SingleOrDefaultAsync(u => u.Username == username, ct); public Task ExistsByUsernameAsync(string username, CancellationToken ct = default) => Set.AnyAsync(u => u.Username == username, ct); public Task ExistsByRoleIdAsync(Guid roleId, CancellationToken ct = default) => Db.UserRoles.AnyAsync(ur => ur.RoleId == roleId, ct); public Task> GetRoleIdsAsync(Guid userId, CancellationToken ct = default) => Db.UserRoles.Where(ur => ur.UserId == userId).Select(ur => ur.RoleId).ToListAsync(ct); public Task> SearchWithRoleAsync(string? term, int? take, CancellationToken ct = default) { var query = Set.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).AsQueryable(); if (!string.IsNullOrWhiteSpace(term)) { var lower = term.Trim().ToLower(); query = query.Where(u => u.Username.ToLower().Contains(lower) || u.DisplayName.ToLower().Contains(lower)); } query = query.OrderBy(u => u.DisplayName); if (take is { } n) { query = query.Take(n); } return query.ToListAsync(ct); } public Task> SearchWithRolePagedAsync(UserListFilter filter, int page, int pageSize, CancellationToken ct = default) { var query = Set.Include(u => u.UserRoles).ThenInclude(ur => ur.Role).AsQueryable(); if (!string.IsNullOrWhiteSpace(filter.Term)) { var lower = filter.Term.Trim().ToLower(); query = query.Where(u => u.Username.ToLower().Contains(lower) || u.DisplayName.ToLower().Contains(lower)); } if (filter.IsActive is { } active) { query = query.Where(u => u.IsActive == active); } return query.OrderBy(u => u.DisplayName).ToPagedResultAsync(page, pageSize, ct); } }