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

UserService.cs 4.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  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.Users.ToListAsync();
  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. return result;
  41. }
  42. public async Task<User?> GetByEmail(string email) =>
  43. await _userManager.FindByEmailAsync(email);
  44. #endregion
  45. public async Task CreateUser(CreateUserRequestDto model)
  46. {
  47. _logger.LogInformation($"Start creating user");
  48. var user = _mapper.Map<User>(model);
  49. _logger.LogInformation($"User created successfully");
  50. _logger.LogInformation($"Saving user to db...");
  51. await _userManager.CreateAsync(user, model.Password);
  52. _logger.LogInformation($"User saved to DB");
  53. }
  54. public async Task RemoveUser(User user)
  55. {
  56. await _userManager.DeleteAsync(user);
  57. await _databaseContext.SaveChangesAsync();
  58. }
  59. public async Task<bool?> ToggleEnable(User user)
  60. {
  61. user.IsEnabled = !user.IsEnabled;
  62. await _databaseContext.SaveChangesAsync();
  63. return user.IsEnabled;
  64. }
  65. public async Task<ServiceResponseDTO<object>> SendRegistrationLink(InviteDTO invite)
  66. {
  67. // check if user exists
  68. var check = await _userManager.FindByEmailAsync(invite.Email);
  69. if (check != null)
  70. return new ServiceResponseDTO<object>()
  71. {
  72. IsError = true,
  73. ErrorMessage = "User already registered."
  74. };
  75. // create template user
  76. // this user is disabled to log in until confirming invitation
  77. var user = new User
  78. {
  79. UserName = invite.Email,
  80. Email = invite.Email,
  81. FirstName = invite.FirstName,
  82. LastName = invite.LastName,
  83. IsEnabled = false
  84. };
  85. await _userManager.CreateAsync(user, StringGenerator.GenerateRandomPassword());
  86. // generate invitation token for user
  87. // encoded for URLs
  88. var token = await _userManager.GeneratePasswordResetTokenAsync(user);
  89. token = HttpUtility.UrlEncode(token);
  90. // send link
  91. await _emailer.SendEmailAndWriteToDbAsync(invite.Email, "Welcome", HTMLHelper.RenderRegisterPage($"{_frontEndSettings.BaseUrl}/register?token={token}&email={invite.Email}"), isHtml: true);
  92. await _databaseContext.SaveChangesAsync();
  93. return new ServiceResponseDTO<object>
  94. {
  95. Data = new { Message = "Link has been sent!" }
  96. };
  97. }
  98. public async Task<bool> VerifyToken(User user, string token)
  99. {
  100. // this method is going to be updated
  101. // curent new password value is static and only used for testing
  102. // method is not complete and is currently only used to check if valid reset token is sent
  103. var result = await _userManager.ResetPasswordAsync(user, token, "Nekasifra123!");
  104. return result.Succeeded;
  105. }
  106. }
  107. }