using DigitalData.Core.Infrastructure; using DigitalData.UserManager.Domain.Entities; using DigitalData.UserManager.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; namespace DigitalData.UserManager.Infrastructure.Repositories { public class UserRepository : CRUDRepository, IUserRepository where TDbContext : DbContext, IUserManagerDbContext { private readonly IModuleOfUserRepository _moduleOfUserRepo; private readonly IGroupOfUserRepository _groupOfUserRepo; private readonly IUserRepRepository _uRepRepo; public UserRepository(TDbContext dbContext, IModuleOfUserRepository moduleOfUserRepo, IGroupOfUserRepository groupOfUserRepo, IUserRepRepository userRepRepository) : base(dbContext, dbContext.Users) { _moduleOfUserRepo = moduleOfUserRepo; _groupOfUserRepo = groupOfUserRepo; _uRepRepo = userRepRepository; } public async Task> ReadByModuleIdAsync(int moduleId) { var mous = _moduleOfUserRepo.ReadByModuleId(moduleId).Select(mos => mos.UserId); return await _dbSet.Where(u => mous.Contains(u.Id)).ToListAsync(); } public async Task> ReadByGroupIdAsync(int groupId) { var gous = _groupOfUserRepo.ReadByGroupId(groupId).Select(gou => gou.UserId); return await _dbSet.Where(u => gous.Contains(u.Id)).ToListAsync(); } public async Task> ReadUnassignedByModuleIdAsync(int moduleId) { var mous = _moduleOfUserRepo.ReadByModuleId(moduleId).Select(mos => mos.UserId); return await _dbSet.Where(u => !mous.Contains(u.Id)).ToListAsync(); } public async Task> ReadUnassignedByGroupIdAsync(int groupId) { var gous = _groupOfUserRepo.ReadByGroupId(groupId).Select(gou => gou.UserId); return await _dbSet.Where(u => !gous.Contains(u.Id)).ToListAsync(); } public async Task ReadByUsernameAsync(string username) { return await _dbSet.Where(user => user.Username == username).FirstOrDefaultAsync(); } //TODO: instead of this implmenet .OnDelete(DeleteBehavior.ClientCascade) in DbContext public override async Task DeleteAsync(User user) { var mou = await _moduleOfUserRepo.ReadByUserAsync(user.Username); if (mou.Any()) _dbContext.RemoveRange(mou); var gou = await _groupOfUserRepo.ReadByUsernameAsync(user.Username); if (gou.Any()) _dbContext.RemoveRange(gou); var uRep_list = await _uRepRepo.ReadAllAsync(userId: user.Id); if (uRep_list.Any()) _dbContext.RemoveRange(uRep_list); uRep_list = await _uRepRepo.ReadAllAsync(repUserId: user.Id); if (uRep_list.Any()) _dbContext.RemoveRange(uRep_list); return await base.DeleteAsync(user); } } }