using Microsoft.EntityFrameworkCore; using UserManagement.Domain.Entities; using UserManagement.Infrastructure.Interfaces; namespace UserManagement.Infrastructure.Repositories { public class UserRepository : IUserRepository { // CTOR private readonly ApplicationDbContext _context; public UserRepository(ApplicationDbContext context) { _context = context; } // CREATE public async Task AddAsync(User user) { await _context.Users.AddAsync(user); await _context.SaveChangesAsync(); return user; } // READ ALL public async Task> GetAllAsync(bool includeRoles = true) { var query = _context.Users.AsNoTracking(); if (includeRoles) query = query.Include(user => user.UserRoles)!.ThenInclude(ur => ur.Role); return await query.ToListAsync(); } // READ BY ID public async Task GetByIdAsync(int id, bool includeRoles = true) { var query = _context.Users.AsNoTracking(); if (includeRoles) query = query.Include(user => user.UserRoles)!.ThenInclude(ur => ur.Role); return await query.FirstOrDefaultAsync(u => u.Id == id); } // READ BY USERNAME public async Task GetByUsernameAsync(string username, bool includeRoles = true) { var query = _context.Users.AsNoTracking(); if (includeRoles) query = query.Include(user => user.UserRoles)!.ThenInclude(ur => ur.Role); return await query.FirstOrDefaultAsync(u => u.UserName == username); } // READ BY ROLE public async Task> GetByRoleAsync(string role) { var query = _context.Users .Include(u => u.UserRoles)! .ThenInclude(ur => ur.Role) .Where(ur => ur.UserRoles!.Any(r => r.Role!.Name == role)); return await query.ToListAsync(); } // UPDATE public async Task UpdateAsync(User user) { _context.Entry(user).State = EntityState.Modified; var results = await _context.SaveChangesAsync(); return results > 0; } // DELETE public async Task DeleteAsync(User user) { _context.Users.Remove(user); var result = await _context.SaveChangesAsync(); return result > 0; } } }