using Imprink.Domain.Entities.Users; using Imprink.Domain.Models; using Imprink.Domain.Repositories; using Imprink.Infrastructure.Database; using Microsoft.EntityFrameworkCore; namespace Imprink.Infrastructure.Repositories; public class UserRepository(ApplicationDbContext context) : IUserRepository { public async Task UpdateOrCreateUserAsync(Auth0User user, CancellationToken cancellationToken = default) { var userToUpdate = await context.Users .Where(u => u.Id.Equals(user.Sub)) .FirstOrDefaultAsync(cancellationToken); if (userToUpdate == null) { var newUser = new User { Id = user.Sub, Email = user.Email, EmailVerified = user.EmailVerified, Name = user.Name, Nickname = user.Nickname, IsActive = true }; context.Users.Add(newUser); } else { userToUpdate.Email = user.Email; userToUpdate.Name = user.Name; userToUpdate.Nickname = user.Nickname; userToUpdate.EmailVerified = user.EmailVerified; } return true; } public async Task GetUserByIdAsync(string userId, CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.Id == userId, cancellationToken); } public async Task GetUserByEmailAsync(string email, CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .FirstOrDefaultAsync(u => u.Email == email, cancellationToken); } public async Task> GetAllUsersAsync(CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .ToListAsync(cancellationToken); } public async Task> GetActiveUsersAsync(CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .Where(u => u.IsActive) .ToListAsync(cancellationToken); } public async Task UserExistsAsync(string userId, CancellationToken cancellationToken = default) { return await context.Users .AnyAsync(u => u.Id == userId, cancellationToken); } public async Task> GetUsersByRoleAsync(Guid roleId, CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .Where(u => u.UserRoles.Any(ur => ur.RoleId == roleId)) .ToListAsync(cancellationToken); } public async Task GetUserWithAllRelatedDataAsync(string userId, CancellationToken cancellationToken = default) { return await context.Users .AsNoTracking() .Include(u => u.Addresses) .Include(u => u.UserRoles) .ThenInclude(ur => ur.Role) .Include(u => u.Orders) .FirstOrDefaultAsync(u => u.Id == userId, cancellationToken); } }