Added endpoint to access SimmonsBank accounts for the current user
This commit is contained in:
parent
48958be669
commit
f32b07b2b8
@ -7,6 +7,7 @@ public class PuppeteerConfig
|
|||||||
public int TaskCheckIntervalMinutes { get; set; }
|
public int TaskCheckIntervalMinutes { get; set; }
|
||||||
public string SimmonsBankBaseUrl { get; set; }
|
public string SimmonsBankBaseUrl { get; set; }
|
||||||
public int BrowserOperationTimeoutSeconds { get; set; }
|
public int BrowserOperationTimeoutSeconds { get; set; }
|
||||||
|
public bool Headless { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PuppeteerConfigConstants
|
public class PuppeteerConfigConstants
|
||||||
@ -16,6 +17,7 @@ public class PuppeteerConfigConstants
|
|||||||
public const string TaskCheckIntervalMinutes = "TaskCheckIntervalMinutes";
|
public const string TaskCheckIntervalMinutes = "TaskCheckIntervalMinutes";
|
||||||
public const string SimmonsBankBaseUrl = "SimmonsBankBaseUrl";
|
public const string SimmonsBankBaseUrl = "SimmonsBankBaseUrl";
|
||||||
public const string BrowserOperationTimeoutSeconds = "BrowserOperationTimeoutSeconds";
|
public const string BrowserOperationTimeoutSeconds = "BrowserOperationTimeoutSeconds";
|
||||||
|
public const string Headless = "Headless";
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PuppeteerConstants
|
public class PuppeteerConstants
|
||||||
|
@ -10,6 +10,8 @@ using System.Collections.Generic;
|
|||||||
using AAIntegration.SimmonsBank.API.Entities;
|
using AAIntegration.SimmonsBank.API.Entities;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using System.Security.Claims;
|
using System.Security.Claims;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Newtonsoft.Json.Linq;
|
||||||
|
|
||||||
[Authorize]
|
[Authorize]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
@ -21,30 +23,36 @@ public class AccountsController : ControllerBase
|
|||||||
private IMapper _mapper;
|
private IMapper _mapper;
|
||||||
private readonly AppSettings _appSettings;
|
private readonly AppSettings _appSettings;
|
||||||
private readonly ILogger<AccountsController> _logger;
|
private readonly ILogger<AccountsController> _logger;
|
||||||
|
private IPuppeteerService _puppeteerService;
|
||||||
|
|
||||||
public AccountsController(
|
public AccountsController(
|
||||||
IAccountService accountService,
|
IAccountService accountService,
|
||||||
IUserService userService,
|
IUserService userService,
|
||||||
IMapper mapper,
|
IMapper mapper,
|
||||||
IOptions<AppSettings> appSettings,
|
IOptions<AppSettings> appSettings,
|
||||||
ILogger<AccountsController> logger)
|
ILogger<AccountsController> logger,
|
||||||
|
IPuppeteerService puppeteerService)
|
||||||
{
|
{
|
||||||
_accountService = accountService;
|
_accountService = accountService;
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
_mapper = mapper;
|
_mapper = mapper;
|
||||||
_appSettings = appSettings.Value;
|
_appSettings = appSettings.Value;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_puppeteerService = puppeteerService;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
[HttpGet]
|
||||||
public IActionResult GetAll()
|
public async Task<IActionResult> GetAllAsync()
|
||||||
{
|
{
|
||||||
List<AccountDTO> accountDtos = new List<AccountDTO>();
|
List<AccountDTO> accounts = await _puppeteerService.GetAccounts(_userService.GetUser(User.FindFirstValue(ClaimTypes.NameIdentifier)));
|
||||||
|
|
||||||
|
return Ok(accounts);
|
||||||
|
/*List<AccountDTO> accountDtos = new List<AccountDTO>();
|
||||||
|
|
||||||
foreach (Account acc in _accountService.GetAll(GetCurrentUserId()))
|
foreach (Account acc in _accountService.GetAll(GetCurrentUserId()))
|
||||||
accountDtos.Add(_mapper.Map<Account, AccountDTO>(acc));
|
accountDtos.Add(_mapper.Map<Account, AccountDTO>(acc));
|
||||||
|
|
||||||
return Ok(accountDtos);
|
return Ok(accountDtos);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("{id}")]
|
[HttpGet("{id}")]
|
||||||
|
@ -7,8 +7,9 @@ namespace AAIntegration.SimmonsBank.API.Models.Accounts;
|
|||||||
|
|
||||||
public class AccountDTO
|
public class AccountDTO
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public string Id { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
public decimal Balance { get; set; }
|
public string Numbers { get; set; }
|
||||||
public string ExternalAccountNumber { get; set; }
|
public decimal? Balance { get; set; }
|
||||||
|
public decimal? AvailableBalance { get; set; }
|
||||||
}
|
}
|
@ -23,12 +23,13 @@ using Newtonsoft.Json.Linq;
|
|||||||
using NuGet.Protocol;
|
using NuGet.Protocol;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using NuGet.Protocol.Core.Types;
|
using NuGet.Protocol.Core.Types;
|
||||||
|
using AAIntegration.SimmonsBank.API.Models.Accounts;
|
||||||
|
|
||||||
public interface IPuppeteerService
|
public interface IPuppeteerService
|
||||||
{
|
{
|
||||||
Task<bool> Login(User user, CancellationToken cancellationToken);
|
Task<bool> Login(User user, CancellationToken cancellationToken);
|
||||||
Task<bool> IsLoggedIn(User user, CancellationToken cancellationToken);
|
Task<bool> IsLoggedIn(User user, CancellationToken cancellationToken);
|
||||||
Task<JToken> GetAccounts(User user, CancellationToken cancellationToken);
|
Task<List<AccountDTO>> GetAccounts(User user);
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PuppeteerService : IPuppeteerService
|
public class PuppeteerService : IPuppeteerService
|
||||||
@ -222,7 +223,7 @@ public class PuppeteerService : IPuppeteerService
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async Task<JToken> GetAccounts(User user, CancellationToken cancellationToken)
|
public async Task<List<AccountDTO>> GetAccounts(User user)
|
||||||
{
|
{
|
||||||
string prefix = $"Task::GetAccounts - {user.Id} - ";
|
string prefix = $"Task::GetAccounts - {user.Id} - ";
|
||||||
|
|
||||||
@ -235,7 +236,7 @@ public class PuppeteerService : IPuppeteerService
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Setup Page
|
// Setup Page
|
||||||
IBrowser browser = await GetUserBrowserAsync(user, cancellationToken);
|
IBrowser browser = await GetUserBrowserAsync(user, new CancellationToken());
|
||||||
await using IPage page = await browser.NewPageAsync();
|
await using IPage page = await browser.NewPageAsync();
|
||||||
await page.SetUserAgentAsync(USER_AGENT);
|
await page.SetUserAgentAsync(USER_AGENT);
|
||||||
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
|
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
|
||||||
@ -245,11 +246,14 @@ public class PuppeteerService : IPuppeteerService
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
IResponse response = await page.GoToAsync(url).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds), cancellationToken);
|
IResponse response = await page.GoToAsync(url).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds));
|
||||||
_logger.LogInformation(prefix + $"Request response code '{response.Status}'. Url: '{url}'");
|
_logger.LogInformation(prefix + $"Request response code '{response.Status}'. Url: '{url}'");
|
||||||
|
|
||||||
if (response.Status == System.Net.HttpStatusCode.OK)
|
if (response.Status == System.Net.HttpStatusCode.OK)
|
||||||
return await response.JsonAsync<JToken>();
|
{
|
||||||
|
JToken accounts = await response.JsonAsync<JToken>();
|
||||||
|
return accounts.SelectToken("accounts").ToObject<List<AccountDTO>>();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
_logger.LogError(prefix + $"Received unexpected status code '{response.Status}'");
|
_logger.LogError(prefix + $"Received unexpected status code '{response.Status}'");
|
||||||
}
|
}
|
||||||
@ -280,7 +284,7 @@ public class PuppeteerService : IPuppeteerService
|
|||||||
await browserFetcher.DownloadAsync().WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds * 20), cancellationToken);
|
await browserFetcher.DownloadAsync().WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds * 20), cancellationToken);
|
||||||
|
|
||||||
var options = new LaunchOptions {
|
var options = new LaunchOptions {
|
||||||
Headless = true,
|
Headless = _config.Headless,
|
||||||
IgnoreHTTPSErrors = true,
|
IgnoreHTTPSErrors = true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
"APIUrl": "https://localhost:7260"
|
"APIUrl": "https://localhost:7260"
|
||||||
},
|
},
|
||||||
"Puppeteer": {
|
"Puppeteer": {
|
||||||
|
"Headless": true,
|
||||||
"BrowserOperationTimeoutSeconds": 5,
|
"BrowserOperationTimeoutSeconds": 5,
|
||||||
"TaskCheckIntervalMinutes": 1,
|
"TaskCheckIntervalMinutes": 1,
|
||||||
"KeepAliveIntervalMinutes": 1,
|
"KeepAliveIntervalMinutes": 1,
|
||||||
|
@ -8,6 +8,8 @@ The type is Transaction Importer, specifically created for interfacing with Simm
|
|||||||
|
|
||||||
[Otp.NET library](https://github.com/kspearrin/Otp.NET)
|
[Otp.NET library](https://github.com/kspearrin/Otp.NET)
|
||||||
|
|
||||||
|
[JToken.SelectToken() quick reference](https://www.newtonsoft.com/json/help/html/SelectToken.htm)
|
||||||
|
|
||||||
## Dev Environment Setup
|
## Dev Environment Setup
|
||||||
|
|
||||||
On Archlinux install the following to use dotnet: ```sudo pacman -Sy dotnet-sdk dotnet-runtime aspnet-runtime```.
|
On Archlinux install the following to use dotnet: ```sudo pacman -Sy dotnet-sdk dotnet-runtime aspnet-runtime```.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user