Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

UserService.cs 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. namespace Diligent.WebAPI.Business.Services
  2. {
  3. public class UserService : IUserService
  4. {
  5. private readonly FrontEndSettings _frontEndSettings;
  6. private readonly UserManager<User> _userManager;
  7. private readonly IMapper _mapper;
  8. private readonly DatabaseContext _databaseContext;
  9. private readonly IEmailer _emailer;
  10. private readonly ILogger<UserService> _logger;
  11. private readonly ICategoryService _categoryService;
  12. public UserService(IOptions<FrontEndSettings> frontEndSettings, UserManager<User> userManager, IMapper mapper, DatabaseContext databaseContext, IEmailer emailer, ILogger<UserService> logger, ICategoryService categoryService)
  13. {
  14. _frontEndSettings = frontEndSettings.Value;
  15. _userManager = userManager;
  16. _mapper = mapper;
  17. _databaseContext = databaseContext;
  18. _emailer = emailer;
  19. _logger = logger;
  20. _categoryService = categoryService;
  21. }
  22. public async Task<IEnumerable<User?>> GetAll()
  23. {
  24. _logger.LogInformation("Start getting all users");
  25. _logger.LogInformation("Getting data from DB");
  26. var fromDb = await _userManager.GetUsersInRoleAsync("Admin");
  27. _logger.LogInformation($"Received {fromDb.Count} ads from db.");
  28. return fromDb;
  29. }
  30. public async Task<User> GetFirst()
  31. {
  32. var result = await _userManager.Users.FirstOrDefaultAsync();
  33. if (result == null)
  34. throw new EntityNotFoundException("No users in database");
  35. return result;
  36. }
  37. #region REFACTORING CODE HERE TO CHECK IF USER IS NULL
  38. public async Task<User> GetById(int id)
  39. {
  40. _logger.LogInformation($"Start searching user with id = {id}");
  41. var result = await _userManager.FindByIdAsync(id.ToString());
  42. if (result == null)
  43. {
  44. throw new EntityNotFoundException("User not found");
  45. }
  46. return result;
  47. }
  48. public async Task<User> GetByEmail(string email)
  49. {
  50. _logger.LogInformation($"Start searching user with mail = {email}");
  51. var result = await _userManager.FindByEmailAsync(email);
  52. if (result == null)
  53. {
  54. throw new EntityNotFoundException("User not found");
  55. }
  56. return result;
  57. }
  58. #endregion
  59. public async Task CreateUser(CreateUserRequestDto model)
  60. {
  61. _logger.LogInformation($"Start creating user");
  62. var user = _mapper.Map<User>(model);
  63. _logger.LogInformation($"User created successfully");
  64. _logger.LogInformation($"Saving user to db...");
  65. await _userManager.CreateAsync(user, model.Password);
  66. _logger.LogInformation($"User saved to DB");
  67. }
  68. public async Task RemoveUser(User user)
  69. {
  70. await _userManager.DeleteAsync(user);
  71. await _databaseContext.SaveChangesAsync();
  72. }
  73. public async Task<bool?> ToggleEnable(User user)
  74. {
  75. user.IsEnabled = !user.IsEnabled;
  76. await _databaseContext.SaveChangesAsync();
  77. return user.IsEnabled;
  78. }
  79. public async Task<ServiceResponseDTO<object>> SendRegistrationLink(InviteDTO invite)
  80. {
  81. // check if user exists
  82. var check = await _userManager.FindByEmailAsync(invite.Email);
  83. if (check != null)
  84. return new ServiceResponseDTO<object>()
  85. {
  86. IsError = true,
  87. ErrorMessage = "User already registered."
  88. };
  89. // create template user
  90. // this user is disabled to log in until confirming invitation
  91. var user = new User
  92. {
  93. UserName = invite.Email,
  94. Email = invite.Email,
  95. FirstName = invite.FirstName,
  96. LastName = invite.LastName,
  97. IsEnabled = false
  98. };
  99. await _userManager.CreateAsync(user, StringGenerator.GenerateRandomPassword());
  100. await _userManager.AddToRoleAsync(user, "Admin");
  101. // generate invitation token for user
  102. // encoded for URLs
  103. var token = await _userManager.GeneratePasswordResetTokenAsync(user);
  104. token = HttpUtility.UrlEncode(token);
  105. // send link
  106. await _emailer.SendEmailAndWriteToDbAsync(invite.Email, "Welcome", HTMLHelper.RenderRegisterPage($"{_frontEndSettings.BaseUrl}/register?token={token}&email={invite.Email}"), isHtml: true);
  107. await _databaseContext.SaveChangesAsync();
  108. return new ServiceResponseDTO<object>
  109. {
  110. Data = new { Message = "Link has been sent!" }
  111. };
  112. }
  113. public async Task GrantCategoryToUserAsync(GrantUserCategoryRequestDto request)
  114. {
  115. //for (int i = 0; i < request.CategoriesId.Count; i++)
  116. //{
  117. // await _databaseContext.UserCategories.AddAsync(new UserCategories { UserId = request.UserId, CategoryId = request.CategoriesId[i] });
  118. //}
  119. //await _databaseContext.SaveChangesAsync();
  120. for (int i = 0; i < request.Categories.Count; i++)
  121. {
  122. if (request.Categories[i].IsChecked == false)
  123. {
  124. var category = await _databaseContext.UserCategories.Where(x => x.UserId == request.UserId && x.CategoryId == request.Categories[i].Id).FirstOrDefaultAsync();
  125. _databaseContext.UserCategories.Remove(category);
  126. }
  127. else
  128. {
  129. await _databaseContext.UserCategories.AddAsync(new UserCategories { UserId = request.UserId, CategoryId = request.Categories[i].Id });
  130. }
  131. }
  132. await _databaseContext.SaveChangesAsync();
  133. }
  134. }
  135. }