Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions ExpenseTracker.Api/ExpenseTracker.Application/Extensions/Helper.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Microsoft.AspNetCore.WebUtilities;

namespace ExpenseTracker.Application.Extensions;
public static class Helper
{
public static string GetCallbackUrl(string clientUrl, string token, string email)
{
Dictionary<string, string> queryParams = new Dictionary<string, string>
{
{ "email", email },
{ "token", token }
};

var callbackUrl = QueryHelpers.AddQueryString(clientUrl, queryParams);

return callbackUrl;
}
}
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using ExpenseTracker.Application.Extensions;
using ExpenseTracker.Application.Interfaces;
using ExpenseTracker.Application.Models;
using ExpenseTracker.Application.Requests.Auth;
Expand Down Expand Up @@ -122,18 +123,17 @@ private async Task SendWelcomeEmailAsync(IdentityUser<Guid> user)
{
var emailMessage = new EmailMessage(user.Email!, user.UserName!, "Welcome to Expense Tracker!", null);

_backgroundJobClient.Enqueue("email_welcome", () => _emailService.SendWelcome(emailMessage));
_backgroundJobClient.Enqueue(() => _emailService.SendWelcome(emailMessage));
}

private async Task SendPasswordResetEmailAsync(IdentityUser<Guid> user, ResetPasswordRequest request)
{
var token = await _userManager.GeneratePasswordResetTokenAsync(user);
var redirectUrl = $"{request.RedirectUrl}?token={token}&email={request.Email}";

var redirectUrl = Helper.GetCallbackUrl(request.RedirectUrl, token, request.Email);
var emailMessage = new EmailMessage(user.Email!, user.UserName!, "Password Reset", redirectUrl);
var userInfo = new UserInfo(request.Browser, request.OS);

_backgroundJobClient.Enqueue("email_reset-password", () => _emailService.SendResetPassword(emailMessage, userInfo));
_backgroundJobClient.Enqueue(() => _emailService.SendResetPassword(emailMessage, userInfo));
}

private async Task<IdentityUser<Guid>> GetAndValidateUserAsync(string email)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public Guid GetUserId()

public string GetUserName()
{
return "";
var user = _httpContextAccessor.HttpContext?.User
?? throw new InvalidOperationException($"Unable to get user info from HttpContext.");

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using ExpenseTracker.Application.Configurations;
using ExpenseTracker.Application.Interfaces;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace ExpenseTracker.Application.Services;

Expand All @@ -29,7 +29,7 @@ public string GenerateToken(IdentityUser<Guid> user, IEnumerable<string> roles)
signingCredentials: signingKey,
expires: DateTime.UtcNow.AddHours(_options.ExpiresInHours));

var token = new JwtSecurityTokenHandler().WriteToken(securityToken);
var token = new JwtSecurityTokenHandler().WriteToken(securityToken);

return token;
}
Expand All @@ -50,7 +50,7 @@ private static List<Claim> GetClaims(IdentityUser<Guid> user, IEnumerable<string

return claims;
}

private SigningCredentials GetClaimingKey()
{
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_options.SecretKey));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
using ExpenseTracker.Application.Interfaces;
using ExpenseTracker.Application.Extensions;
using ExpenseTracker.Application.Interfaces;
using ExpenseTracker.Application.Models;
using ExpenseTracker.Application.Requests.Auth;
using ExpenseTracker.Domain.Entities;
using ExpenseTracker.Domain.Enums;
using ExpenseTracker.Domain.Interfaces;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.EntityFrameworkCore;

namespace ExpenseTracker.Application.Services;
Expand Down Expand Up @@ -85,23 +85,11 @@ private async Task SendConfirmationEmailAsync(IdentityUser<Guid> user, RegisterR
{
var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);

var redirectUrl = GetCallbackUrl(request.ConfirmUrl, token, request.Email);
var redirectUrl = Helper.GetCallbackUrl(request.ConfirmUrl, token, request.Email);
var userInfo = new UserInfo(request.Browser ?? "Unknown browser", request.OS ?? "Unknown operating system");
var emailMessage = new EmailMessage(user.Email!, user.UserName!, "Email confirmation", redirectUrl);

_emailService.SendEmailConfirmation(emailMessage, userInfo);
}

private static string GetCallbackUrl(string clientUrl, string token, string email)
{
Dictionary<string, string> queryParams = new Dictionary<string, string>
{
{ "email", email },
{ "token", token }
};

var callbackUrl = QueryHelpers.AddQueryString(clientUrl, queryParams);

return callbackUrl;
}
}