Files
WatchIt/WatchIt.WebAPI/BusinessLogic/Authentication/AuthenticationBusinessLogic.cs

68 lines
2.4 KiB
C#

using Ardalis.Result;
using WatchIt.Database.Model.Accounts;
using WatchIt.DTO.Models.Controllers.Accounts;
using WatchIt.DTO.Models.Controllers.Authentication;
using WatchIt.WebAPI.Helpers;
using WatchIt.WebAPI.Repositories.Accounts;
using WatchIt.WebAPI.Services.Tokens;
using WatchIt.WebAPI.Services.User;
namespace WatchIt.WebAPI.BusinessLogic.Authentication;
public class AuthenticationBusinessLogic : IAuthenticationBusinessLogic
{
#region SERVICES
private readonly ITokensService _tokensService;
private readonly IUserService _userService;
private readonly IAccountsRepository _accountRepository;
#endregion
#region CONSTRUCTORS
public AuthenticationBusinessLogic(ITokensService tokensService, IUserService userService, IAccountsRepository accountRepository)
{
_tokensService = tokensService;
_userService = userService;
_accountRepository = accountRepository;
}
#endregion
#region PUBLIC METHODS
public async Task<Result<AuthenticationResponse>> Authenticate(AuthenticationRequest body)
{
Account? accountEntity = await _accountRepository.GetByUsernameOrEmailAsync(body.UsernameOrEmail);
if (accountEntity is null || !PasswordHelpers.ValidatePassword(body.Password, accountEntity.GetPasswordData()))
{
return Result.Unauthorized();
}
string accessToken = _tokensService.CreateAccessToken(accountEntity);
string refreshToken = await _tokensService.CreateRefreshTokenAsync(accountEntity, body.RememberMe);
AuthenticationResponse response = AuthenticationMappers.CreateAuthenticationResponse(accessToken, refreshToken);
await _accountRepository.UpdateAsync(accountEntity, x => x.UpdateActiveDate());
return Result.Success(response);
}
public async Task<Result<AuthenticationResponse>> AuthenticateRefresh(AuthenticationRefreshRequest body)
{
Account accountEntity = await _tokensService.ExtendRefreshTokenAsync(body.RefreshToken, body.AccessToken);
string accessToken = _tokensService.CreateAccessToken(accountEntity);
AuthenticationResponse response = AuthenticationMappers.CreateAuthenticationResponse(accessToken, body.RefreshToken);
await _accountRepository.UpdateAsync(accountEntity, x => x.UpdateActiveDate());
return Result.Success(response);
}
#endregion
}