diff options
Diffstat (limited to 'code/api/src/Services')
| -rw-r--r-- | code/api/src/Services/EmailValidationService.cs | 67 | ||||
| -rw-r--r-- | code/api/src/Services/MailService.cs | 2 | ||||
| -rw-r--r-- | code/api/src/Services/PasswordResetService.cs | 2 | ||||
| -rw-r--r-- | code/api/src/Services/UserService.cs | 75 |
4 files changed, 73 insertions, 73 deletions
diff --git a/code/api/src/Services/EmailValidationService.cs b/code/api/src/Services/EmailValidationService.cs new file mode 100644 index 0000000..875e3ee --- /dev/null +++ b/code/api/src/Services/EmailValidationService.cs @@ -0,0 +1,67 @@ +namespace IOL.GreatOffice.Api.Services; + +public class EmailValidationService +{ + private readonly IStringLocalizer<SharedResources> _localizer; + private readonly MainAppDatabase _database; + private readonly MailService _mailService; + private readonly ILogger<EmailValidationService> _logger; + private readonly string EmailValidationUrl; + + public EmailValidationService(IStringLocalizer<SharedResources> localizer, MainAppDatabase database, MailService mailService, ILogger<EmailValidationService> logger, VaultService vaultService) { + _localizer = localizer; + _database = database; + _mailService = mailService; + _logger = logger; + var configuration = vaultService.GetCurrentAppConfiguration(); + EmailValidationUrl = configuration.CANONICAL_BACKEND_URL + "/_/validate"; + } + + public bool FulfillEmailValidationRequest(Guid id, Guid userId) { + var item = _database.ValidationEmails.FirstOrDefault(c => c.Id == id); + if (item == default) { + _logger.LogDebug("Did not find email validation request with id: {requestId}", id); + return false; + } + + if (item.UserId != userId) { + _logger.LogInformation("An unknown user tried to validate the email validation request {requestId}", id); + return false; + } + + var user = _database.Users.FirstOrDefault(c => c.Id == item.UserId); + if (user == default) { + _database.ValidationEmails.Remove(item); + _database.SaveChanges(); + _logger.LogInformation("Deleting request {requestId} because user does not exist anymore", id); + return false; + } + + user.EmailLastValidated = AppDateTime.UtcNow; + _database.ValidationEmails.Remove(item); + _database.Users.Update(user); + _database.SaveChanges(); + _logger.LogInformation("Successfully validated the email for user {userId}", user.Id); + return true; + } + + public async Task SendValidationEmailAsync(User user) { + var queueItem = new ValidationEmail() { + UserId = user.Id, + Id = Guid.NewGuid() + }; + var email = new MailService.PostmarkEmail() { + To = user.Username, + Subject = _localizer["Greatoffice Email Validation"], + TextBody = _localizer[""" +Hello {0}, + +Validate your email address by opening this link in a browser {1} +""", user.DisplayName(true), EmailValidationUrl + "?id=" + queueItem.Id] + }; + queueItem.EmailSentAt = AppDateTime.UtcNow; + _database.ValidationEmails.Add(queueItem); + await _database.SaveChangesAsync(); + Task.Run(async () => await _mailService.SendMail(email)); + } +}
\ No newline at end of file diff --git a/code/api/src/Services/MailService.cs b/code/api/src/Services/MailService.cs index 4d789dd..e724b89 100644 --- a/code/api/src/Services/MailService.cs +++ b/code/api/src/Services/MailService.cs @@ -47,7 +47,7 @@ public class MailService var response = await _httpClient.PostAsJsonAsync("https://api.postmarkapp.com/email", message); _logger.LogInformation("Postmark returned with message: {0}", (await response.Content.ReadFromJsonAsync<PostmarkSendResponse>()).Message); } catch (Exception e) { - _logger.LogError(e, "An exception occured while trying to send an email"); + _logger.LogError(e, "A silent exception occured while trying to send an email"); } } diff --git a/code/api/src/Services/PasswordResetService.cs b/code/api/src/Services/PasswordResetService.cs index 1897d44..3bf6c84 100644 --- a/code/api/src/Services/PasswordResetService.cs +++ b/code/api/src/Services/PasswordResetService.cs @@ -1,5 +1,3 @@ -using Microsoft.Extensions.Localization; - namespace IOL.GreatOffice.Api.Services; public class PasswordResetService diff --git a/code/api/src/Services/UserService.cs b/code/api/src/Services/UserService.cs index 4fd2aa4..9c6132c 100644 --- a/code/api/src/Services/UserService.cs +++ b/code/api/src/Services/UserService.cs @@ -1,34 +1,17 @@ -using IOL.GreatOffice.Api.Data.Database.Queues; -using Microsoft.Extensions.Localization; - namespace IOL.GreatOffice.Api.Services; public class UserService { private readonly PasswordResetService _passwordResetService; - private readonly MailService _mailService; private readonly ILogger<UserService> _logger; - private readonly IStringLocalizer<SharedResources> _localizer; - private readonly MainAppDatabase _database; - private readonly string EmailValidationUrl; - public UserService(PasswordResetService passwordResetService, MailService mailService, IStringLocalizer<SharedResources> localizer, VaultService vaultService, MainAppDatabase database, ILogger<UserService> logger) { + public UserService(PasswordResetService passwordResetService, ILogger<UserService> logger) { _passwordResetService = passwordResetService; - _mailService = mailService; - _localizer = localizer; - _database = database; _logger = logger; - var configuration = vaultService.GetCurrentAppConfiguration(); - EmailValidationUrl = configuration.CANONICAL_BACKEND_URL + "/_/validate"; } - public async Task LogInUser(HttpContext httpContext, User user, bool persist = false) { - var claims = new List<Claim> { - new(AppClaims.USER_ID, user.Id.ToString()), - new(AppClaims.NAME, user.Username), - }; - - var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); + public async Task LogInUserAsync(HttpContext httpContext, User user, bool persist = false) { + var identity = new ClaimsIdentity(user.DefaultClaims(), CookieAuthenticationDefaults.AuthenticationScheme); var principal = new ClaimsPrincipal(identity); var authenticationProperties = new AuthenticationProperties { AllowRefresh = true, @@ -42,59 +25,11 @@ public class UserService await httpContext.SignInAsync(principal, authenticationProperties); await _passwordResetService.DeleteRequestsForUserAsync(user.Id); - _logger.LogInformation("Logged in user {0}", user.Id); + _logger.LogInformation("Logged in user {userId}", user.Id); } public async Task LogOutUser(HttpContext httpContext) { await httpContext.SignOutAsync(); - _logger.LogInformation("Logged out user {0}", httpContext.User.FindFirst(AppClaims.USER_ID)); - } - - public bool FulfillEmailValidationRequest(Guid id, Guid userId) { - var item = _database.ValidationEmails.FirstOrDefault(c => c.Id == id); - if (item == default) { - _logger.LogDebug("Did not find email validation request with id: {0}", id); - return false; - } - - if (item.UserId != userId) { - _logger.LogInformation("An unknown user tried to validate the email validation request {0}"); - return false; - } - - var user = _database.Users.FirstOrDefault(c => c.Id == item.UserId); - if (user == default) { - _database.ValidationEmails.Remove(item); - _database.SaveChanges(); - _logger.LogInformation("Deleting request {0} because user does not exist anymore"); - return false; - } - - user.EmailLastValidated = DateTime.UtcNow; - user.SetModified(); - _database.ValidationEmails.Remove(item); - _database.SaveChanges(); - _logger.LogInformation("Successfully validated the email for user {0}", user.Id); - return true; - } - - public async Task SendValidationEmail(User user) { - var queueItem = new ValidationEmail() { - UserId = user.Id, - Id = Guid.NewGuid() - }; - var email = new MailService.PostmarkEmail() { - To = user.Username, - Subject = _localizer["Greatoffice Email Validation"], - TextBody = _localizer[""" -Hello, {0}. - -Validate your email address by opening this link in a browser {1} -""", user.DisplayName(true), EmailValidationUrl + "?id=" + queueItem.Id] - }; - await _mailService.SendMail(email); - queueItem.EmailSentAt = DateTime.UtcNow; - _database.ValidationEmails.Add(queueItem); - await _database.SaveChangesAsync(); + _logger.LogInformation("Logged out user {userId}", httpContext.User.FindFirst(AppClaims.USER_ID)); } }
\ No newline at end of file |
