UserService.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using Microsoft.AspNetCore.Identity;
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.Extensions.Logging;
  4. using WebApp.Common.Exceptions.ClientSide;
  5. using WebApp.Common.Resources;
  6. using WebApp.Data;
  7. using WebApp.Data.Entities;
  8. using WebApp.Models;
  9. using WebApp.Models.MappingExtensions;
  10. using WebApp.Models.Request.Users;
  11. using WebApp.Models.Response.Roles;
  12. using WebApp.Models.Response.Users;
  13. using WebApp.Services.Interfaces;
  14. namespace WebApp.Services.Implementations;
  15. public class UserService : IUserService
  16. {
  17. private readonly UserManager<ApplicationUser> _userManager;
  18. private readonly ApplicationContext _context;
  19. private readonly ILogger<UserService> _logger;
  20. public UserService(UserManager<ApplicationUser> userManager, ApplicationContext context, ILogger<UserService> logger)
  21. {
  22. _userManager = userManager;
  23. _context = context;
  24. _logger = logger;
  25. }
  26. public async Task<ApplicationUser> GetByIdAsync(Guid userId)
  27. {
  28. ApplicationUser? user = await _userManager.FindByIdAsync(userId.ToString());
  29. if (user is null)
  30. {
  31. _logger.LogError("Not found user with ID: {userId}", userId);
  32. throw new NotFoundUserException(Messages.UserNotFound);
  33. }
  34. return user;
  35. }
  36. public async Task<UserResponseModel> GetDetailsByIdAsync(Guid userId)
  37. {
  38. ApplicationUser? user = await _context.Users.Include(x => x.Roles).FirstOrDefaultAsync(x => x.Id == userId);
  39. if (user is null)
  40. {
  41. _logger.LogError("Not found user with ID: {userId}", userId);
  42. throw new NotFoundUserException(Messages.UserNotFound);
  43. }
  44. IList<ApplicationRole> userRoles = await GetUserRolesAsync(user);
  45. IReadOnlyList<RoleResponseModel> userRolesResponse = userRoles.Select(x => x.ToRoleResponseModel()).ToList();
  46. return user.ToUserResponseModel(userRolesResponse);
  47. }
  48. public async Task<PaginationResponseModel<UserResponseModel>> GetAllUsersAsync(UsersFilter usersFilter)
  49. {
  50. IQueryable<ApplicationUser> usersQuery = _userManager.Users.Include(x => x.Roles);
  51. usersQuery = await ApplyUserFilterAsync(usersQuery, usersFilter);
  52. int totalCount = await usersQuery.CountAsync();
  53. int pagesCount = (int)Math.Ceiling((double)totalCount / usersFilter.ItemsPerPage!.Value);
  54. usersQuery = usersQuery
  55. .Skip(usersFilter.SkipCount)
  56. .Take(usersFilter.ItemsPerPage!.Value);
  57. IReadOnlyList<UserResponseModel> usersResponses = await usersQuery
  58. .Select(x => x.ToUserResponseModel(new List<RoleResponseModel>()))
  59. .ToListAsync();
  60. return new PaginationResponseModel<UserResponseModel>
  61. {
  62. Items = usersResponses,
  63. TotalItems = totalCount,
  64. PageNumber = usersFilter.PageNumber!.Value,
  65. ItemsPerPage = usersFilter.ItemsPerPage!.Value,
  66. PagesCount = pagesCount,
  67. };
  68. }
  69. private async Task<IList<ApplicationRole>> GetUserRolesAsync(ApplicationUser user)
  70. {
  71. IList<ApplicationRole> userRoles = new List<ApplicationRole>();
  72. foreach (var userRole in user.Roles)
  73. {
  74. var role = await _context.Roles.FirstOrDefaultAsync(x => x.Id == userRole.RoleId);
  75. userRoles.Add(role!);
  76. }
  77. return userRoles;
  78. }
  79. private async Task<IQueryable<ApplicationUser>> ApplyUserFilterAsync(IQueryable<ApplicationUser> users, UsersFilter usersFilter)
  80. {
  81. if (usersFilter.SearchTerm is not null)
  82. {
  83. users = users.Where(x => x.Email!.Contains(usersFilter.SearchTerm));
  84. }
  85. return users.OrderByDescending(x => x.CreatedOn);
  86. }
  87. }