Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

UserService.cs 5.8KB

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