public async Task <Configuration> BuildUserSessionConfiguration(CancellationToken cancellationToken = default) { var id = _httpContextAccessor.HttpContext.GetAuthId(); var session = await _cachingService.GetUserSession(id); if (session.HasValue) { return(new Configuration { AccessToken = session.Value.AccessToken }); } var email = _httpContextAccessor.HttpContext.GetAuthEmail(); var user = await _databaseContext.UserAccounts.AsNoTracking() .FirstOrDefaultAsync(x => x.Email == email, cancellationToken); var finApiSession = await Login(user.Id.ToString(), user.Password, cancellationToken); var newSession = new FinApiSession(finApiSession._AccessToken, finApiSession.RefreshToken); await _cachingProvider.SetAsync(user.Id.ToString(), newSession, TimeSpan.FromHours(finApiSession.ExpiresIn)); return(new Configuration { AccessToken = finApiSession._AccessToken }); }
public override async Task <ActionResult <LoginAccountResponse> > HandleAsync( [FromBody] LoginAccountRequest request, CancellationToken cancellationToken = default) { var account = await _databaseContext.UserAccounts.SingleOrDefaultAsync(x => request.Email.ToLower() == x.Email.ToLower() && x.Password == request.Password, cancellationToken); if (account == null) { return(NotFound("Account not found")); } var finApiSession = await _finApiService.Login(account.Id.ToString(), request.Password, cancellationToken); var accessToken = _tokenService.GenerateToken(account, finApiSession.RefreshToken); var refreshToken = _tokenService.GenerateRefreshToken(); var session = new FinApiSession(finApiSession._AccessToken, finApiSession.RefreshToken); await _cachingService.SaveUserSession(account.Id, session, finApiSession.ExpiresIn); return(Ok(new LoginAccountResponse(accessToken, refreshToken))); }