Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

UserService.cs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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. 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. // generate invitation token for user
  99. // encoded for URLs
  100. var token = await _userManager.GeneratePasswordResetTokenAsync(user);
  101. token = HttpUtility.UrlEncode(token);
  102. // send link
  103. await _emailer.SendEmailAndWriteToDbAsync(invite.Email, "Welcome", HTMLHelper.RenderRegisterPage($"{_frontEndSettings.BaseUrl}/register?token={token}&email={invite.Email}"), isHtml: true);
  104. await _databaseContext.SaveChangesAsync();
  105. return new ServiceResponseDTO<object>
  106. {
  107. Data = new { Message = "Link has been sent!" }
  108. };
  109. }
  110. public async Task<bool> VerifyToken(User user, string token)
  111. {
  112. // this method is going to be updated
  113. // curent new password value is static and only used for testing
  114. // method is not complete and is currently only used to check if valid reset token is sent
  115. var result = await _userManager.ResetPasswordAsync(user, token, "Nekasifra123!");
  116. return result.Succeeded;
  117. }
  118. }
  119. }