Merge pull request 'feature/AddPuppeteer' (#7) from feature/AddPuppeteer into stage

Reviewed-on: #7
This commit is contained in:
William Lewis 2024-04-04 11:06:52 -05:00
commit f9b4174fae
81 changed files with 726 additions and 36917 deletions

View File

@ -30,6 +30,8 @@
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.8" /> <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.8" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
<PackageReference Include="Microsoft.AspNetCore.SpaProxy" Version="7.0.13" /> <PackageReference Include="Microsoft.AspNetCore.SpaProxy" Version="7.0.13" />
<PackageReference Include="Otp.NET" Version="1.3.0" />
<PackageReference Include="PuppeteerSharp" Version="15.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" /> <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.35.0" /> <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.35.0" />
</ItemGroup> </ItemGroup>

View File

@ -1,6 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Configs;
public class EnvelopeFundConfig
{
public int CheckIntervalInMinutes { get; set; }
}

View File

@ -0,0 +1,27 @@
namespace AAIntegration.SimmonsBank.API.Configs;
public class PuppeteerConfig
{
public int KeepAliveIntervalMinutes { get; set; }
public int CheckForNewDataIntervalMinutes { get; set; }
public int TaskCheckIntervalMinutes { get; set; }
public string SimmonsBankBaseUrl { get; set; }
public int BrowserOperationTimeoutSeconds { get; set; }
public bool Headless { get; set; }
}
public class PuppeteerConfigConstants
{
public const string KeepAliveIntervalMinutes = "KeepAliveIntervalMinutes";
public const string CheckForNewDataIntervalMinutes = "CheckForNewDataIntervalMinutes";
public const string TaskCheckIntervalMinutes = "TaskCheckIntervalMinutes";
public const string SimmonsBankBaseUrl = "SimmonsBankBaseUrl";
public const string BrowserOperationTimeoutSeconds = "BrowserOperationTimeoutSeconds";
public const string Headless = "Headless";
}
public class PuppeteerConstants
{
public const string BROWSER_CACHE_KEY = "BrowserCacheKey";
public const string USER_SB_ID = "UserSimmonsBankId";
}

View File

@ -1,91 +1,66 @@
namespace AAIntegration.SimmonsBank.API.Controllers; namespace AAIntegration.SimmonsBank.API.Controllers;
using AutoMapper;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using AAIntegration.SimmonsBank.API.Models.Accounts; using AAIntegration.SimmonsBank.API.Models.Accounts;
using AAIntegration.SimmonsBank.API.Services; using AAIntegration.SimmonsBank.API.Services;
using AAIntegration.SimmonsBank.API.Config;
using System.Collections.Generic; 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 AAIntegration.SimmonsBank.API.Models.Transactions;
[Authorize] [Authorize]
[ApiController] [ApiController]
[Route("[controller]")] [Route("[controller]")]
public class AccountsController : ControllerBase public class AccountsController : ControllerBase
{ {
private IAccountService _accountService;
private IUserService _userService; private IUserService _userService;
private IMapper _mapper;
private readonly AppSettings _appSettings;
private readonly ILogger<AccountsController> _logger; private readonly ILogger<AccountsController> _logger;
private IPuppeteerService _puppeteerService;
public AccountsController( public AccountsController(
IAccountService accountService,
IUserService userService, IUserService userService,
IMapper mapper, ILogger<AccountsController> logger,
IOptions<AppSettings> appSettings, IPuppeteerService puppeteerService)
ILogger<AccountsController> logger)
{ {
_accountService = accountService;
_userService = userService; _userService = userService;
_mapper = mapper;
_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(GetCurrentUser());
return Ok(accounts);
foreach (Account acc in _accountService.GetAll(GetCurrentUserId()))
accountDtos.Add(_mapper.Map<Account, AccountDTO>(acc));
return Ok(accountDtos);
} }
[HttpGet("{id}")] [HttpGet("{account_guid}")]
public IActionResult GetById(int id) public async Task<IActionResult> GetByGUIDAsync(string account_guid)
{ {
Account account = _accountService.GetById(id, GetCurrentUserId()); return Ok(await GetAccountAsync(account_guid));
return Ok(_mapper.Map<Account, AccountDTO>(account));
} }
[HttpPost] [HttpGet("{account_guid}/transactions")]
public IActionResult Create([FromBody]AccountCreateRequest model) public async Task<IActionResult> GetTransactionsAsync(string account_guid, uint offset = 0, uint limit = 500)
{ {
_accountService.Create(model, GetCurrentUserId()); List<TransactionDTO> transactions = await _puppeteerService.GetTransactions(GetCurrentUser(), (await GetAccountAsync(account_guid)).Id, offset, limit);
return Ok(new { message = "account created" }); return Ok(transactions);
}
[HttpPut("{id}")]
public IActionResult Update(int id, [FromBody]AccountUpdateRequest model)
{
_accountService.Update(id, model, GetCurrentUserId());
return Ok(new { message = "account updated" });
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
_accountService.Delete(id, GetCurrentUserId());
return Ok(new { message = "account deleted" });
} }
// Helpers // Helpers
private int GetCurrentUserId() private async Task<AccountDTO> GetAccountAsync(string account_guid)
{
List<AccountDTO> accounts = await _puppeteerService.GetAccounts(GetCurrentUser());
AccountDTO account = accounts.FirstOrDefault(a => a.Id == account_guid) ?? throw new KeyNotFoundException("Account not found");
return account;
}
private User GetCurrentUser()
{ {
string apiKey = User.FindFirstValue(ClaimTypes.NameIdentifier); string apiKey = User.FindFirstValue(ClaimTypes.NameIdentifier);
return _userService.GetUser(apiKey);
if (apiKey is null)
_logger.LogInformation($"ApiKey: is null");
_logger.LogInformation($"apiKey: {apiKey}");
return _userService.GetUser(apiKey).Id;
} }
} }

View File

@ -1,109 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Controllers;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using AAIntegration.SimmonsBank.API.Models.Transactions;
using AAIntegration.SimmonsBank.API.Services;
using AAIntegration.SimmonsBank.API.Config;
using System.Runtime.InteropServices;
using AAIntegration.SimmonsBank.API.Entities;
using System.Collections.Generic;
using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;
[Authorize]
[ApiController]
[Route("[controller]")]
public class TransactionsController : ControllerBase
{
private ITransactionService _transactionService;
private IUserService _userService;
private IMapper _mapper;
private readonly AppSettings _appSettings;
private readonly ILogger<TransactionsController> _logger;
public TransactionsController(
ITransactionService transactionService,
IUserService userService,
IMapper mapper,
IOptions<AppSettings> appSettings,
ILogger<TransactionsController> logger)
{
_transactionService = transactionService;
_userService = userService;
_mapper = mapper;
_appSettings = appSettings.Value;
_logger = logger;
}
[HttpGet]
public IActionResult GetAll(int? accountId = null)
{
List<TransactionDto> transactionDtos = new List<TransactionDto>();
foreach (Transaction tran in _transactionService.GetAll(this.GetCurrentUserId()))
{
if (accountId.HasValue
&& (tran.DebitAccount == null || tran.DebitAccount.Id != accountId)
&& (tran.CreditAccount == null || tran.CreditAccount.Id != accountId))
continue;
transactionDtos.Add(_mapper.Map<Transaction, TransactionDto>(tran));
}
// Sort by Date
transactionDtos.Sort((t1, t2) => t2.Date.CompareTo(t1.Date));
return Ok(transactionDtos);
}
[HttpGet("{id}")]
public IActionResult GetById(int id)
{
Transaction tran = _transactionService.GetById(id, this.GetCurrentUserId());
return Ok(_mapper.Map<Transaction, TransactionDto>(tran));
}
[HttpPost("BulkAdd")]
public IActionResult BulkCreate([FromBody]List<TransactionCreate> model)
{
List<Transaction> trans = _transactionService.BulkCreate(model, this.GetCurrentUserId()).ToList();
return Ok(new { message = $"{trans.Count()} transaction(s) created." });
}
[HttpPost]
public IActionResult Create([FromBody]TransactionCreate model)
{
Transaction tran = _transactionService.Create(model, this.GetCurrentUserId());
return Ok(new { message = $"transaction '{tran.Description}' created with id '{tran.Id}'." });
}
[HttpPut("{id}")]
public IActionResult Update(int id, [FromBody]TransactionUpdateRequest model)
{
_transactionService.Update(id, model, this.GetCurrentUserId());
return Ok(new { message = $"transaction with id '{id}' updated" });
}
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
_transactionService.Delete(id, this.GetCurrentUserId());
return Ok(new { message = "transaction deleted" });
}
// Helpers
private int GetCurrentUserId()
{
string apiKey = User.FindFirstValue(ClaimTypes.NameIdentifier);
if (apiKey is null)
_logger.LogInformation($"ApiKey: is null");
_logger.LogInformation($"apiKey: {apiKey}");
return _userService.GetUser(apiKey).Id;
}
}

View File

@ -58,13 +58,6 @@ public class UsersController : ControllerBase
private string GetCurrentUserApiKey() private string GetCurrentUserApiKey()
{ {
string apiKey = User.FindFirstValue(ClaimTypes.NameIdentifier); return User.FindFirstValue(ClaimTypes.NameIdentifier);
if (apiKey is null)
_logger.LogInformation($"ApiKey: is null");
_logger.LogInformation($"apiKey: {apiKey}");
return apiKey;
} }
} }

View File

@ -1,12 +0,0 @@
using System.Text.Json.Serialization;
namespace AAIntegration.SimmonsBank.API.Entities;
public class Account
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Balance { get; set; }
public string ExternalAccountNumber { get; set; }
public User Owner { get; set; }
}

View File

@ -1,19 +0,0 @@
using System.Collections.Generic;
using AAIntegration.SimmonsBank.API.Services;
namespace AAIntegration.SimmonsBank.API.Entities;
public class Transaction
{
public int Id { get; set; }
public DateTime Date { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
public string ExternalId { get; set; }
public string Description { get; set; }
public Account? DebitAccount { get; set; }
public Account? CreditAccount { get; set; }
public decimal Amount { get; set; }
public bool IsPending { get; set; }
public User Owner { get; set; }
}

View File

@ -3,14 +3,9 @@ namespace AAIntegration.SimmonsBank.API.Config;
using AutoMapper; using AutoMapper;
using AAIntegration.SimmonsBank.API.Entities; using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Models.Users; using AAIntegration.SimmonsBank.API.Models.Users;
using AAIntegration.SimmonsBank.API.Models.Accounts;
using AAIntegration.SimmonsBank.API.Services;
using System.Runtime.Serialization;
using AAIntegration.SimmonsBank.API.Models.Transactions;
public class AutoMapperProfile : Profile public class AutoMapperProfile : Profile
{ {
public AutoMapperProfile() public AutoMapperProfile()
{ // UserUpdateRequest -> User { // UserUpdateRequest -> User
CreateMap<UserUpdateRequest, User>() CreateMap<UserUpdateRequest, User>()
@ -26,55 +21,5 @@ public class AutoMapperProfile : Profile
return true; return true;
} }
)); ));
// AccountUpdateRequest -> Account
CreateMap<AccountUpdateRequest, Account>();
// AccountCreateRequest -> Account
CreateMap<AccountCreateRequest, Account>();
/*.ForMember(
dest => dest.OwnerId,
opt => opt.MapFrom(src => src.Owner)
);
/*.ForAllMembers(x => x.Condition(
(src, dest, prop) =>
{
// ignore both null & empty string properties
if (prop == null) return false;
if (prop.GetType() == typeof(string) && string.IsNullOrEmpty((string)prop)) return false;
return true;
}
))*/
// Account -> AccountGet
CreateMap<Account, AccountDTO>()
.ForAllMembers(x => x.Condition(
(src, dest, prop) =>
{
// ignore both null & empty string properties
if (prop == null) return false;
if (prop.GetType() == typeof(string) && string.IsNullOrEmpty((string)prop)) return false;
return true;
}
));
// Transaction -> TransactionDto
CreateMap<Transaction, TransactionDto>()
.ForMember(dest => dest.DebitAccountId, opt => opt.MapFrom(src => src.DebitAccount.Id))
.ForMember(dest => dest.CreditAccountId, opt => opt.MapFrom(src => src.CreditAccount.Id))
.ForAllMembers(x => x.Condition(
(src, dest, prop) =>
{
// ignore both null & empty string properties
if (prop == null) return false;
if (prop.GetType() == typeof(string) && string.IsNullOrEmpty((string)prop)) return false;
return true;
}
));
} }
} }

View File

@ -31,6 +31,4 @@ public class DataContext : DbContext
}*/ }*/
public DbSet<User> Users { get; set; } public DbSet<User> Users { get; set; }
public DbSet<Account> Accounts { get; set; }
public DbSet<Transaction> Transactions { get; set; }
} }

View File

@ -1,14 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Models.Accounts;
using System.ComponentModel.DataAnnotations;
using System.Runtime.InteropServices;
using AAIntegration.SimmonsBank.API.Entities;
public class AccountCreateRequest
{
public string Name { get; set; }
public string InitialBalance { get; set; }
public int Currency { get; set; }
public string ExternalAccountNumber { get; set; }
public int Owner { get; set; }
}

View File

@ -7,8 +7,13 @@ 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; }
public string AccountType { get; set; }
public string AccountSubType { get; set; }
public DateTime? PaymentDueDate { get; set; }
public decimal? PaymentDueAmount { get; set; }
} }

View File

@ -1,8 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Models.Accounts;
public class AccountUpdateRequest
{
public string? Name { get; set; } = null;
public string? Balance { get; set; } = null;
public string? ExternalAccountNumber { get; set; } = null;
}

View File

@ -1,16 +0,0 @@
using System.Collections.Generic;
using System.Runtime;
using AAIntegration.SimmonsBank.API.Services;
namespace AAIntegration.SimmonsBank.API.Models.Transactions;
public class TransactionCreate
{
public DateTime Date { get; set; }
public string ExternalId { get; set; }
public string Description { get; set; }
public int? DebitAccount { get; set; }
public int? CreditAccount { get; set; }
public decimal Amount { get; set; }
public bool IsPending { get; set; }
}

View File

@ -0,0 +1,21 @@
using System.Collections.Generic;
using System.Runtime;
using AAIntegration.SimmonsBank.API.Services;
namespace AAIntegration.SimmonsBank.API.Models.Transactions;
public class TransactionDTO
{
public string Id { get; set; }
public string AccountId { get; set; }
public string Type { get; set; }
public decimal? Amount { get; set; }
public decimal? RunningBalance { get; set; }
public DateTime? DatePosted { get; set; }
public DateTime? Date { get; set; }
public DateTime? LastUpdated { get; set; }
public string PendingStatus { get; set; }
public string Memo { get; set; }
public string FilteredMemo { get; set; }
public string DisplayName { get; set; }
}

View File

@ -1,19 +0,0 @@
using System.Collections.Generic;
using System.Runtime;
using AAIntegration.SimmonsBank.API.Services;
namespace AAIntegration.SimmonsBank.API.Models.Transactions;
public class TransactionDto
{
public int Id { get; set; }
public DateTime Date { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime UpdatedOn { get; set; }
public string ExternalId { get; set; }
public string Description { get; set; }
public int DebitAccountId { get; set; }
public int CreditAccountId { get; set; }
public decimal Amount { get; set; }
public bool IsPending { get; set; }
}

View File

@ -1,15 +0,0 @@
using System.ComponentModel.DataAnnotations;
using AAIntegration.SimmonsBank.API.Entities;
namespace AAIntegration.SimmonsBank.API.Models.Transactions;
public class TransactionUpdateRequest
{
public DateTime? Date { get; set; } = null;
public string? ExternalId { get; set; } = null;
public string? Description { get; set; } = null;
public int? DebitAccount { get; set; } = null;
public int? CreditAccount { get; set; } = null;
public decimal? Amount { get; set; } = null;
public bool? IsPending { get; set; } = null;
}

View File

@ -0,0 +1,12 @@
using System.Threading.Tasks;
using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Services;
namespace AAIntegration.SimmonsBank.API.Processes;
public interface IPuppeteerProcess
{
void SetService(IPuppeteerService puppeteerService);
void SetStoppingToken(CancellationToken stoppingToken);
Task StayLoggedIn(User user);
}

View File

@ -0,0 +1,68 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using AAIntegration.SimmonsBank.API.Configs;
using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Models.Transactions;
using AAIntegration.SimmonsBank.API.Services;
using Internal;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Options;
using PuppeteerSharp;
using OtpNet;
using System.Text;
namespace AAIntegration.SimmonsBank.API.Processes;
public class PuppeteerProcess : IPuppeteerProcess
{
private readonly PuppeteerConfig _config;
private readonly ILogger<PuppeteerProcess> _logger;
private readonly IMemoryCache _memoryCache;
private const string DASHBOARD_SELECTOR = "body > banno-web > bannoweb-layout > bannoweb-dashboard";
private CancellationToken _stoppingToken;
private IPuppeteerService _puppeteerService;
public PuppeteerProcess(
IOptions<PuppeteerConfig> config,
ILogger<PuppeteerProcess> logger,
IMemoryCache memoryCache)
{
_config = config.Value;
_logger = logger;
_memoryCache = memoryCache;
_stoppingToken = new CancellationToken();
}
public void SetService(IPuppeteerService puppeteerService)
{
_puppeteerService = puppeteerService;
}
public void SetStoppingToken(CancellationToken stoppingToken)
{
_stoppingToken = stoppingToken;
}
public async Task StayLoggedIn(User user)
{
string prefix = $"Task::StayLoggedIn - {user.Id} - ";
if (!await _puppeteerService.IsLoggedIn(user, _stoppingToken))
{
_logger.LogInformation(prefix + "User is not logged in");
await _puppeteerService.Login(user, _stoppingToken);
}
else
{
_logger.LogInformation(prefix + "User is still logged in");
}
}
// Helper Functions
private async Task Delay(int milliseconds)
{
await Task.Delay(TimeSpan.FromMilliseconds(milliseconds), _stoppingToken);
}
}

View File

@ -11,6 +11,8 @@ using Microsoft.IdentityModel.Tokens;
using System.Text; using System.Text;
//using Microsoft.Build.Framework; //using Microsoft.Build.Framework;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using AAIntegration.SimmonsBank.API.Processes;
using AAIntegration.SimmonsBank.API.Workers;
internal class Program internal class Program
{ {
@ -68,7 +70,7 @@ internal class Program
// Configure strongly typed settings object // Configure strongly typed settings object
builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings")); builder.Services.Configure<AppSettings>(builder.Configuration.GetSection("AppSettings"));
builder.Services.Configure<EnvelopeFundConfig>(builder.Configuration.GetSection("EnvelopeFund")); builder.Services.Configure<PuppeteerConfig>(builder.Configuration.GetSection("Puppeteer"));
builder.Services.Configure<DatabaseConfig>(builder.Configuration.GetSection("ActiveAllocator:Database")); builder.Services.Configure<DatabaseConfig>(builder.Configuration.GetSection("ActiveAllocator:Database"));
DatabaseConfig dbConfig = builder.Configuration.GetSection("ActiveAllocator:Database").Get<DatabaseConfig>(); DatabaseConfig dbConfig = builder.Configuration.GetSection("ActiveAllocator:Database").Get<DatabaseConfig>();
@ -78,13 +80,16 @@ internal class Program
opt.UseNpgsql(dbConfig.GetConnectionString())); opt.UseNpgsql(dbConfig.GetConnectionString()));
builder.Services.AddScoped<IUserService, UserService>(); builder.Services.AddScoped<IUserService, UserService>();
builder.Services.AddScoped<IAccountService, AccountService>();
builder.Services.AddScoped<ITransactionService, TransactionService>();
builder.Services.AddScoped<ICacheService, CacheService>(); builder.Services.AddScoped<ICacheService, CacheService>();
builder.Services.AddScoped<IVersionService, VersionService>(); builder.Services.AddScoped<IVersionService, VersionService>();
builder.Services.AddScoped<IPuppeteerService, PuppeteerService>();
builder.Services.AddScoped<ApiKeyAuthenticationHandler>(); builder.Services.AddScoped<ApiKeyAuthenticationHandler>();
builder.Services.AddSingleton<IPuppeteerProcess, PuppeteerProcess>();
builder.Services.AddHostedService<PuppeteerWorker>();
var app = builder.Build(); var app = builder.Build();
// Apply Database Migrations - This is NOT recommended for multi-node deployment!!! // Apply Database Migrations - This is NOT recommended for multi-node deployment!!!

View File

@ -1,132 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Services;
using AutoMapper;
using BCrypt.Net;
using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Config;
using AAIntegration.SimmonsBank.API.Models.Accounts;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;
using Internal;
using Microsoft.EntityFrameworkCore;
public interface IAccountService
{
IEnumerable<Account> GetAll(int ownerId);
Account GetById(int accountId, int ownerId);
void Create(AccountCreateRequest model, int ownerId);
void Update(int accountId, AccountUpdateRequest model, int ownerId);
void Delete(int accountId, int ownerId);
}
public class AccountService : IAccountService
{
private DataContext _context;
private readonly IMapper _mapper;
private IUserService _userService;
public AccountService(
DataContext context,
IMapper mapper,
IUserService userService)
{
_context = context;
_mapper = mapper;
_userService = userService;
}
public IEnumerable<Account> GetAll(int ownerId)
{
return _context.Accounts
.Include(x => x.Owner)
.Where(x => x.Owner.Id == ownerId);
}
public Account GetById(int accountId, int ownerId)
{
return getAccount(accountId, ownerId);
}
public void Create(AccountCreateRequest model, int ownerId)
{
// Check that account with same name or same external number doesn't exist
IEnumerable<Account> accountsWithSameName = _context.Accounts
.Include(x => x.Owner)
.Where(x => x.Name.ToUpper() == model.Name.ToUpper() && x.Owner.Id == ownerId);
if (accountsWithSameName.Count() > 0)
throw new AppException("Account with name '" + model.Name + "' already exists");
if (!string.IsNullOrWhiteSpace(model.ExternalAccountNumber))
{
IEnumerable<Account> matches = _context.Accounts
.Include(x => x.Owner)
.Where(x => x.ExternalAccountNumber == model.ExternalAccountNumber && x.Owner.Id == ownerId);
if (matches.Count() > 0)
throw new AppException("Account with external account number '" + model.ExternalAccountNumber + "' already exists under account named '" + matches.First().Name + "'");
}
Account account = new Account {
Name = model.Name,
Balance = Convert.ToDecimal(model.InitialBalance),
ExternalAccountNumber = model.ExternalAccountNumber,
Owner = getOwner(ownerId)
};
_context.Accounts.Add(account);
_context.SaveChanges();
}
public void Update(int accountId, AccountUpdateRequest model, int ownerId)
{
Account account = getAccount(accountId, ownerId);
// validate
if (model.Name != account.Name && _context.Accounts
.Include(x => x.Owner)
.Any(x => x.Name == model.Name && x.Owner.Id == ownerId))
throw new AppException("Account with the name '" + model.Name + "' already exists");
// Name
if (!string.IsNullOrWhiteSpace(model.Name))
account.Name = model.Name;
// External Account Number
if (!string.IsNullOrWhiteSpace(model.ExternalAccountNumber))
account.ExternalAccountNumber = model.ExternalAccountNumber;
_context.Accounts.Update(account);
_context.SaveChanges();
}
public void Delete(int accountId, int ownerId)
{
var account = getAccount(accountId, ownerId);
_context.Accounts.Remove(account);
_context.SaveChanges();
}
// helper methods
private Account getAccount(int id, int ownerId)
{
var account = _context.Accounts
.Include(x => x.Owner)
.FirstOrDefault(x => x.Id == id && x.Owner.Id == ownerId);
if (account == null) throw new KeyNotFoundException("Account not found");
return account;
}
private User getOwner(int ownerId)
{
User? owner = _context.Users.Find(ownerId);
if (owner == null)
throw new AppException($"Owner with ID of '{ownerId}' could not be found");
return owner;
}
}

View File

@ -1,22 +1,29 @@
namespace AAIntegration.SimmonsBank.API.Services; namespace AAIntegration.SimmonsBank.API.Services;
using AAIntegration.SimmonsBank.API.Config;
using AAIntegration.SimmonsBank.API.Entities;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
public interface ICacheService public interface ICacheService
{ {
int GetClientIdFromApiKey(string apiKey); int GetClientIdFromApiKey(string apiKey);
T GetCachedUserValue<T>(User user, string cacheKey, T fallback);
void SetCachedUserValue<T>(User user, string cacheKey, T value);
} }
public class CacheService : ICacheService public class CacheService : ICacheService
{ {
private DataContext _context;
private readonly IMemoryCache _memoryCache; private readonly IMemoryCache _memoryCache;
private readonly IUserService _userService;
private readonly ILogger<ICacheService> _logger; private readonly ILogger<ICacheService> _logger;
public CacheService(IMemoryCache memoryCache, IUserService userService, ILogger<ICacheService> logger) public CacheService(
DataContext context,
IMemoryCache memoryCache,
ILogger<ICacheService> logger)
{ {
_context = context;
_memoryCache = memoryCache; _memoryCache = memoryCache;
_userService = userService;
_logger = logger; _logger = logger;
} }
@ -26,7 +33,9 @@ public class CacheService : ICacheService
{ {
_logger.LogInformation($"Could not find API key '{apiKey}' in cache."); _logger.LogInformation($"Could not find API key '{apiKey}' in cache.");
internalKeys = _userService.GetAllApiKeys(); internalKeys = _context.Users
.Where(u => u.ApiKey != null)
.ToDictionary(u => u.ApiKey, u => u.Id);
_logger.LogInformation("Updated cache with new key list."); _logger.LogInformation("Updated cache with new key list.");
PrintInternalKeys(internalKeys); PrintInternalKeys(internalKeys);
@ -43,6 +52,36 @@ public class CacheService : ICacheService
return clientId; return clientId;
} }
public T GetCachedUserValue<T>(User user, string cacheKey, T fallback)
{
if (_memoryCache.TryGetValue<Dictionary<int, T>>(cacheKey, out var internalKeys))
{
internalKeys ??= new Dictionary<int, T>();
List<KeyValuePair<int, T>> list = internalKeys.Where(x => x.Key == user.Id).ToList();
if (list.Count > 0 && list.First().Value != null)
{
_logger.LogInformation($"Found the '{typeof(T)}' type cached for user with id '{user.Id}' in cache '{cacheKey}'.");
return list.First().Value;
}
}
return fallback;
}
public void SetCachedUserValue<T>(User user, string cacheKey, T value)
{
_memoryCache.TryGetValue<Dictionary<int, T>>(cacheKey, out var internalKeys);
internalKeys ??= new Dictionary<int, T>();
if (internalKeys.ContainsKey(user.Id))
internalKeys[user.Id] = value;
else
internalKeys.Add(user.Id, value);
_memoryCache.Set(cacheKey, internalKeys);
}
// helpers // helpers
private void PrintInternalKeys(Dictionary<string, int> keys) private void PrintInternalKeys(Dictionary<string, int> keys)

View File

@ -0,0 +1,344 @@
namespace AAIntegration.SimmonsBank.API.Services;
using AutoMapper;
using BCrypt.Net;
using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Config;
using AAIntegration.SimmonsBank.API.Models.Users;
using System;
using System.Collections;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.Extensions.Options;
using System.Security.Cryptography;
using PuppeteerSharp;
using AAIntegration.SimmonsBank.API.Configs;
using Microsoft.Extensions.Caching.Memory;
using OtpNet;
using Newtonsoft.Json.Linq;
using NuGet.Protocol;
using Microsoft.Extensions.Logging;
using NuGet.Protocol.Core.Types;
using AAIntegration.SimmonsBank.API.Models.Accounts;
using AAIntegration.SimmonsBank.API.Models.Transactions;
public interface IPuppeteerService
{
Task<bool> Login(User user, CancellationToken cancellationToken);
Task<bool> IsLoggedIn(User user, CancellationToken cancellationToken);
Task<List<AccountDTO>> GetAccounts(User user);
Task<List<TransactionDTO>> GetTransactions(User user, string accountGuid, uint offset = 0, uint limit = 500);
}
public class PuppeteerService : IPuppeteerService
{
private const string API_BASE_PATH = "/a/consumer/api/v0";
private const string DASHBOARD_SELECTOR = "body > banno-web > bannoweb-layout > bannoweb-dashboard";
private const string USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36";
private readonly PuppeteerConfig _config;
private readonly ILogger<PuppeteerService> _logger;
private readonly IMemoryCache _memoryCache;
private DataContext _context;
private readonly IMapper _mapper;
private readonly IOptions<AppSettings> _appSettings;
private readonly ICacheService _cacheService;
public PuppeteerService(
IOptions<PuppeteerConfig> config,
ILogger<PuppeteerService> logger,
IMemoryCache memoryCache,
DataContext context,
IMapper mapper,
IOptions<AppSettings> appSettings,
ICacheService cacheService)
{
_config = config.Value;
_logger = logger;
_memoryCache = memoryCache;
_context = context;
_mapper = mapper;
_appSettings = appSettings;
_cacheService = cacheService;
}
public async Task<bool> Login(User user, CancellationToken cancellationToken)
{
string prefix = $"Task::Login - {user.Id} - ";
TimeSpan timeout = TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds);
// Setup Page
IBrowser browser = await GetUserBrowserAsync(user, cancellationToken);
await using IPage page = await browser.NewPageAsync();
await page.SetUserAgentAsync(USER_AGENT);
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
WaitUntilNavigation[] waitUntils = { WaitUntilNavigation.Networkidle0 };
// Navigate to login screen
await page.GoToAsync(_config.SimmonsBankBaseUrl + "/login");
try
{
// Type username
string selector = "#username";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
await page.TypeAsync(selector, user.SimmonsBankUsername);
// Press 1st Submit Button
selector = "jha-button";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
await page.ClickAsync(selector);
// Type password
selector = "#password";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
await page.TypeAsync(selector, user.SimmonsBankPassword);
// Click SignIn button - In Chrome -> JS Path worked well
selector = "#login-password-form > bannoweb-flex-wrapper:nth-child(5) > div > jha-button";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
IElementHandle signInButton = await page.QuerySelectorAsync(selector);
if (signInButton != null)
{
await signInButton.ClickAsync();
}
else
{
_logger.LogError(prefix + "Failed to find Sign-In button");
return false;
}
await page.WaitForNetworkIdleAsync();
// Find TOTP input
selector = "body > banno-web > bannoweb-login > bannoweb-login-steps > bannoweb-two-factor-verify > jha-slider > jha-slider-content > jha-slider-pane:nth-child(4) > bannoweb-two-factor-enter-code > article > form > jha-form-floating-group > input[type=text]";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
//await Delay(150);
// Generate TOTP code
Totp totpInstance = new Totp(Base32Encoding.ToBytes(user.MFAKey));
string totpCode = totpInstance.ComputeTotp();
// Type TOTP code
IElementHandle totpInput = await page.QuerySelectorAsync(selector);
await totpInput.TypeAsync(totpCode);
// Setup response handling
page.Response += LoginResponseHandler;
async void LoginResponseHandler(object sender, ResponseCreatedEventArgs args)
{
//IPage page = sender as IPage;
page.Response -= LoginResponseHandler;
JToken json = await args.Response.JsonAsync<JToken>();
string userId = json["id"].Value<string>();
_cacheService.SetCachedUserValue<string>(user, PuppeteerConstants.USER_SB_ID, userId);
}
// Click Verify Button
selector = "body > banno-web > bannoweb-login > bannoweb-login-steps > bannoweb-two-factor-verify > jha-slider > jha-slider-content > jha-slider-pane:nth-child(4) > bannoweb-two-factor-enter-code > article > form > jha-button";
await page.WaitForSelectorAsync(selector).WaitAsync(timeout, cancellationToken);
IElementHandle verifyButton = await page.QuerySelectorAsync(selector);
if (verifyButton != null)
{
await verifyButton.ClickAsync();
}
else
{
_logger.LogError(prefix + "Failed to find Verify button");
return false;
}
try
{
await page.WaitForSelectorAsync(DASHBOARD_SELECTOR).WaitAsync(timeout, cancellationToken);
}
catch(TimeoutException)
{
_logger.LogWarning(prefix + $"Dashboard isn't loading after login");
return false;
}
_logger.LogInformation(prefix + $"Login success");
return true;
}
catch (TaskCanceledException)
{
_logger.LogError(prefix + $"Login Task was canceled");
}
catch (TimeoutException ex)
{
//_logger.LogWarning($"Login Task timed out for user '{user.Id}' after {timeout} seconds");
_logger.LogError(0, ex, prefix + $"Login Task timed out after {timeout} seconds");
return false;
}
finally
{
await page.CloseAsync();
}
return false;
}
public async Task<bool> IsLoggedIn(User user, CancellationToken cancellationToken)
{
string prefix = $"Task::IsLoggedIn - {user.Id} - ";
// Get User ID
string userSbId = _cacheService.GetCachedUserValue<string>(user, PuppeteerConstants.USER_SB_ID, "");
if (string.IsNullOrWhiteSpace(userSbId))
{
//_logger.LogInformation(prefix + $"User SimmonsBank ID not found. User is not logged in.");
return false;
}
// Setup Page
IBrowser browser = await GetUserBrowserAsync(user, cancellationToken);
await using IPage page = await browser.NewPageAsync();
await page.SetUserAgentAsync(USER_AGENT);
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
// Fetch accounts
string url = _config.SimmonsBankBaseUrl + API_BASE_PATH + "/users/" + userSbId + "/accounts";
try
{
IResponse response = await page.GoToAsync(url).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds), cancellationToken);
//_logger.LogInformation(prefix + $"Request response code '{response.Status}'. Url: '{url}'");
return response.Status == System.Net.HttpStatusCode.OK;
}
catch(TaskCanceledException)
{
_logger.LogError(prefix + $"Task was canceled");
}
catch(TimeoutException)
{
_logger.LogError(prefix + $"Request to '{url}' timed out");
}
return false;
}
public async Task<List<AccountDTO>> GetAccounts(User user)
{
string prefix = $"Task::GetAccounts - {user.Id} - ";
// Get User ID
string userSbId = _cacheService.GetCachedUserValue<string>(user, PuppeteerConstants.USER_SB_ID, "");
if (string.IsNullOrWhiteSpace(userSbId))
{
_logger.LogWarning(prefix + $"User SimmonsBank ID not found. User is not logged in.");
return null;
}
// Setup Page
IBrowser browser = await GetUserBrowserAsync(user, new CancellationToken());
await using IPage page = await browser.NewPageAsync();
await page.SetUserAgentAsync(USER_AGENT);
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
// Fetch accounts
string url = _config.SimmonsBankBaseUrl + API_BASE_PATH + "/users/" + userSbId + "/accounts";
try
{
IResponse response = await page.GoToAsync(url).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds));
//_logger.LogInformation(prefix + $"Request response code '{response.Status}'. Url: '{url}'");
if (response.Status == System.Net.HttpStatusCode.OK)
{
JToken accounts = await response.JsonAsync<JToken>();
return accounts.SelectToken("accounts").ToObject<List<AccountDTO>>();
}
else
_logger.LogError(prefix + $"Received unexpected status code '{response.Status}'");
}
catch(TaskCanceledException)
{
_logger.LogError(prefix + $"Task was canceled");
}
catch(TimeoutException)
{
_logger.LogError(prefix + $"Request to '{url}' timed out");
}
return null;
}
public async Task<List<TransactionDTO>> GetTransactions(User user, string accountGuid, uint offset = 0, uint limit = 500)
{
string prefix = $"Task::GetTransactions - {user.Id} - ";
// Get User ID
string userSbId = _cacheService.GetCachedUserValue<string>(user, PuppeteerConstants.USER_SB_ID, "");
if (string.IsNullOrWhiteSpace(userSbId))
{
_logger.LogWarning(prefix + $"User SimmonsBank ID not found. User is not logged in.");
return null;
}
// Setup Page
IBrowser browser = await GetUserBrowserAsync(user, new CancellationToken());
await using IPage page = await browser.NewPageAsync();
await page.SetUserAgentAsync(USER_AGENT);
await page.SetViewportAsync(new ViewPortOptions { Width = 1200, Height = 720 });
// Fetch transactions
string url = _config.SimmonsBankBaseUrl + API_BASE_PATH + $"/users/{userSbId}/accounts/{accountGuid}/transactions?offset={offset}&limit={limit}";
try
{
IResponse response = await page.GoToAsync(url).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds));
//_logger.LogInformation(prefix + $"Request response code '{response.Status}'. Url: '{url}'");
if (response.Status == System.Net.HttpStatusCode.OK)
{
JToken transactions = await response.JsonAsync<JToken>();
return transactions.SelectToken("transactions").ToObject<List<TransactionDTO>>();
}
else
_logger.LogError(prefix + $"Received unexpected status code '{response.Status}'");
}
catch(TaskCanceledException)
{
_logger.LogError(prefix + $"Task was canceled");
}
catch(TimeoutException)
{
_logger.LogError(prefix + $"Request to '{url}' timed out");
}
return null;
}
// Helper / Private Functions
private async Task<IBrowser> GetUserBrowserAsync(User user, CancellationToken cancellationToken)
{
IBrowser cachedBrowser = _cacheService.GetCachedUserValue<IBrowser>(user, PuppeteerConstants.BROWSER_CACHE_KEY, null);
if (cachedBrowser != null)
return cachedBrowser;
//_logger.LogInformation($"Could NOT find the browser for user with id '{user.Id}'. About to create one...");
using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync().WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds * 20), cancellationToken);
var options = new LaunchOptions {
Headless = _config.Headless,
IgnoreHTTPSErrors = true,
};
IBrowser browser = await Puppeteer.LaunchAsync(options).WaitAsync(TimeSpan.FromSeconds(_config.BrowserOperationTimeoutSeconds), cancellationToken);
_cacheService.SetCachedUserValue<IBrowser>(user, PuppeteerConstants.BROWSER_CACHE_KEY, browser);
return browser;
}
}

View File

@ -1,230 +0,0 @@
namespace AAIntegration.SimmonsBank.API.Services;
using AutoMapper;
using BCrypt.Net;
using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Config;
using AAIntegration.SimmonsBank.API.Models.Transactions;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System;
using Microsoft.EntityFrameworkCore;
using Internal;
using System.Collections.Immutable;
public interface ITransactionService
{
IEnumerable<Transaction> GetAll(int ownerId);
Transaction GetById(int id, int ownerId);
IEnumerable<Transaction> BulkCreate(List<TransactionCreate> model, int ownerId);
Transaction Create(TransactionCreate model, int ownerId, bool errorOnFail = true);
void Update(int id, TransactionUpdateRequest model, int ownerId);
void Delete(int id, int ownerId);
}
public class TransactionService : ITransactionService
{
private DataContext _context;
private readonly IMapper _mapper;
private readonly ILogger<TransactionService> _logger;
public TransactionService(
DataContext context,
IMapper mapper,
ILogger<TransactionService> logger)
{
_context = context;
_mapper = mapper;
_logger = logger;
}
public IEnumerable<Transaction> GetAll(int ownerId)
{
return _context.Transactions
.Include(t => t.DebitAccount)
.Include(t => t.CreditAccount)
.Include(t => t.Owner)
.Where(x => x.Owner.Id == ownerId);
}
public Transaction GetById(int id, int ownerId)
{
return getTransaction(id, ownerId);
}
private Account prepareAccount(int? accountId)
{
if (accountId == null || accountId.Value == 0)
{
return null;
}
Account account = _context.Accounts.Find(accountId.Value);
if (account == null)
throw new AppException("Could not find account with ID of '" + accountId.Value + "'.");
return account;
}
public IEnumerable<Transaction> BulkCreate(List<TransactionCreate> model, int ownerId)
{
List<Transaction> transactions = new List<Transaction>();
foreach (TransactionCreate tr in model)
{
var tran = this.Create(tr, ownerId, false);
if (tran != null)
transactions.Add(tran);
}
return transactions;
}
public Transaction Create(TransactionCreate model, int ownerId, bool errorOnFail = true)
{
Transaction transaction = new Transaction {
Description = model.Description,
Date = model.Date.Date.ToUniversalTime(),
CreatedOn = DateTime.UtcNow,
UpdatedOn = DateTime.UtcNow,
ExternalId = string.IsNullOrWhiteSpace(model.ExternalId) ? "" : model.ExternalId,
DebitAccount = prepareAccount(model.DebitAccount),
CreditAccount = prepareAccount(model.CreditAccount),
Amount = Convert.ToDecimal(model.Amount),
Owner = this.getOwner(ownerId),
IsPending = model.IsPending
};
if (this.ValidateTransaction(transaction, ownerId, errorOnFail) == false)
{
_logger.LogInformation($"Aborted adding transaction '{transaction.Description}'.");
return null;
}
// At this point transaction itself is valid
_context.Transactions.Add(transaction);
_context.SaveChanges();
_logger.LogInformation("New transaction successfully created.");
return transaction;
}
public void Update(int id, TransactionUpdateRequest model, int ownerId)
{
Transaction transaction = getTransaction(id, ownerId);
// Transaction.Date
if (model.Date.HasValue)
transaction.Date = model.Date.Value;
// Transaction.ExternalId
if (model.ExternalId != null)
transaction.ExternalId = model.ExternalId;
// Transaction.Description
if (model.Description != null)
transaction.Description = model.Description;
// Transaction.DebitAccount
if (model.DebitAccount.HasValue)
transaction.DebitAccount = prepareAccount(model.DebitAccount);
// Transaction.CreditAccount
if (model.CreditAccount.HasValue)
transaction.CreditAccount = prepareAccount(model.CreditAccount.Value);
// Transaction.Amount
if (model.Amount.HasValue)
transaction.Amount = model.Amount.Value;
// Transaction.IsPending
if (model.IsPending.HasValue)
transaction.IsPending = model.IsPending.Value;
this.ValidateTransaction(transaction, ownerId);
transaction.UpdatedOn = DateTime.UtcNow;
_context.Transactions.Update(transaction);
_context.SaveChanges();
_logger.LogInformation($"Transaction '{id}' successfully updated.");
}
public void Delete(int id, int ownerId)
{
var transaction = getTransaction(id, ownerId);
_context.Transactions.Remove(transaction);
_context.SaveChanges();
}
// helpers
private bool ErrorOrFalse(bool error, string errorMessage)
{
if (error)
throw new AppException(errorMessage);
_logger.LogWarning(errorMessage);
return false;
}
private bool ValidateTransaction(Transaction transaction, int ownerId, bool errorOnFail = true)
{
// There has to be at least 1 specified account
if (transaction.DebitAccount == null && transaction.CreditAccount == null)
return ErrorOrFalse(errorOnFail, "There must be an envelope or account chosen for a transaction.");
// Accounts cannot be the same
if (transaction.DebitAccount != null && transaction.CreditAccount != null &&
transaction.DebitAccount.Id == transaction.CreditAccount.Id)
return ErrorOrFalse(errorOnFail, "The debit and credit accounts of a transaction cannot be the same.");
// Transaction Duplication Check - External ID
if (!string.IsNullOrWhiteSpace(transaction.ExternalId)
&& _context.Transactions
.Include(x => x.Owner)
.Any(x => x.ExternalId == transaction.ExternalId && x.Owner.Id == ownerId))
return ErrorOrFalse(errorOnFail, "Transaction with the external ID '" + transaction.ExternalId + "' already exists");
// Transaction Duplication Check - All other fields
/*if (_context.Transactions.Any(x =>
x.Description == transaction.Description
&& x.Date == transaction.Date
&& x.DebitAccount == transaction.DebitAccount
&& x.CreditAccount == transaction.CreditAccount
&& x.Amount == transaction.Amount))
{
return ErrorOrFalse(errorOnFail, "Transaction with the same fields already exists");
}*/
return true;
}
private Transaction getTransaction(int id, int ownerId)
{
var transaction = _context.Transactions
.Include(t => t.DebitAccount)
.Include(t => t.CreditAccount)
.Include(t => t.Owner)
.FirstOrDefault(t => t.Id == id && t.Owner.Id == ownerId);
if (transaction == null)
throw new KeyNotFoundException("Transaction not found");
return transaction;
}
private User getOwner(int ownerId)
{
User? owner = _context.Users.Find(ownerId);
if (owner == null)
throw new AppException($"Owner with ID of '{ownerId}' could not be found");
return owner;
}
}

View File

@ -1,58 +1,30 @@
namespace AAIntegration.SimmonsBank.API.Services; namespace AAIntegration.SimmonsBank.API.Services;
using AutoMapper;
using BCrypt.Net;
using AAIntegration.SimmonsBank.API.Entities; using AAIntegration.SimmonsBank.API.Entities;
using AAIntegration.SimmonsBank.API.Config; using AAIntegration.SimmonsBank.API.Config;
using AAIntegration.SimmonsBank.API.Models.Users; using AAIntegration.SimmonsBank.API.Models.Users;
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.Extensions.Options;
using System.Security.Cryptography; using System.Security.Cryptography;
public interface IUserService public interface IUserService
{ {
// New Based way
string Create(UserCreateRequest model); string Create(UserCreateRequest model);
void Update(string apiKey, UserUpdateRequest model); void Update(string apiKey, UserUpdateRequest model);
void Delete(string apiKey); void Delete(string apiKey);
Dictionary<string, int> GetAllApiKeys(); Dictionary<string, int> GetAllApiKeys();
User GetUser(string ApiKey); User GetUser(string ApiKey);
/* Other cringe way
AuthenticateResponse Authenticate(AuthenticateRequest model);
void Register(RegisterRequest model);
IEnumerable<User> GetAll(); IEnumerable<User> GetAll();
User GetById(int id);
void Update(int id, UserUpdateRequest model);
void Delete(int id);
Dictionary<string, int> GetAllApiKeys();
string GetUserApiKey(int id);
void InvalidateApiKey(string apiKey);
string CreateUserApiKey(int id);
*/
} }
public class UserService : IUserService public class UserService : IUserService
{ {
private DataContext _context; private DataContext _context;
private readonly IMapper _mapper;
private readonly IOptions<AppSettings> _appSettings;
public UserService( public UserService(
DataContext context, DataContext context)
IMapper mapper,
IOptions<AppSettings> appSettings)
{ {
_context = context; _context = context;
_mapper = mapper;
_appSettings = appSettings;
} }
public string Create(UserCreateRequest model) public string Create(UserCreateRequest model)
@ -116,6 +88,11 @@ public class UserService : IUserService
return user; return user;
} }
public IEnumerable<User> GetAll()
{
return _context.Users;
}
// helper methods // helper methods
private User getUser(int id) private User getUser(int id)
@ -124,7 +101,7 @@ public class UserService : IUserService
return user; return user;
} }
private const string _prefix = "CT-"; private const string _prefix = "SB-";
private const int _numberOfSecureBytesToGenerate = 32; private const int _numberOfSecureBytesToGenerate = 32;
private const int _lengthOfKey = 32; private const int _lengthOfKey = 32;

View File

@ -0,0 +1,143 @@
using System;
using AAIntegration.SimmonsBank.API.Configs;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using AAIntegration.SimmonsBank.API.Processes;
using AAIntegration.SimmonsBank.API.Services;
using AAIntegration.SimmonsBank.API.Entities;
using Microsoft.Extensions.Caching.Memory;
namespace AAIntegration.SimmonsBank.API.Workers;
public class PuppeteerWorker : BackgroundService
{
private readonly PuppeteerConfig _config;
private readonly IPuppeteerProcess _puppeteerProcess;
private readonly ILogger<PuppeteerWorker> _logger;
private readonly IMemoryCache _memoryCache;
private readonly IServiceScopeFactory _serviceScopeFactory;
public PuppeteerWorker(
IOptions<PuppeteerConfig> config,
IPuppeteerProcess puppeteerProcess,
ILogger<PuppeteerWorker> logger,
IMemoryCache memoryCache,
IServiceScopeFactory serviceScopeFactory)
{
_config = config.Value;
_puppeteerProcess = puppeteerProcess;
_logger = logger;
_memoryCache = memoryCache;
_serviceScopeFactory = serviceScopeFactory;
}
private IUserService _userService;
private IPuppeteerService _puppeteerService;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
DateTime? lastExecutedOn = null;
bool operationOccurred = false;
using (var scope = _serviceScopeFactory.CreateScope())
{
_userService = scope.ServiceProvider.GetService<IUserService>();
_puppeteerService = scope.ServiceProvider.GetService<IPuppeteerService>();
_puppeteerProcess.SetStoppingToken(stoppingToken);
_puppeteerProcess.SetService(_puppeteerService);
// This is how we keep the app running (in the background)
while (!stoppingToken.IsCancellationRequested)
{
// Keep Alive processing
operationOccurred = await ProcessUsersKeepalive();
_logger.LogInformation($"Operation occurred? {operationOccurred}");
// If no operation occurred, waits before looping again
if (lastExecutedOn != null && operationOccurred == false)
{
await Task.Delay(TimeSpan.FromMinutes(_config.TaskCheckIntervalMinutes), stoppingToken);
}
lastExecutedOn = DateTime.UtcNow;
_logger.LogInformation("PuppeteerWorker executed at: {time}", DateTimeOffset.Now);
}
}
}
private async Task<bool> ProcessUsersKeepalive()
{
bool operationOccurred = false;
foreach (User user in _userService.GetAll().ToList())
{
int ka = _config.KeepAliveIntervalMinutes;
int uka = (int)DateTime.UtcNow.Subtract(GetUserLastExecution(PuppeteerConfigConstants.KeepAliveIntervalMinutes, user.Id)).TotalMinutes;
//_logger.LogInformation($"KeepAlive configured to {ka}. This user hasn't been kept alive in {uka} minute(s).");
if (_config.KeepAliveIntervalMinutes <= (int)DateTime.UtcNow.Subtract(GetUserLastExecution(PuppeteerConfigConstants.KeepAliveIntervalMinutes, user.Id)).TotalMinutes)
{
await _puppeteerProcess.StayLoggedIn(user);
SetUserLastExecution(PuppeteerConfigConstants.KeepAliveIntervalMinutes, user.Id, DateTime.UtcNow);
operationOccurred = true;
_logger.LogInformation($"Operation set to true because of user {user.Id}");
}
}
return operationOccurred;
}
private DateTime GetUserLastExecution(string cacheKey, int userId)
{
var internalKeys = GetLastExecutionCachedDictionary(cacheKey);
if (!internalKeys.TryGetValue(userId, out var lastExecution))
{
_logger.LogInformation($"Could not find userId in '{cacheKey}' cache. Returning '{DateTime.MinValue}'.");
return DateTime.MinValue;
}
_logger.LogInformation($"Just got user {userId} from cache with value {lastExecution}");
return lastExecution;
}
private void SetUserLastExecution(string cacheKey, int userId, DateTime lastExecution)
{
var internalKeys = GetLastExecutionCachedDictionary(cacheKey);
if (internalKeys.ContainsKey(userId))
internalKeys[userId] = lastExecution;
else
internalKeys.Add(userId, lastExecution);
_memoryCache.Set(cacheKey, internalKeys);
_logger.LogInformation($"Just set user {userId} into cache with value {lastExecution}");
}
private Dictionary<int, DateTime> GetLastExecutionCachedDictionary(string cacheKey)
{
// Sets cache if no dictionary is found
if (!_memoryCache.TryGetValue<Dictionary<int, DateTime>>(cacheKey, out var internalKeys))
{
internalKeys = _userService.GetAll()
.ToDictionary(u => u.Id, u => DateTime.MinValue);
_memoryCache.Set(cacheKey, internalKeys);
_logger.LogInformation($"Updated users in '{cacheKey}' cache with new id list.");
}
return internalKeys;
}
private void PrintCacheValues(string cacheKey)
{
_logger.LogInformation($"Printing cache values from '{cacheKey}'");
Dictionary<int, DateTime> internalKeys = GetLastExecutionCachedDictionary(cacheKey);
foreach (KeyValuePair<int, DateTime> entry in internalKeys)
{
_logger.LogInformation($" {entry.Key} <=> {entry.Value}");
}
}
}

View File

@ -25,7 +25,12 @@
"Secret": "5de80277015f9fd564c4d1cc2cf827dbb1774cd66e7d79aa258d9c35a9f67f32fc6cf0dc24244242bd9501288e0fd69e315b", "Secret": "5de80277015f9fd564c4d1cc2cf827dbb1774cd66e7d79aa258d9c35a9f67f32fc6cf0dc24244242bd9501288e0fd69e315b",
"APIUrl": "https://localhost:7260" "APIUrl": "https://localhost:7260"
}, },
"EnvelopeFund": { "Puppeteer": {
"CheckIntervalInMinutes": 10 "Headless": true,
"BrowserOperationTimeoutSeconds": 5,
"TaskCheckIntervalMinutes": 1,
"KeepAliveIntervalMinutes": 1,
"CheckForNewDataIntervalMinutes": 15,
"SimmonsBankBaseUrl": "https://login.simmonsbank.com"
} }
} }

View File

@ -1,536 +0,0 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v7.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v7.0": {
"AAIntegration.SimmonsBank.API/1.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Authorization": "7.0.0",
"Microsoft.AspNetCore.OpenApi": "7.0.15",
"Microsoft.EntityFrameworkCore": "7.0.0",
"Microsoft.EntityFrameworkCore.Design": "7.0.0",
"Microsoft.IdentityModel.Tokens": "7.0.0",
"Npgsql.EntityFrameworkCore.PostgreSQL": "7.0.0",
"Swashbuckle.AspNetCore": "6.5.0"
},
"runtime": {
"AAIntegration.SimmonsBank.API.dll": {}
}
},
"Humanizer.Core/2.14.1": {
"runtime": {
"lib/net6.0/Humanizer.dll": {
"assemblyVersion": "2.14.0.0",
"fileVersion": "2.14.1.48190"
}
}
},
"Microsoft.AspNetCore.Authorization/7.0.0": {
"dependencies": {
"Microsoft.AspNetCore.Metadata": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0"
}
},
"Microsoft.AspNetCore.Metadata/7.0.0": {},
"Microsoft.AspNetCore.OpenApi/7.0.15": {
"dependencies": {
"Microsoft.OpenApi": "1.4.3"
},
"runtime": {
"lib/net7.0/Microsoft.AspNetCore.OpenApi.dll": {
"assemblyVersion": "7.0.15.0",
"fileVersion": "7.0.1523.60110"
}
}
},
"Microsoft.EntityFrameworkCore/7.0.0": {
"dependencies": {
"Microsoft.EntityFrameworkCore.Abstractions": "7.0.0",
"Microsoft.EntityFrameworkCore.Analyzers": "7.0.0",
"Microsoft.Extensions.Caching.Memory": "7.0.0",
"Microsoft.Extensions.DependencyInjection": "7.0.0",
"Microsoft.Extensions.Logging": "7.0.0"
},
"runtime": {
"lib/net6.0/Microsoft.EntityFrameworkCore.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51807"
}
}
},
"Microsoft.EntityFrameworkCore.Abstractions/7.0.0": {
"runtime": {
"lib/net6.0/Microsoft.EntityFrameworkCore.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51807"
}
}
},
"Microsoft.EntityFrameworkCore.Analyzers/7.0.0": {},
"Microsoft.EntityFrameworkCore.Design/7.0.0": {
"dependencies": {
"Humanizer.Core": "2.14.1",
"Microsoft.EntityFrameworkCore.Relational": "7.0.0",
"Microsoft.Extensions.DependencyModel": "7.0.0",
"Mono.TextTemplating": "2.2.1"
},
"runtime": {
"lib/net6.0/Microsoft.EntityFrameworkCore.Design.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51807"
}
}
},
"Microsoft.EntityFrameworkCore.Relational/7.0.0": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "7.0.0",
"Microsoft.Extensions.Configuration.Abstractions": "7.0.0"
},
"runtime": {
"lib/net6.0/Microsoft.EntityFrameworkCore.Relational.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51807"
}
}
},
"Microsoft.Extensions.ApiDescription.Server/6.0.5": {},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Caching.Abstractions": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0"
}
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {},
"Microsoft.Extensions.DependencyModel/7.0.0": {
"dependencies": {
"System.Text.Encodings.Web": "7.0.0",
"System.Text.Json": "7.0.0"
},
"runtime": {
"lib/net7.0/Microsoft.Extensions.DependencyModel.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.22.51805"
}
}
},
"Microsoft.Extensions.Logging/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "7.0.0",
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"Microsoft.Extensions.Options": "7.0.0"
}
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {},
"Microsoft.Extensions.Options/7.0.0": {
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "7.0.0",
"Microsoft.Extensions.Primitives": "7.0.0"
}
},
"Microsoft.Extensions.Primitives/7.0.0": {},
"Microsoft.IdentityModel.Abstractions/7.0.0": {
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Abstractions.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.40911"
}
}
},
"Microsoft.IdentityModel.Logging/7.0.0": {
"dependencies": {
"Microsoft.IdentityModel.Abstractions": "7.0.0"
},
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Logging.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.40911"
}
}
},
"Microsoft.IdentityModel.Tokens/7.0.0": {
"dependencies": {
"Microsoft.IdentityModel.Logging": "7.0.0"
},
"runtime": {
"lib/net6.0/Microsoft.IdentityModel.Tokens.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.40911"
}
}
},
"Microsoft.OpenApi/1.4.3": {
"runtime": {
"lib/netstandard2.0/Microsoft.OpenApi.dll": {
"assemblyVersion": "1.4.3.0",
"fileVersion": "1.4.3.0"
}
}
},
"Mono.TextTemplating/2.2.1": {
"dependencies": {
"System.CodeDom": "4.4.0"
},
"runtime": {
"lib/netstandard2.0/Mono.TextTemplating.dll": {
"assemblyVersion": "2.2.0.0",
"fileVersion": "2.2.1.1"
}
}
},
"Npgsql/7.0.0": {
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "7.0.0",
"System.Runtime.CompilerServices.Unsafe": "6.0.0"
},
"runtime": {
"lib/net7.0/Npgsql.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"Npgsql.EntityFrameworkCore.PostgreSQL/7.0.0": {
"dependencies": {
"Microsoft.EntityFrameworkCore": "7.0.0",
"Microsoft.EntityFrameworkCore.Abstractions": "7.0.0",
"Microsoft.EntityFrameworkCore.Relational": "7.0.0",
"Npgsql": "7.0.0"
},
"runtime": {
"lib/net7.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll": {
"assemblyVersion": "7.0.0.0",
"fileVersion": "7.0.0.0"
}
}
},
"Swashbuckle.AspNetCore/6.5.0": {
"dependencies": {
"Microsoft.Extensions.ApiDescription.Server": "6.0.5",
"Swashbuckle.AspNetCore.Swagger": "6.5.0",
"Swashbuckle.AspNetCore.SwaggerGen": "6.5.0",
"Swashbuckle.AspNetCore.SwaggerUI": "6.5.0"
}
},
"Swashbuckle.AspNetCore.Swagger/6.5.0": {
"dependencies": {
"Microsoft.OpenApi": "1.4.3"
},
"runtime": {
"lib/net7.0/Swashbuckle.AspNetCore.Swagger.dll": {
"assemblyVersion": "6.5.0.0",
"fileVersion": "6.5.0.0"
}
}
},
"Swashbuckle.AspNetCore.SwaggerGen/6.5.0": {
"dependencies": {
"Swashbuckle.AspNetCore.Swagger": "6.5.0"
},
"runtime": {
"lib/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll": {
"assemblyVersion": "6.5.0.0",
"fileVersion": "6.5.0.0"
}
}
},
"Swashbuckle.AspNetCore.SwaggerUI/6.5.0": {
"runtime": {
"lib/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll": {
"assemblyVersion": "6.5.0.0",
"fileVersion": "6.5.0.0"
}
}
},
"System.CodeDom/4.4.0": {
"runtime": {
"lib/netstandard2.0/System.CodeDom.dll": {
"assemblyVersion": "4.0.0.0",
"fileVersion": "4.6.25519.3"
}
}
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {},
"System.Text.Encodings.Web/7.0.0": {},
"System.Text.Json/7.0.0": {
"dependencies": {
"System.Text.Encodings.Web": "7.0.0"
}
}
}
},
"libraries": {
"AAIntegration.SimmonsBank.API/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"Humanizer.Core/2.14.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lQKvtaTDOXnoVJ20ibTuSIOf2i0uO0MPbDhd1jm238I+U/2ZnRENj0cktKZhtchBMtCUSRQ5v4xBCUbKNmyVMw==",
"path": "humanizer.core/2.14.1",
"hashPath": "humanizer.core.2.14.1.nupkg.sha512"
},
"Microsoft.AspNetCore.Authorization/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-0O7C7XHj+17Q0geMpnpRC0fnnALH2Yhaa2SAzX00OkeF2NZ/+zWoDymbSnepg1qhueufUivihZiVGtMeq5Zywg==",
"path": "microsoft.aspnetcore.authorization/7.0.0",
"hashPath": "microsoft.aspnetcore.authorization.7.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.Metadata/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ut2azlKz7BQpCKu6AiwKEjMHpRWoD4qu2Ff/n6KagjFsyDAfZY7lgYJ158vr4O0jXet6pV1uF1q3jmXvki0OlA==",
"path": "microsoft.aspnetcore.metadata/7.0.0",
"hashPath": "microsoft.aspnetcore.metadata.7.0.0.nupkg.sha512"
},
"Microsoft.AspNetCore.OpenApi/7.0.15": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5AnwJuy7lBaoDhos9SYzLxsGO/s8LsAnP1DR0JSUp1zGzBGnHJEgT4IafAk24PnveKgkiVwh77t5+dU652rwxA==",
"path": "microsoft.aspnetcore.openapi/7.0.15",
"hashPath": "microsoft.aspnetcore.openapi.7.0.15.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-9W+IfmAzMrp2ZpKZLhgTlWljSBM9Erldis1us61DAGi+L7Q6vilTbe1G2zDxtYO8F2H0I0Qnupdx5Cp4s2xoZw==",
"path": "microsoft.entityframeworkcore/7.0.0",
"hashPath": "microsoft.entityframeworkcore.7.0.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Pfu3Zjj5+d2Gt27oE9dpGiF/VobBB+s5ogrfI9sBsXQE1SG49RqVz5+IyeNnzhyejFrPIQsPDRMchhcojy4Hbw==",
"path": "microsoft.entityframeworkcore.abstractions/7.0.0",
"hashPath": "microsoft.entityframeworkcore.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Analyzers/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Qkd2H+jLe37o5ku+LjT6qf7kAHY75Yfn2bBDQgqr13DTOLYpEy1Mt93KPFjaZvIu/srEcbfGGMRL7urKm5zN8Q==",
"path": "microsoft.entityframeworkcore.analyzers/7.0.0",
"hashPath": "microsoft.entityframeworkcore.analyzers.7.0.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Design/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-fEEU/zZ/VblZRQxHNZxgGKVtEtOGqEAmuHkACV1i0H031bM8PQKTS7PlKPVOgg0C1v+6yeHoIAGGgbAvG9f7kw==",
"path": "microsoft.entityframeworkcore.design/7.0.0",
"hashPath": "microsoft.entityframeworkcore.design.7.0.0.nupkg.sha512"
},
"Microsoft.EntityFrameworkCore.Relational/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eQiYygtR2xZ0Uy7KtiFRHpoEx/U8xNwbNRgu1pEJgSxbJLtg6tDL1y2YcIbSuIRSNEljXIIHq/apEhGm1QL70g==",
"path": "microsoft.entityframeworkcore.relational/7.0.0",
"hashPath": "microsoft.entityframeworkcore.relational.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.ApiDescription.Server/6.0.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Ckb5EDBUNJdFWyajfXzUIMRkhf52fHZOQuuZg/oiu8y7zDCVwD0iHhew6MnThjHmevanpxL3f5ci2TtHQEN6bw==",
"path": "microsoft.extensions.apidescription.server/6.0.5",
"hashPath": "microsoft.extensions.apidescription.server.6.0.5.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-IeimUd0TNbhB4ded3AbgBLQv2SnsiVugDyGV1MvspQFVlA07nDC7Zul7kcwH5jWN3JiTcp/ySE83AIJo8yfKjg==",
"path": "microsoft.extensions.caching.abstractions/7.0.0",
"hashPath": "microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Caching.Memory/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-xpidBs2KCE2gw1JrD0quHE72kvCaI3xFql5/Peb2GRtUuZX+dYPoK/NTdVMiM67Svym0M0Df9A3xyU0FbMQhHw==",
"path": "microsoft.extensions.caching.memory/7.0.0",
"hashPath": "microsoft.extensions.caching.memory.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Configuration.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-f34u2eaqIjNO9YLHBz8rozVZ+TcFiFs0F3r7nUJd7FRkVSxk8u4OpoK226mi49MwexHOR2ibP9MFvRUaLilcQQ==",
"path": "microsoft.extensions.configuration.abstractions/7.0.0",
"hashPath": "microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-elNeOmkeX3eDVG6pYVeV82p29hr+UKDaBhrZyWvWLw/EVZSYEkZlQdkp0V39k/Xehs2Qa0mvoCvkVj3eQxNQ1Q==",
"path": "microsoft.extensions.dependencyinjection/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyInjection.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-h3j/QfmFN4S0w4C2A6X7arXij/M/OVw3uQHSOFxnND4DyAzO1F9eMX7Eti7lU/OkSthEE0WzRsfT/Dmx86jzCw==",
"path": "microsoft.extensions.dependencyinjection.abstractions/7.0.0",
"hashPath": "microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.DependencyModel/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-oONNYd71J3LzkWc4fUHl3SvMfiQMYUCo/mDHDEu76hYYxdhdrPYv6fvGv9nnKVyhE9P0h20AU8RZB5OOWQcAXg==",
"path": "microsoft.extensions.dependencymodel/7.0.0",
"hashPath": "microsoft.extensions.dependencymodel.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Nw2muoNrOG5U5qa2ZekXwudUn2BJcD41e65zwmDHb1fQegTX66UokLWZkJRpqSSHXDOWZ5V0iqhbxOEky91atA==",
"path": "microsoft.extensions.logging/7.0.0",
"hashPath": "microsoft.extensions.logging.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-kmn78+LPVMOWeITUjIlfxUPDsI0R6G0RkeAMBmQxAJ7vBJn4q2dTva7pWi65ceN5vPGjJ9q/Uae2WKgvfktJAw==",
"path": "microsoft.extensions.logging.abstractions/7.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Options/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-lP1yBnTTU42cKpMozuafbvNtQ7QcBjr/CcK3bYOGEMH55Fjt+iecXjT6chR7vbgCMqy3PG3aNQSZgo/EuY/9qQ==",
"path": "microsoft.extensions.options/7.0.0",
"hashPath": "microsoft.extensions.options.7.0.0.nupkg.sha512"
},
"Microsoft.Extensions.Primitives/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-um1KU5kxcRp3CNuI8o/GrZtD4AIOXDk+RLsytjZ9QPok3ttLUelLKpilVPuaFT3TFjOhSibUAso0odbOaCDj3Q==",
"path": "microsoft.extensions.primitives/7.0.0",
"hashPath": "microsoft.extensions.primitives.7.0.0.nupkg.sha512"
},
"Microsoft.IdentityModel.Abstractions/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-7iSWSRR72VKeonFdfDi43Lvkca98Y0F3TmmWhRSuHbkjk/IKUSO0Qd272LQFZpi5eDNQNbUXy3o4THXhOAU6cw==",
"path": "microsoft.identitymodel.abstractions/7.0.0",
"hashPath": "microsoft.identitymodel.abstractions.7.0.0.nupkg.sha512"
},
"Microsoft.IdentityModel.Logging/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6I35Kt2/PQZAyUYLo3+QgT/LubZ5/4Ojelkbyo8KKdDgjMbVocAx2B3P5V7iMCz+rsAe/RLr6ql87QKnHtI+aw==",
"path": "microsoft.identitymodel.logging/7.0.0",
"hashPath": "microsoft.identitymodel.logging.7.0.0.nupkg.sha512"
},
"Microsoft.IdentityModel.Tokens/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dxYqmmFLsjBQZ6F6a4XDzrZ1CTxBRFVigJvWiNtXiIsT6UlYMxs9ONMaGx9XKzcxmcgEQ2ADuCqKZduz0LR9Hw==",
"path": "microsoft.identitymodel.tokens/7.0.0",
"hashPath": "microsoft.identitymodel.tokens.7.0.0.nupkg.sha512"
},
"Microsoft.OpenApi/1.4.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rURwggB+QZYcSVbDr7HSdhw/FELvMlriW10OeOzjPT7pstefMo7IThhtNtDudxbXhW+lj0NfX72Ka5EDsG8x6w==",
"path": "microsoft.openapi/1.4.3",
"hashPath": "microsoft.openapi.1.4.3.nupkg.sha512"
},
"Mono.TextTemplating/2.2.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-KZYeKBET/2Z0gY1WlTAK7+RHTl7GSbtvTLDXEZZojUdAPqpQNDL6tHv7VUpqfX5VEOh+uRGKaZXkuD253nEOBQ==",
"path": "mono.texttemplating/2.2.1",
"hashPath": "mono.texttemplating.2.2.1.nupkg.sha512"
},
"Npgsql/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-tOBFksJZ2MiEz8xtDUgS5IG19jVO3nSP15QDYWiiGpXHe0PsLoQBts2Sg3hHKrrLTuw+AjsJz9iKvvGNHyKDIg==",
"path": "npgsql/7.0.0",
"hashPath": "npgsql.7.0.0.nupkg.sha512"
},
"Npgsql.EntityFrameworkCore.PostgreSQL/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-CyUNlFZmtX2Kmw8XK5Tlx5eVUCzWJ+zJHErxZiMo2Y8zCRuH9+/OMGwG+9Mmp5zD5p3Ifbi5Pp3btsqoDDkSZQ==",
"path": "npgsql.entityframeworkcore.postgresql/7.0.0",
"hashPath": "npgsql.entityframeworkcore.postgresql.7.0.0.nupkg.sha512"
},
"Swashbuckle.AspNetCore/6.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-FK05XokgjgwlCI6wCT+D4/abtQkL1X1/B9Oas6uIwHFmYrIO9WUD5aLC9IzMs9GnHfUXOtXZ2S43gN1mhs5+aA==",
"path": "swashbuckle.aspnetcore/6.5.0",
"hashPath": "swashbuckle.aspnetcore.6.5.0.nupkg.sha512"
},
"Swashbuckle.AspNetCore.Swagger/6.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XWmCmqyFmoItXKFsQSwQbEAsjDKcxlNf1l+/Ki42hcb6LjKL8m5Db69OTvz5vLonMSRntYO1XLqz0OP+n3vKnA==",
"path": "swashbuckle.aspnetcore.swagger/6.5.0",
"hashPath": "swashbuckle.aspnetcore.swagger.6.5.0.nupkg.sha512"
},
"Swashbuckle.AspNetCore.SwaggerGen/6.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Y/qW8Qdg9OEs7V013tt+94OdPxbRdbhcEbw4NiwGvf4YBcfhL/y7qp/Mjv/cENsQ2L3NqJ2AOu94weBy/h4KvA==",
"path": "swashbuckle.aspnetcore.swaggergen/6.5.0",
"hashPath": "swashbuckle.aspnetcore.swaggergen.6.5.0.nupkg.sha512"
},
"Swashbuckle.AspNetCore.SwaggerUI/6.5.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OvbvxX+wL8skxTBttcBsVxdh73Fag4xwqEU2edh4JMn7Ws/xJHnY/JB1e9RoCb6XpDxUF3hD9A0Z1lEUx40Pfw==",
"path": "swashbuckle.aspnetcore.swaggerui/6.5.0",
"hashPath": "swashbuckle.aspnetcore.swaggerui.6.5.0.nupkg.sha512"
},
"System.CodeDom/4.4.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-2sCCb7doXEwtYAbqzbF/8UAeDRMNmPaQbU2q50Psg1J9KzumyVVCgKQY8s53WIPTufNT0DpSe9QRvVjOzfDWBA==",
"path": "system.codedom/4.4.0",
"hashPath": "system.codedom.4.4.0.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/6.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==",
"path": "system.runtime.compilerservices.unsafe/6.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512"
},
"System.Text.Encodings.Web/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OP6umVGxc0Z0MvZQBVigj4/U31Pw72ITihDWP9WiWDm+q5aoe0GaJivsfYGq53o6dxH7DcXWiCTl7+0o2CGdmg==",
"path": "system.text.encodings.web/7.0.0",
"hashPath": "system.text.encodings.web.7.0.0.nupkg.sha512"
},
"System.Text.Json/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-DaGSsVqKsn/ia6RG8frjwmJonfos0srquhw09TlT8KRw5I43E+4gs+/bZj4K0vShJ5H9imCuXupb4RmS+dBy3w==",
"path": "system.text.json/7.0.0",
"hashPath": "system.text.json.7.0.0.nupkg.sha512"
}
}
}

View File

@ -1,20 +0,0 @@
{
"runtimeOptions": {
"tfm": "net7.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "7.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "7.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -1,20 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"AppSettings": {
"Secret": "5de80277015f9fd564c4d1cc2cf827dbb1774cd66e7d79aa258d9c35a9f67f32fc6cf0dc24244242bd9501288e0fd69e315b",
"APIUrl": "https://localhost:5279"
},
"Database": {
"Host": "localhost",
"Name": "AAISB_DB",
"User": "postgres",
"Password": "nqA3UV3CliLLHpLL",
"Port": "15432"
}
}

View File

@ -1,143 +0,0 @@
{
"format": 1,
"restore": {
"/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj": {}
},
"projects": {
"/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj",
"projectName": "AAIntegration.SimmonsBank.API",
"projectPath": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj",
"packagesPath": "/home/william/.nuget/packages/",
"outputPath": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/home/william/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net7.0"
],
"sources": {
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"net7.0": {
"targetAlias": "net7.0",
"dependencies": {
"AutoMapper": {
"target": "Package",
"version": "[12.0.1, )"
},
"AutoMapper.Extensions.Microsoft.DependencyInjection": {
"target": "Package",
"version": "[12.0.1, )"
},
"BCrypt.Net": {
"target": "Package",
"version": "[0.1.0, )"
},
"Microsoft.AspNetCore.Authentication.JwtBearer": {
"target": "Package",
"version": "[7.0.16, )"
},
"Microsoft.AspNetCore.SpaProxy": {
"target": "Package",
"version": "[7.0.13, )"
},
"Microsoft.EntityFrameworkCore": {
"target": "Package",
"version": "[7.0.9, )"
},
"Microsoft.EntityFrameworkCore.Design": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
"suppressParent": "All",
"target": "Package",
"version": "[7.0.9, )"
},
"Microsoft.IdentityModel.Tokens": {
"target": "Package",
"version": "[6.35.0, )"
},
"Microsoft.NET.Build.Containers": {
"target": "Package",
"version": "[7.0.400, )"
},
"Microsoft.VisualStudio.Web.CodeGeneration.Design": {
"target": "Package",
"version": "[7.0.8, )"
},
"Npgsql.EntityFrameworkCore.PostgreSQL": {
"target": "Package",
"version": "[7.0.4, )"
},
"Swashbuckle.AspNetCore": {
"target": "Package",
"version": "[6.5.0, )"
},
"System.IdentityModel.Tokens.Jwt": {
"target": "Package",
"version": "[6.35.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"downloadDependencies": [
{
"name": "Microsoft.AspNetCore.App.Ref",
"version": "[7.0.15, 7.0.15]"
},
{
"name": "Microsoft.AspNetCore.App.Runtime.linux-x64",
"version": "[7.0.15, 7.0.15]"
},
{
"name": "Microsoft.NETCore.App.Host.linux-x64",
"version": "[7.0.15, 7.0.15]"
},
{
"name": "Microsoft.NETCore.App.Runtime.linux-x64",
"version": "[7.0.15, 7.0.15]"
}
],
"frameworkReferences": {
"Microsoft.AspNetCore.App": {
"privateAssets": "none"
},
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/share/dotnet/sdk/7.0.115/RuntimeIdentifierGraph.json"
}
},
"runtimes": {
"linux-x64": {
"#import": []
}
}
}
}
}

View File

@ -1,27 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/home/william/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/home/william/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.4.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/home/william/.nuget/packages/" />
</ItemGroup>
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)microsoft.extensions.apidescription.server/6.0.5/build/Microsoft.Extensions.ApiDescription.Server.props" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.apidescription.server/6.0.5/build/Microsoft.Extensions.ApiDescription.Server.props')" />
<Import Project="$(NuGetPackageRoot)swashbuckle.aspnetcore/6.5.0/build/Swashbuckle.AspNetCore.props" Condition="Exists('$(NuGetPackageRoot)swashbuckle.aspnetcore/6.5.0/build/Swashbuckle.AspNetCore.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore/7.0.9/buildTransitive/net6.0/Microsoft.EntityFrameworkCore.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore/7.0.9/buildTransitive/net6.0/Microsoft.EntityFrameworkCore.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.build.containers/7.0.400/build/Microsoft.NET.Build.Containers.props" Condition="Exists('$(NuGetPackageRoot)microsoft.net.build.containers/7.0.400/build/Microsoft.NET.Build.Containers.props')" />
<Import Project="$(NuGetPackageRoot)microsoft.entityframeworkcore.design/7.0.9/build/net6.0/Microsoft.EntityFrameworkCore.Design.props" Condition="Exists('$(NuGetPackageRoot)microsoft.entityframeworkcore.design/7.0.9/build/net6.0/Microsoft.EntityFrameworkCore.Design.props')" />
</ImportGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgMicrosoft_Extensions_ApiDescription_Server Condition=" '$(PkgMicrosoft_Extensions_ApiDescription_Server)' == '' ">/home/william/.nuget/packages/microsoft.extensions.apidescription.server/6.0.5</PkgMicrosoft_Extensions_ApiDescription_Server>
<PkgMicrosoft_CodeAnalysis_Analyzers Condition=" '$(PkgMicrosoft_CodeAnalysis_Analyzers)' == '' ">/home/william/.nuget/packages/microsoft.codeanalysis.analyzers/3.3.3</PkgMicrosoft_CodeAnalysis_Analyzers>
<PkgMicrosoft_CodeAnalysis_AnalyzerUtilities Condition=" '$(PkgMicrosoft_CodeAnalysis_AnalyzerUtilities)' == '' ">/home/william/.nuget/packages/microsoft.codeanalysis.analyzerutilities/3.3.0</PkgMicrosoft_CodeAnalysis_AnalyzerUtilities>
</PropertyGroup>
</Project>

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)system.text.json/7.0.0/buildTransitive/net6.0/System.Text.Json.targets" Condition="Exists('$(NuGetPackageRoot)system.text.json/7.0.0/buildTransitive/net6.0/System.Text.Json.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.apidescription.server/6.0.5/build/Microsoft.Extensions.ApiDescription.Server.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.apidescription.server/6.0.5/build/Microsoft.Extensions.ApiDescription.Server.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/7.0.0/buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.extensions.logging.abstractions/7.0.0/buildTransitive/net6.0/Microsoft.Extensions.Logging.Abstractions.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.net.build.containers/7.0.400/build/Microsoft.NET.Build.Containers.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.net.build.containers/7.0.400/build/Microsoft.NET.Build.Containers.targets')" />
<Import Project="$(NuGetPackageRoot)microsoft.aspnetcore.spaproxy/7.0.13/build/Microsoft.AspNetCore.SpaProxy.targets" Condition="Exists('$(NuGetPackageRoot)microsoft.aspnetcore.spaproxy/7.0.13/build/Microsoft.AspNetCore.SpaProxy.targets')" />
</ImportGroup>
</Project>

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]

View File

@ -1,22 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("AAIntegration.SimmonsBank.API")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("AAIntegration.SimmonsBank.API")]
[assembly: System.Reflection.AssemblyTitleAttribute("AAIntegration.SimmonsBank.API")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@ -1 +0,0 @@
ccf0192c63cd8318a7ee7a5d81133f2750591ae8

View File

@ -1,17 +0,0 @@
is_global = true
build_property.TargetFramework = net7.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb = true
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = AAIntegration.SimmonsBank.API
build_property.RootNamespace = AAIntegration.SimmonsBank.API
build_property.ProjectDir = /home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/
build_property.RazorLangVersion = 7.0
build_property.SupportLocalizedComponentNames =
build_property.GenerateRazorMetadataSourceChecksumAttributes =
build_property.MSBuildProjectDirectory = /home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API
build_property._RazorSourceGeneratorDebug =

View File

@ -1,17 +0,0 @@
// <auto-generated/>
global using global::Microsoft.AspNetCore.Builder;
global using global::Microsoft.AspNetCore.Hosting;
global using global::Microsoft.AspNetCore.Http;
global using global::Microsoft.AspNetCore.Routing;
global using global::Microsoft.Extensions.Configuration;
global using global::Microsoft.Extensions.DependencyInjection;
global using global::Microsoft.Extensions.Hosting;
global using global::Microsoft.Extensions.Logging;
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Net.Http.Json;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@ -1,17 +0,0 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartAttribute("Microsoft.AspNetCore.OpenApi")]
[assembly: Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartAttribute("Swashbuckle.AspNetCore.SwaggerGen")]
// Generated by the MSBuild WriteCodeFragment class.

View File

@ -1,46 +0,0 @@
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.Development.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.deps.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.runtimeconfig.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Humanizer.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.AspNetCore.OpenApi.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Abstractions.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Design.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Relational.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.Extensions.DependencyModel.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Abstractions.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Logging.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Tokens.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.OpenApi.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Mono.TextTemplating.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.Swagger.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/System.CodeDom.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.AssemblyReference.cache
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GeneratedMSBuildEditorConfig.editorconfig
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfoInputs.cache
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfo.cs
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CoreCompileInputs.cache
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cs
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cache
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets/msbuild.AAIntegration.SimmonsBank.API.Microsoft.AspNetCore.StaticWebAssets.props
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets/msbuild.build.AAIntegration.SimmonsBank.API.props
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets/msbuild.buildMultiTargeting.AAIntegration.SimmonsBank.API.props
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets/msbuild.buildTransitive.AAIntegration.SimmonsBank.API.props
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets.pack.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets.build.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/staticwebassets.development.json
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/scopedcss/bundle/AAIntegration.SimmonsBank.API.styles.css
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CopyComplete
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/refint/AAIntegration.SimmonsBank.API.dll
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.genruntimeconfig.cache
/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/ref/AAIntegration.SimmonsBank.API.dll

View File

@ -1 +0,0 @@
73736abff76b35e69e45e19ba4a468a4281d3a6a

View File

@ -1,11 +0,0 @@
{
"Version": 1,
"Hash": "E7GbOSG6IO2M9jvlY+QNr8QU/kujs78xuuIJQtIbmH0=",
"Source": "AAIntegration.SimmonsBank.API",
"BasePath": "_content/AAIntegration.SimmonsBank.API",
"Mode": "Default",
"ManifestType": "Build",
"ReferencedProjectsConfiguration": [],
"DiscoveryPatterns": [],
"Assets": []
}

View File

@ -1,3 +0,0 @@
<Project>
<Import Project="Microsoft.AspNetCore.StaticWebAssets.props" />
</Project>

View File

@ -1,3 +0,0 @@
<Project>
<Import Project="../build/AAIntegration.SimmonsBank.API.props" />
</Project>

View File

@ -1,3 +0,0 @@
<Project>
<Import Project="../buildMultiTargeting/AAIntegration.SimmonsBank.API.props" />
</Project>

File diff suppressed because it is too large Load Diff

View File

@ -1,276 +0,0 @@
{
"version": 2,
"dgSpecHash": "pU4IZjFuw6ck49MYsMS+1UuAOx/hMvpbrwRe+YEG/+yMX3k4+UAMntT6PNgrQmrU6kLvRLvNkyt8WlX1uYoEtw==",
"success": true,
"projectFilePath": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj",
"expectedPackageFiles": [
"/home/william/.nuget/packages/automapper/12.0.1/automapper.12.0.1.nupkg.sha512",
"/home/william/.nuget/packages/automapper.extensions.microsoft.dependencyinjection/12.0.1/automapper.extensions.microsoft.dependencyinjection.12.0.1.nupkg.sha512",
"/home/william/.nuget/packages/bcrypt.net/0.1.0/bcrypt.net.0.1.0.nupkg.sha512",
"/home/william/.nuget/packages/humanizer/2.14.1/humanizer.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core/2.14.1/humanizer.core.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.af/2.14.1/humanizer.core.af.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ar/2.14.1/humanizer.core.ar.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.az/2.14.1/humanizer.core.az.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.bg/2.14.1/humanizer.core.bg.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.bn-bd/2.14.1/humanizer.core.bn-bd.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.cs/2.14.1/humanizer.core.cs.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.da/2.14.1/humanizer.core.da.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.de/2.14.1/humanizer.core.de.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.el/2.14.1/humanizer.core.el.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.es/2.14.1/humanizer.core.es.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.fa/2.14.1/humanizer.core.fa.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.fi-fi/2.14.1/humanizer.core.fi-fi.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.fr/2.14.1/humanizer.core.fr.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.fr-be/2.14.1/humanizer.core.fr-be.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.he/2.14.1/humanizer.core.he.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.hr/2.14.1/humanizer.core.hr.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.hu/2.14.1/humanizer.core.hu.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.hy/2.14.1/humanizer.core.hy.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.id/2.14.1/humanizer.core.id.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.is/2.14.1/humanizer.core.is.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.it/2.14.1/humanizer.core.it.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ja/2.14.1/humanizer.core.ja.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ko-kr/2.14.1/humanizer.core.ko-kr.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ku/2.14.1/humanizer.core.ku.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.lv/2.14.1/humanizer.core.lv.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ms-my/2.14.1/humanizer.core.ms-my.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.mt/2.14.1/humanizer.core.mt.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.nb/2.14.1/humanizer.core.nb.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.nb-no/2.14.1/humanizer.core.nb-no.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.nl/2.14.1/humanizer.core.nl.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.pl/2.14.1/humanizer.core.pl.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.pt/2.14.1/humanizer.core.pt.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ro/2.14.1/humanizer.core.ro.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.ru/2.14.1/humanizer.core.ru.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.sk/2.14.1/humanizer.core.sk.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.sl/2.14.1/humanizer.core.sl.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.sr/2.14.1/humanizer.core.sr.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.sr-latn/2.14.1/humanizer.core.sr-latn.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.sv/2.14.1/humanizer.core.sv.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.th-th/2.14.1/humanizer.core.th-th.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.tr/2.14.1/humanizer.core.tr.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.uk/2.14.1/humanizer.core.uk.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.uz-cyrl-uz/2.14.1/humanizer.core.uz-cyrl-uz.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.uz-latn-uz/2.14.1/humanizer.core.uz-latn-uz.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.vi/2.14.1/humanizer.core.vi.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.zh-cn/2.14.1/humanizer.core.zh-cn.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.zh-hans/2.14.1/humanizer.core.zh-hans.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/humanizer.core.zh-hant/2.14.1/humanizer.core.zh-hant.2.14.1.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.aspnetcore.authentication.jwtbearer/7.0.16/microsoft.aspnetcore.authentication.jwtbearer.7.0.16.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.aspnetcore.razor.language/6.0.11/microsoft.aspnetcore.razor.language.6.0.11.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.aspnetcore.spaproxy/7.0.13/microsoft.aspnetcore.spaproxy.7.0.13.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.bcl.asyncinterfaces/6.0.0/microsoft.bcl.asyncinterfaces.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.build/17.3.2/microsoft.build.17.3.2.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.build.framework/17.3.2/microsoft.build.framework.17.3.2.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.analyzers/3.3.3/microsoft.codeanalysis.analyzers.3.3.3.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.analyzerutilities/3.3.0/microsoft.codeanalysis.analyzerutilities.3.3.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.common/4.4.0/microsoft.codeanalysis.common.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.csharp/4.4.0/microsoft.codeanalysis.csharp.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.csharp.features/4.4.0/microsoft.codeanalysis.csharp.features.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.csharp.workspaces/4.4.0/microsoft.codeanalysis.csharp.workspaces.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.elfie/1.0.0/microsoft.codeanalysis.elfie.1.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.features/4.4.0/microsoft.codeanalysis.features.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.razor/6.0.11/microsoft.codeanalysis.razor.6.0.11.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.scripting.common/4.4.0/microsoft.codeanalysis.scripting.common.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.codeanalysis.workspaces.common/4.4.0/microsoft.codeanalysis.workspaces.common.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.csharp/4.7.0/microsoft.csharp.4.7.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.diasymreader/1.4.0/microsoft.diasymreader.1.4.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.dotnet.scaffolding.shared/7.0.8/microsoft.dotnet.scaffolding.shared.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.entityframeworkcore/7.0.9/microsoft.entityframeworkcore.7.0.9.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.entityframeworkcore.abstractions/7.0.9/microsoft.entityframeworkcore.abstractions.7.0.9.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.entityframeworkcore.analyzers/7.0.9/microsoft.entityframeworkcore.analyzers.7.0.9.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.entityframeworkcore.design/7.0.9/microsoft.entityframeworkcore.design.7.0.9.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.entityframeworkcore.relational/7.0.9/microsoft.entityframeworkcore.relational.7.0.9.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.apidescription.server/6.0.5/microsoft.extensions.apidescription.server.6.0.5.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.caching.abstractions/7.0.0/microsoft.extensions.caching.abstractions.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.caching.memory/7.0.0/microsoft.extensions.caching.memory.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.configuration.abstractions/7.0.0/microsoft.extensions.configuration.abstractions.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.dependencyinjection/7.0.0/microsoft.extensions.dependencyinjection.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.dependencyinjection.abstractions/7.0.0/microsoft.extensions.dependencyinjection.abstractions.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.dependencymodel/7.0.0/microsoft.extensions.dependencymodel.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.logging/7.0.0/microsoft.extensions.logging.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.logging.abstractions/7.0.0/microsoft.extensions.logging.abstractions.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.options/7.0.0/microsoft.extensions.options.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.extensions.primitives/7.0.0/microsoft.extensions.primitives.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.abstractions/6.35.0/microsoft.identitymodel.abstractions.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.jsonwebtokens/6.35.0/microsoft.identitymodel.jsonwebtokens.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.logging/6.35.0/microsoft.identitymodel.logging.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.protocols/6.35.0/microsoft.identitymodel.protocols.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.protocols.openidconnect/6.35.0/microsoft.identitymodel.protocols.openidconnect.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.identitymodel.tokens/6.35.0/microsoft.identitymodel.tokens.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.net.build.containers/7.0.400/microsoft.net.build.containers.7.0.400.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.net.stringtools/17.3.2/microsoft.net.stringtools.17.3.2.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.netcore.platforms/1.1.0/microsoft.netcore.platforms.1.1.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.netcore.targets/1.1.0/microsoft.netcore.targets.1.1.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.openapi/1.2.3/microsoft.openapi.1.2.3.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration/7.0.8/microsoft.visualstudio.web.codegeneration.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration.core/7.0.8/microsoft.visualstudio.web.codegeneration.core.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration.design/7.0.8/microsoft.visualstudio.web.codegeneration.design.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration.entityframeworkcore/7.0.8/microsoft.visualstudio.web.codegeneration.entityframeworkcore.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration.templating/7.0.8/microsoft.visualstudio.web.codegeneration.templating.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegeneration.utils/7.0.8/microsoft.visualstudio.web.codegeneration.utils.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.visualstudio.web.codegenerators.mvc/7.0.8/microsoft.visualstudio.web.codegenerators.mvc.7.0.8.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.win32.primitives/4.3.0/microsoft.win32.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.win32.systemevents/6.0.0/microsoft.win32.systemevents.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/mono.texttemplating/2.2.1/mono.texttemplating.2.2.1.nupkg.sha512",
"/home/william/.nuget/packages/netstandard.library/1.6.1/netstandard.library.1.6.1.nupkg.sha512",
"/home/william/.nuget/packages/newtonsoft.json/13.0.1/newtonsoft.json.13.0.1.nupkg.sha512",
"/home/william/.nuget/packages/npgsql/7.0.4/npgsql.7.0.4.nupkg.sha512",
"/home/william/.nuget/packages/npgsql.entityframeworkcore.postgresql/7.0.4/npgsql.entityframeworkcore.postgresql.7.0.4.nupkg.sha512",
"/home/william/.nuget/packages/nuget.common/6.3.1/nuget.common.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.configuration/6.3.1/nuget.configuration.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.dependencyresolver.core/6.3.1/nuget.dependencyresolver.core.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.frameworks/6.3.1/nuget.frameworks.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.librarymodel/6.3.1/nuget.librarymodel.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.packaging/6.3.1/nuget.packaging.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.projectmodel/6.3.1/nuget.projectmodel.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.protocol/6.3.1/nuget.protocol.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/nuget.versioning/6.3.1/nuget.versioning.6.3.1.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.collections/4.3.0/runtime.any.system.collections.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.diagnostics.tools/4.3.0/runtime.any.system.diagnostics.tools.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.diagnostics.tracing/4.3.0/runtime.any.system.diagnostics.tracing.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.globalization/4.3.0/runtime.any.system.globalization.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.globalization.calendars/4.3.0/runtime.any.system.globalization.calendars.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.io/4.3.0/runtime.any.system.io.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.reflection/4.3.0/runtime.any.system.reflection.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.reflection.extensions/4.3.0/runtime.any.system.reflection.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.reflection.primitives/4.3.0/runtime.any.system.reflection.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.resources.resourcemanager/4.3.0/runtime.any.system.resources.resourcemanager.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.runtime/4.3.0/runtime.any.system.runtime.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.runtime.handles/4.3.0/runtime.any.system.runtime.handles.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.runtime.interopservices/4.3.0/runtime.any.system.runtime.interopservices.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.text.encoding/4.3.0/runtime.any.system.text.encoding.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.text.encoding.extensions/4.3.0/runtime.any.system.text.encoding.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.threading.tasks/4.3.0/runtime.any.system.threading.tasks.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.any.system.threading.timer/4.3.0/runtime.any.system.threading.timer.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.native.system/4.3.0/runtime.native.system.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.native.system.io.compression/4.3.0/runtime.native.system.io.compression.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.native.system.net.http/4.3.0/runtime.native.system.net.http.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.native.system.security.cryptography.apple/4.3.0/runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.native.system.security.cryptography.openssl/4.3.0/runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0/runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.microsoft.win32.primitives/4.3.0/runtime.unix.microsoft.win32.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.console/4.3.0/runtime.unix.system.console.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.diagnostics.debug/4.3.0/runtime.unix.system.diagnostics.debug.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.io.filesystem/4.3.0/runtime.unix.system.io.filesystem.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.net.primitives/4.3.0/runtime.unix.system.net.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.net.sockets/4.3.0/runtime.unix.system.net.sockets.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.private.uri/4.3.0/runtime.unix.system.private.uri.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/runtime.unix.system.runtime.extensions/4.3.0/runtime.unix.system.runtime.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/swashbuckle.aspnetcore/6.5.0/swashbuckle.aspnetcore.6.5.0.nupkg.sha512",
"/home/william/.nuget/packages/swashbuckle.aspnetcore.swagger/6.5.0/swashbuckle.aspnetcore.swagger.6.5.0.nupkg.sha512",
"/home/william/.nuget/packages/swashbuckle.aspnetcore.swaggergen/6.5.0/swashbuckle.aspnetcore.swaggergen.6.5.0.nupkg.sha512",
"/home/william/.nuget/packages/swashbuckle.aspnetcore.swaggerui/6.5.0/swashbuckle.aspnetcore.swaggerui.6.5.0.nupkg.sha512",
"/home/william/.nuget/packages/system.appcontext/4.3.0/system.appcontext.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.buffers/4.3.0/system.buffers.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.codedom/4.4.0/system.codedom.4.4.0.nupkg.sha512",
"/home/william/.nuget/packages/system.collections/4.3.0/system.collections.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.collections.concurrent/4.3.0/system.collections.concurrent.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.collections.immutable/6.0.0/system.collections.immutable.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition/6.0.0/system.composition.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition.attributedmodel/6.0.0/system.composition.attributedmodel.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition.convention/6.0.0/system.composition.convention.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition.hosting/6.0.0/system.composition.hosting.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition.runtime/6.0.0/system.composition.runtime.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.composition.typedparts/6.0.0/system.composition.typedparts.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.configuration.configurationmanager/6.0.0/system.configuration.configurationmanager.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.console/4.3.0/system.console.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.data.datasetextensions/4.5.0/system.data.datasetextensions.4.5.0.nupkg.sha512",
"/home/william/.nuget/packages/system.diagnostics.debug/4.3.0/system.diagnostics.debug.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.diagnostics.diagnosticsource/4.3.0/system.diagnostics.diagnosticsource.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.diagnostics.tools/4.3.0/system.diagnostics.tools.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.diagnostics.tracing/4.3.0/system.diagnostics.tracing.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.drawing.common/6.0.0/system.drawing.common.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.formats.asn1/5.0.0/system.formats.asn1.5.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.globalization/4.3.0/system.globalization.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.globalization.calendars/4.3.0/system.globalization.calendars.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.globalization.extensions/4.3.0/system.globalization.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.identitymodel.tokens.jwt/6.35.0/system.identitymodel.tokens.jwt.6.35.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io/4.3.0/system.io.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io.compression/4.3.0/system.io.compression.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io.compression.zipfile/4.3.0/system.io.compression.zipfile.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io.filesystem/4.3.0/system.io.filesystem.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io.filesystem.primitives/4.3.0/system.io.filesystem.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.io.pipelines/6.0.3/system.io.pipelines.6.0.3.nupkg.sha512",
"/home/william/.nuget/packages/system.linq/4.3.0/system.linq.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.linq.expressions/4.3.0/system.linq.expressions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512",
"/home/william/.nuget/packages/system.net.http/4.3.0/system.net.http.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.net.nameresolution/4.3.0/system.net.nameresolution.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.net.primitives/4.3.0/system.net.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.net.sockets/4.3.0/system.net.sockets.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.objectmodel/4.3.0/system.objectmodel.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.private.uri/4.3.0/system.private.uri.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection/4.3.0/system.reflection.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.emit/4.3.0/system.reflection.emit.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.emit.ilgeneration/4.3.0/system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.emit.lightweight/4.3.0/system.reflection.emit.lightweight.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.extensions/4.3.0/system.reflection.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.metadata/6.0.0/system.reflection.metadata.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.metadataloadcontext/6.0.0/system.reflection.metadataloadcontext.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.primitives/4.3.0/system.reflection.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.reflection.typeextensions/4.3.0/system.reflection.typeextensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.resources.resourcemanager/4.3.0/system.resources.resourcemanager.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime/4.3.0/system.runtime.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.compilerservices.unsafe/6.0.0/system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.extensions/4.3.0/system.runtime.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.handles/4.3.0/system.runtime.handles.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.interopservices/4.3.0/system.runtime.interopservices.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.interopservices.runtimeinformation/4.3.0/system.runtime.interopservices.runtimeinformation.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.runtime.numerics/4.3.0/system.runtime.numerics.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.accesscontrol/6.0.0/system.security.accesscontrol.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.algorithms/4.3.0/system.security.cryptography.algorithms.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.cng/5.0.0/system.security.cryptography.cng.5.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.csp/4.3.0/system.security.cryptography.csp.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.encoding/4.3.0/system.security.cryptography.encoding.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.openssl/4.3.0/system.security.cryptography.openssl.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.pkcs/5.0.0/system.security.cryptography.pkcs.5.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.primitives/4.3.0/system.security.cryptography.primitives.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.protecteddata/6.0.0/system.security.cryptography.protecteddata.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.cryptography.x509certificates/4.3.0/system.security.cryptography.x509certificates.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.permissions/6.0.0/system.security.permissions.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.security.principal.windows/5.0.0/system.security.principal.windows.5.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.encoding/4.3.0/system.text.encoding.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.encoding.codepages/6.0.0/system.text.encoding.codepages.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.encoding.extensions/4.3.0/system.text.encoding.extensions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.encodings.web/7.0.0/system.text.encodings.web.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.json/7.0.0/system.text.json.7.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.text.regularexpressions/4.3.0/system.text.regularexpressions.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.threading/4.3.0/system.threading.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.threading.tasks/4.3.0/system.threading.tasks.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.threading.tasks.dataflow/6.0.0/system.threading.tasks.dataflow.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.threading.tasks.extensions/4.5.4/system.threading.tasks.extensions.4.5.4.nupkg.sha512",
"/home/william/.nuget/packages/system.threading.threadpool/4.3.0/system.threading.threadpool.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.threading.timer/4.3.0/system.threading.timer.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.windows.extensions/6.0.0/system.windows.extensions.6.0.0.nupkg.sha512",
"/home/william/.nuget/packages/system.xml.readerwriter/4.3.0/system.xml.readerwriter.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/system.xml.xdocument/4.3.0/system.xml.xdocument.4.3.0.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.netcore.app.runtime.linux-x64/7.0.15/microsoft.netcore.app.runtime.linux-x64.7.0.15.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.aspnetcore.app.ref/7.0.15/microsoft.aspnetcore.app.ref.7.0.15.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.aspnetcore.app.runtime.linux-x64/7.0.15/microsoft.aspnetcore.app.runtime.linux-x64.7.0.15.nupkg.sha512",
"/home/william/.nuget/packages/microsoft.netcore.app.host.linux-x64/7.0.15/microsoft.netcore.app.host.linux-x64.7.0.15.nupkg.sha512"
],
"logs": [
{
"code": "NU1701",
"level": "Warning",
"warningLevel": 1,
"message": "Package 'BCrypt.Net 0.1.0' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1' instead of the project target framework 'net7.0'. This package may not be fully compatible with your project.",
"libraryId": "BCrypt.Net",
"targetGraphs": [
"net7.0"
]
}
]
}

View File

@ -4,6 +4,16 @@ This is an integration for ActiveAllocator.
The type is Transaction Importer, specifically created for interfacing with SimmonsBank's online banking website. The type is Transaction Importer, specifically created for interfacing with SimmonsBank's online banking website.
## Guides
[Pass parameters to HTTP GET action](https://code-maze.com/aspnetcore-pass-parameters-to-http-get-action/)
## Dependencies
[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```.