/
ilyamikhaylov07
/
integration_solution_course
Обзор
Документация
Войти
/
ilyamikhaylov07
/
integration_solution_course
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
TaskAPI/Services/UsersService.cs
199 строк
6 KB
Ilya
Добавлен новый функционал по пользователю, пагинация, опциональные поля и внутреннее api для метрик
01 окт 2025, 09:24
01 окт 2025, 09:24
2d34a6d
Код
Авторство
О чём код?
using Microsoft.EntityFrameworkCore; using TaskAPI.Database; using TaskAPI.DTOs; using TaskAPI.DTOs.UsersDTOs; using TaskAPI.Models; namespace TaskAPI.Services { public class UsersService { private readonly TaskDbContext _context; public UsersService(TaskDbContext context) { _context = context; } public async Task<PagedResult<UserResponseDTO>> GetUsersPagedAsync(int page = 1, int pageSize = 10) { var query = _context.Users.AsNoTracking(); var totalCount = await query.CountAsync(); var users = await query .Include(u => u.Tasks) .ThenInclude(t => t.Project) .Skip((page - 1) * pageSize) .Take(pageSize) .Select(u => new UserResponseDTO { Id = u.Id, Username = u.Username, Email = u.Email, CreatedAt = u.CreatedAt, Tasks = u.Tasks.Select(t => new TaskBriefDTO { Id = t.Id, Title = t.Title, Description = t.Description, Status = t.Status, CreatedAt = t.CreatedAt, ProjectName = t.Project != null ? t.Project.Name : null }).ToList() }) .ToListAsync(); return new PagedResult<UserResponseDTO> { Page = page, PageSize = pageSize, TotalCount = totalCount, Items = users }; } public async Task<List<UserResponseDTO>> GetAllUserAsync(string? include = null) { var query = _context.Users.AsNoTracking(); var includeTasks = include?.Contains("tasks", StringComparison.OrdinalIgnoreCase) ?? false; if (includeTasks) query = query.Include(u => u.Tasks).ThenInclude(t => t.Project); var users = await query.ToListAsync(); return users.Select(u => new UserResponseDTO { Id = u.Id, Username = u.Username, Email = u.Email, CreatedAt = u.CreatedAt, Tasks = includeTasks ? u.Tasks.Select(t => new TaskBriefDTO { Id = t.Id, Title = t.Title, Description = t.Description, Status = t.Status, CreatedAt = t.CreatedAt, ProjectName = t.Project?.Name }).ToList() : new List<TaskBriefDTO>() }).ToList(); } public async Task<UserResponseDTO?> GetUserAsync(Guid id) { var user = await _context.Users .AsNoTracking() .Include(u => u.Tasks) .ThenInclude(t => t.Project) .FirstOrDefaultAsync(u => u.Id == id); if (user == null) return null; return new UserResponseDTO { Id = user.Id, Username = user.Username, Email = user.Email, CreatedAt = user.CreatedAt, Tasks = user.Tasks.Select(t => new TaskBriefDTO { Id = t.Id, Title = t.Title, Description = t.Description, Status = t.Status, CreatedAt = t.CreatedAt, ProjectName = t.Project?.Name }).ToList() }; } public async Task<UserResponseDTO?> CreateUserAsync(CreateUserDTO dto) { var existingUser = await _context.Users.FirstOrDefaultAsync(u => u.Email == dto.Email); if (existingUser != null) return null; var user = new User { Id = Guid.NewGuid(), Username = dto.Username, Email = dto.Email, PasswordHash = HasherPassword.HashPassword(dto.Password), CreatedAt = DateTime.UtcNow }; _context.Users.Add(user); await _context.SaveChangesAsync(); return new UserResponseDTO { Id = user.Id, Username = user.Username, Email = user.Email, CreatedAt = user.CreatedAt, Tasks = new List<TaskBriefDTO>() }; } public async Task<UserResponseDTO?> UpdateUserAsync(Guid id, CreateUserDTO dto) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id); if (user == null) return null; user.Username = dto.Username; user.Email = dto.Email; await _context.SaveChangesAsync(); return new UserResponseDTO { Id = user.Id, Username = user.Username, Email = user.Email, CreatedAt = user.CreatedAt, Tasks = new List<TaskBriefDTO>() // при необходимости можно подгружать задачи }; } public async Task<UserResponseDTO?> PatchUserAsync(Guid id, PatchUserDTO dto) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id); if (user == null) return null; if (!string.IsNullOrWhiteSpace(dto.Username)) user.Username = dto.Username; if (!string.IsNullOrWhiteSpace(dto.Email)) user.Email = dto.Email; if (!string.IsNullOrWhiteSpace(dto.Password)) user.PasswordHash = HasherPassword.HashPassword(dto.Password); await _context.SaveChangesAsync(); return new UserResponseDTO { Id = user.Id, Username = user.Username, Email = user.Email, CreatedAt = user.CreatedAt, Tasks = new List<TaskBriefDTO>() }; } public async Task<bool> DeleteUserAsync(Guid id) { var user = await _context.Users.FirstOrDefaultAsync(u => u.Id == id); if (user == null) return false; _context.Users.Remove(user); await _context.SaveChangesAsync(); return true; } } }