using AutoMapper; using Microsoft.EntityFrameworkCore; using OrdersManagementDataModel.Dtos; using OrdersManagementDataModel.Entities; namespace OrdersManagementDataModel.Services; public class UserService(OrdersManagementDbContext context, IMapper mapper) : IUserService { public async Task> GetAll() { IList users = await context.Users.Select(x => mapper.Map(x)).ToListAsync(); return users; } public async Task GetById(Guid id) { UserDto? user = await context.Users.Where(x => x.RowPointer == id) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); return user; } public async Task GetByUsername(string username) { UserDto? user = await context.Users.Where(x => x.Login == username) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); return user; } public async Task Add(UserDto userDto) { User user = new User { Login = userDto.Login, PasswordHash = userDto.PasswordHash, IsTemporaryPassword = true, IsActive = true, Email = userDto.Email, RowPointer = Guid.NewGuid(), CreatedDate = DateTime.Now, ActiveFrom = DateTime.Now, FirstName = userDto.FirstName, LastName = userDto.LastName }; context.Users.Add(user); return await context.SaveChangesAsync(); } public async Task Update(UserDto userDto) { User user = mapper.Map(userDto); context.Users.Update(user); return await context.SaveChangesAsync(); } public async Task Login(UserDto userDto) { User? user = context.Users.FirstOrDefault(x => x.Id == userDto.Id); if (user is null) return 0; user.LastLoginDate = DateTime.Now; user.FailedLoginAttempts = 0; context.Users.Update(user); return await context.SaveChangesAsync(); } public async Task Delete(Guid id) { User? user = await context.Users.Where(x => x.RowPointer == id).FirstOrDefaultAsync() ?? null; if (user == null) return 0; context.Users.Remove(user); return await context.SaveChangesAsync(); } public async Task> GetUserRoles(Guid userId) { List userRoles = await context.Users .Where(x => x.RowPointer == userId) .SelectMany(x => x.UserRoles) .Select(x => mapper.Map(x)) .ToListAsync(); return userRoles; } public async Task GetUserByLoginAndPassword(string login, string password) { UserDto? user = await context.Users.Where(x => x.Login == login && x.PasswordHash == password) .Select(x => mapper.Map(x)).FirstOrDefaultAsync(); return user; } }