diff --git a/AAIntegration.SimmonsBank.API/.env b/AAIntegration.SimmonsBank.API/.env
new file mode 100644
index 0000000..374562d
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/.env
@@ -0,0 +1,7 @@
+ActiveAllocator__Database__Host=database
+ActiveAllocator__Database__Port=5432
+
+
+POSTGRES_PASSWORD=nqA3UV3CliLLHpLL
+PGADMIN_DEFAULT_EMAIL=admin@admin.com
+PGADMIN_DEFAULT_PASSWORD=3254
diff --git a/AAIntegration.SimmonsBank.API/.gitignore b/AAIntegration.SimmonsBank.API/.gitignore
new file mode 100644
index 0000000..8f8b43b
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/.gitignore
@@ -0,0 +1,232 @@
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# User-specific files (MonoDevelop/Xamarin Studio)
+*.userprefs
+
+# Build results
+[Dd]ebug/
+[Dd]ebugPublic/
+[Rr]elease/
+[Rr]eleases/
+x64/
+x86/
+build/
+bld/
+bin/
+Bin/
+obj/
+Obj/
+
+# Visual Studio 2015 cache/options directory
+.vs/
+/wwwroot/dist/
+
+# MSTest test Results
+[Tt]est[Rr]esult*/
+[Bb]uild[Ll]og.*
+
+# NUNIT
+*.VisualState.xml
+TestResult.xml
+
+# Build Results of an ATL Project
+[Dd]ebugPS/
+[Rr]eleasePS/
+dlldata.c
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+# Chutzpah Test files
+_Chutzpah*
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opendb
+*.opensdf
+*.sdf
+*.cachefile
+
+# Visual Studio profiler
+*.psess
+*.vsp
+*.vspx
+*.sap
+
+# TFS 2012 Local Workspace
+$tf/
+
+# Guidance Automation Toolkit
+*.gpState
+
+# ReSharper is a .NET coding add-in
+_ReSharper*/
+*.[Rr]e[Ss]harper
+*.DotSettings.user
+
+# JustCode is a .NET coding add-in
+.JustCode
+
+# TeamCity is a build add-in
+_TeamCity*
+
+# DotCover is a Code Coverage Tool
+*.dotCover
+
+# NCrunch
+_NCrunch_*
+.*crunch*.local.xml
+nCrunchTemp_*
+
+# MightyMoose
+*.mm.*
+AutoTest.Net/
+
+# Web workbench (sass)
+.sass-cache/
+
+# Installshield output folder
+[Ee]xpress/
+
+# DocProject is a documentation generator add-in
+DocProject/buildhelp/
+DocProject/Help/*.HxT
+DocProject/Help/*.HxC
+DocProject/Help/*.hhc
+DocProject/Help/*.hhk
+DocProject/Help/*.hhp
+DocProject/Help/Html2
+DocProject/Help/html
+
+# Click-Once directory
+publish/
+
+# Publish Web Output
+*.[Pp]ublish.xml
+*.azurePubxml
+# TODO: Comment the next line if you want to checkin your web deploy settings
+# but database connection strings (with potential passwords) will be unencrypted
+*.pubxml
+*.publishproj
+
+# NuGet Packages
+*.nupkg
+# The packages folder can be ignored because of Package Restore
+**/packages/*
+# except build/, which is used as an MSBuild target.
+!**/packages/build/
+# Uncomment if necessary however generally it will be regenerated when needed
+#!**/packages/repositories.config
+
+# Microsoft Azure Build Output
+csx/
+*.build.csdef
+
+# Microsoft Azure Emulator
+ecf/
+rcf/
+
+# Microsoft Azure ApplicationInsights config file
+ApplicationInsights.config
+
+# Windows Store app package directory
+AppPackages/
+BundleArtifacts/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
+
+# Others
+ClientBin/
+~$*
+*~
+*.dbmdl
+*.dbproj.schemaview
+*.pfx
+*.publishsettings
+orleans.codegen.cs
+
+/node_modules
+
+# RIA/Silverlight projects
+Generated_Code/
+
+# Backup & report files from converting an old project file
+# to a newer Visual Studio version. Backup files are not needed,
+# because we have git ;-)
+_UpgradeReport_Files/
+Backup*/
+UpgradeLog*.XML
+UpgradeLog*.htm
+
+# SQL Server files
+*.mdf
+*.ldf
+
+# Business Intelligence projects
+*.rdl.data
+*.bim.layout
+*.bim_*.settings
+
+# Microsoft Fakes
+FakesAssemblies/
+
+# GhostDoc plugin setting file
+*.GhostDoc.xml
+
+# Node.js Tools for Visual Studio
+.ntvs_analysis.dat
+
+# Visual Studio 6 build log
+*.plg
+
+# Visual Studio 6 workspace options file
+*.opt
+
+# Visual Studio LightSwitch build output
+**/*.HTMLClient/GeneratedArtifacts
+**/*.DesktopClient/GeneratedArtifacts
+**/*.DesktopClient/ModelManifest.xml
+**/*.Server/GeneratedArtifacts
+**/*.Server/ModelManifest.xml
+_Pvt_Extensions
+
+# Paket dependency manager
+.paket/paket.exe
+
+# FAKE - F# Make
+.fake/
diff --git a/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj b/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj
new file mode 100644
index 0000000..6e5f1ae
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj
@@ -0,0 +1,37 @@
+
+
+
+ net7.0
+ enable
+ AAIntegration.SimmonsBank.API
+ false
+ enable
+
+
+
+ ActiveAllocator-Integration-SimmonsBank
+ DefaultContainer
+ 1.0.0;latest
+ linux-x64
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+
+
+
diff --git a/AAIntegration.SimmonsBank.API/Configs/ActiveAllocatorConfig.cs b/AAIntegration.SimmonsBank.API/Configs/ActiveAllocatorConfig.cs
new file mode 100644
index 0000000..47db1ec
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Configs/ActiveAllocatorConfig.cs
@@ -0,0 +1,8 @@
+namespace AAIntegration.SimmonsBank.API.Configs;
+
+public class ActiveAllocatorConfig
+{
+ DatabaseConfig Database { get; set; }
+ List AllowedHosts { get; set; }
+ string APIUrl { get; set; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Configs/ApiKeyAuthenticationOptions.cs b/AAIntegration.SimmonsBank.API/Configs/ApiKeyAuthenticationOptions.cs
new file mode 100644
index 0000000..28457f0
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Configs/ApiKeyAuthenticationOptions.cs
@@ -0,0 +1,9 @@
+namespace AAIntegration.SimmonsBank.API.Configs;
+
+using Microsoft.AspNetCore.Authentication;
+
+public class ApiKeyAuthenticationOptions : AuthenticationSchemeOptions
+{
+ public const string DefaultScheme = "ClientKey";
+ public const string HeaderName = "x-api-key";
+}
diff --git a/AAIntegration.SimmonsBank.API/Configs/AppSettings.cs b/AAIntegration.SimmonsBank.API/Configs/AppSettings.cs
new file mode 100644
index 0000000..6b83fa6
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Configs/AppSettings.cs
@@ -0,0 +1,7 @@
+namespace AAIntegration.SimmonsBank.API.Config;
+
+public class AppSettings
+{
+ public required string Secret { get; set; }
+ public required string APIUrl { get; set; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Configs/DatabaseConfig.cs b/AAIntegration.SimmonsBank.API/Configs/DatabaseConfig.cs
new file mode 100644
index 0000000..5615352
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Configs/DatabaseConfig.cs
@@ -0,0 +1,16 @@
+namespace AAIntegration.SimmonsBank.API.Configs;
+
+public class DatabaseConfig
+{
+ public string Host { get; set; }
+ public string Name { get; set; }
+ public string User { get; set; }
+ public string Password { get; set; }
+ public uint Port { get; set; }
+
+ public string GetConnectionString()
+ {
+ //Server=localhost;Port=15432;Database=aadb;User Id=postgres;Password=nqA3UV3CliLLHpLL"
+ return $"Server={Host};Port={Port};Database={Name};User Id={User};Password={Password}";
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Configs/EnvelopeFundConfig.cs b/AAIntegration.SimmonsBank.API/Configs/EnvelopeFundConfig.cs
new file mode 100644
index 0000000..7fb0dd5
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Configs/EnvelopeFundConfig.cs
@@ -0,0 +1,6 @@
+namespace AAIntegration.SimmonsBank.API.Configs;
+
+public class EnvelopeFundConfig
+{
+ public int CheckIntervalInMinutes { get; set; }
+}
diff --git a/AAIntegration.SimmonsBank.API/Controllers/AccountController.cs b/AAIntegration.SimmonsBank.API/Controllers/AccountController.cs
new file mode 100644
index 0000000..ddf1623
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Controllers/AccountController.cs
@@ -0,0 +1,70 @@
+namespace AAIntegration.SimmonsBank.API.Controllers;
+
+using AutoMapper;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using AAIntegration.SimmonsBank.API.Models.Accounts;
+using AAIntegration.SimmonsBank.API.Services;
+using AAIntegration.SimmonsBank.API.Config;
+using System.Collections.Generic;
+using AAIntegration.SimmonsBank.API.Entities;
+using Microsoft.AspNetCore.Authorization;
+
+[Authorize]
+[ApiController]
+[Route("[controller]")]
+public class AccountsController : ControllerBase
+{
+ private IAccountService _accountService;
+ private IMapper _mapper;
+ private readonly AppSettings _appSettings;
+
+ public AccountsController(
+ IAccountService accountService,
+ IMapper mapper,
+ IOptions appSettings)
+ {
+ _accountService = accountService;
+ _mapper = mapper;
+ _appSettings = appSettings.Value;
+ }
+
+ [HttpGet]
+ public IActionResult GetAll()
+ {
+ List accountDtos = new List();
+
+ foreach (Account acc in _accountService.GetAll())
+ accountDtos.Add(_mapper.Map(acc));
+
+ return Ok(accountDtos);
+ }
+
+ [HttpGet("{id}")]
+ public IActionResult GetById(int id)
+ {
+ Account account = _accountService.GetById(id);
+ return Ok(_mapper.Map(account));
+ }
+
+ [HttpPost]
+ public IActionResult Create([FromBody]AccountCreateRequest model)
+ {
+ _accountService.Create(model);
+ return Ok(new { message = "account created" });
+ }
+
+ [HttpPut("{id}")]
+ public IActionResult Update(int id, [FromBody]AccountUpdateRequest model)
+ {
+ _accountService.Update(id, model);
+ return Ok(new { message = "account updated" });
+ }
+
+ [HttpDelete("{id}")]
+ public IActionResult Delete(int id)
+ {
+ _accountService.Delete(id);
+ return Ok(new { message = "account deleted" });
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Controllers/AppInfoController.cs b/AAIntegration.SimmonsBank.API/Controllers/AppInfoController.cs
new file mode 100644
index 0000000..47a431a
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Controllers/AppInfoController.cs
@@ -0,0 +1,32 @@
+namespace AAIntegration.SimmonsBank.API.Controllers;
+
+using AutoMapper;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using AAIntegration.SimmonsBank.API.Models.Users;
+using AAIntegration.SimmonsBank.API.Services;
+using AAIntegration.SimmonsBank.API.Config;
+using System;
+using System.Security.Claims;
+using Microsoft.AspNetCore.Authorization;
+
+[ApiController]
+[Route("[controller]")]
+public class AppInfoController : ControllerBase
+{
+ private IVersionService _versionService;
+
+ public AppInfoController(
+ IVersionService versionService)
+ {
+ _versionService = versionService;
+ }
+
+ [HttpGet("ApplicationVersion")]
+ public IActionResult GetApplicationVersion()
+ {
+ string appVersion = _versionService.GetVersion();
+
+ return Ok(new { version = appVersion });
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Controllers/TransactionController.cs b/AAIntegration.SimmonsBank.API/Controllers/TransactionController.cs
new file mode 100644
index 0000000..3ae5c74
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Controllers/TransactionController.cs
@@ -0,0 +1,88 @@
+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;
+
+[Authorize]
+[ApiController]
+[Route("[controller]")]
+public class TransactionsController : ControllerBase
+{
+ private ITransactionService _transactionService;
+ private IMapper _mapper;
+ private readonly AppSettings _appSettings;
+
+ public TransactionsController(
+ ITransactionService transactionService,
+ IMapper mapper,
+ IOptions appSettings)
+ {
+ _transactionService = transactionService;
+ _mapper = mapper;
+ _appSettings = appSettings.Value;
+ }
+
+ [HttpGet]
+ public IActionResult GetAll(int? accountId = null)
+ {
+ List transactionDtos = new List();
+
+ foreach (Transaction tran in _transactionService.GetAll())
+ {
+ if (accountId.HasValue
+ && (tran.DebitAccount == null || tran.DebitAccount.Id != accountId)
+ && (tran.CreditAccount == null || tran.CreditAccount.Id != accountId))
+ continue;
+
+ transactionDtos.Add(_mapper.Map(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);
+ return Ok(_mapper.Map(tran));
+ }
+
+ [HttpPost("BulkAdd")]
+ public IActionResult BulkCreate([FromBody]List model)
+ {
+ List trans = _transactionService.BulkCreate(model).ToList();
+ return Ok(new { message = $"{trans.Count()} transaction(s) created." });
+ }
+
+ [HttpPost]
+ public IActionResult Create([FromBody]TransactionCreate model)
+ {
+ Transaction tran = _transactionService.Create(model);
+ 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);
+ return Ok(new { message = $"transaction with id '{id}' updated" });
+ }
+
+ [HttpDelete("{id}")]
+ public IActionResult Delete(int id)
+ {
+ _transactionService.Delete(id);
+ return Ok(new { message = "transaction deleted" });
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Controllers/UserController.cs b/AAIntegration.SimmonsBank.API/Controllers/UserController.cs
new file mode 100644
index 0000000..d526dc9
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Controllers/UserController.cs
@@ -0,0 +1,71 @@
+namespace AAIntegration.SimmonsBank.API.Controllers;
+
+using AutoMapper;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Options;
+using AAIntegration.SimmonsBank.API.Models.Users;
+using AAIntegration.SimmonsBank.API.Services;
+using AAIntegration.SimmonsBank.API.Config;
+using System;
+using Microsoft.AspNetCore.Authorization;
+using System.Security.Claims;
+
+[ApiController]
+[Route("[controller]")]
+public class UsersController : ControllerBase
+{
+ private IUserService _userService;
+ private IMapper _mapper;
+ private readonly AppSettings _appSettings;
+ private readonly ILogger _logger;
+
+ public UsersController(
+ IUserService userService,
+ IMapper mapper,
+ IOptions appSettings,
+ ILogger logger)
+ {
+ _userService = userService;
+ _mapper = mapper;
+ _appSettings = appSettings.Value;
+ _logger = logger;
+ }
+
+ [HttpPost("register")]
+ public IActionResult Register(UserCreateRequest model)
+ {
+ string apiKey = _userService.Create(model);
+ return Ok(new { ApiKey = apiKey });
+ }
+
+ [Authorize]
+ [HttpPut("{id}")]
+ public IActionResult Update([FromBody]UserUpdateRequest model)
+ {
+ _userService.Update(this.GetCurrentUserApiKey(), model);
+ return Ok(new { message = "User updated" });
+ }
+
+ [Authorize]
+ [HttpDelete("{id}")]
+ public IActionResult Delete(int id)
+ {
+ _userService.Delete(this.GetCurrentUserApiKey());
+ return Ok(new { message = "User deleted" });
+ }
+
+ // Helpers
+
+ private string GetCurrentUserApiKey()
+ {
+ string apiKey = User.FindFirstValue(ClaimTypes.NameIdentifier);
+
+ if (apiKey is null)
+ _logger.LogInformation($"ApiKey: is null");
+
+ _logger.LogInformation($"apiKey: {apiKey}");
+ Console.WriteLine($"User Id: " + apiKey);
+
+ return apiKey;
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Entities/Account.cs b/AAIntegration.SimmonsBank.API/Entities/Account.cs
new file mode 100644
index 0000000..6035572
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Entities/Account.cs
@@ -0,0 +1,11 @@
+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; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Entities/Transaction.cs b/AAIntegration.SimmonsBank.API/Entities/Transaction.cs
new file mode 100644
index 0000000..6737bae
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Entities/Transaction.cs
@@ -0,0 +1,18 @@
+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; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Entities/User.cs b/AAIntegration.SimmonsBank.API/Entities/User.cs
new file mode 100644
index 0000000..b7e9dc5
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Entities/User.cs
@@ -0,0 +1,13 @@
+using System.Text.Json.Serialization;
+
+namespace AAIntegration.SimmonsBank.API.Entities;
+
+public class User
+{
+ public int Id { get; set; }
+ public string ApiKey { get; set; }
+ public string SimmonsBankUsername { get; set; }
+ public string SimmonsBankPassword { get; set; }
+ public string MFAKey { get; set; }
+
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Enums/HistoricStatistic.cs b/AAIntegration.SimmonsBank.API/Enums/HistoricStatistic.cs
new file mode 100644
index 0000000..5d9f1a2
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Enums/HistoricStatistic.cs
@@ -0,0 +1,12 @@
+using System.Text.Json.Serialization;
+
+namespace AAIntegration.SimmonsBank.API.Enums;
+
+public enum HistoricStatistic
+{
+ Mean,
+ Median,
+ Mode,
+ Minimum,
+ Maximum,
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Enums/OperationMode.cs b/AAIntegration.SimmonsBank.API/Enums/OperationMode.cs
new file mode 100644
index 0000000..485fa4a
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Enums/OperationMode.cs
@@ -0,0 +1,10 @@
+using System.Text.Json.Serialization;
+
+namespace AAIntegration.SimmonsBank.API.Enums;
+
+public enum OperationMode
+{
+ Historic,
+ Absolute,
+ Percentage,
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Handlers/ApiKeyAuthenticationHandler.cs b/AAIntegration.SimmonsBank.API/Handlers/ApiKeyAuthenticationHandler.cs
new file mode 100644
index 0000000..28b6ba5
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Handlers/ApiKeyAuthenticationHandler.cs
@@ -0,0 +1,54 @@
+namespace AAIntegration.SimmonsBank.API.Handlers;
+
+using System.Security.Claims;
+using System.Text.Encodings.Web;
+using AAIntegration.SimmonsBank.API.Configs;
+using AAIntegration.SimmonsBank.API.Services;
+using Microsoft.AspNetCore.Authentication;
+using Microsoft.Extensions.Options;
+
+public class ApiKeyAuthenticationHandler : AuthenticationHandler
+{
+ private readonly ICacheService _cacheService;
+ private readonly ILogger _logger;
+
+ public ApiKeyAuthenticationHandler (
+ IOptionsMonitor options,
+ ILoggerFactory loggerFactory,
+ UrlEncoder encoder,
+ ISystemClock clock,
+ ICacheService cacheService,
+ ILogger logger
+ ) : base(options, loggerFactory, encoder, clock)
+ {
+ _cacheService = cacheService;
+ _logger = logger;
+ }
+
+ protected override async Task HandleAuthenticateAsync()
+ {
+ if (!Request.Headers.TryGetValue(ApiKeyAuthenticationOptions.HeaderName, out var apiKey) || apiKey.Count != 1)
+ {
+ //_logger.LogWarning("An API request was received without the x-api-key header");
+ return AuthenticateResult.Fail("Invalid parameters");
+ }
+
+ var clientId = _cacheService.GetClientIdFromApiKey(apiKey);
+
+ if (clientId <= 0)
+ {
+ _logger.LogWarning($"An API request was received with an invalid API key: {apiKey}");
+ return AuthenticateResult.Fail("Invalid parameters");
+ }
+
+ _logger.BeginScope("{ClientId}", clientId);
+
+ var claims = new[] { new Claim(ClaimTypes.NameIdentifier, apiKey.ToString()) };
+ var identity = new ClaimsIdentity(claims, ApiKeyAuthenticationOptions.DefaultScheme);
+ var identities = new List { identity };
+ var principal = new ClaimsPrincipal(identities);
+ var ticket = new AuthenticationTicket(principal, ApiKeyAuthenticationOptions.DefaultScheme);
+
+ return AuthenticateResult.Success(ticket);
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Helpers/AppException.cs b/AAIntegration.SimmonsBank.API/Helpers/AppException.cs
new file mode 100644
index 0000000..661abfd
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Helpers/AppException.cs
@@ -0,0 +1,17 @@
+namespace AAIntegration.SimmonsBank.API.Config;
+
+using System.Globalization;
+
+// custom exception class for throwing application specific exceptions (e.g. for validation)
+// that can be caught and handled within the application
+public class AppException : Exception
+{
+ public AppException() : base() {}
+
+ public AppException(string message) : base(message) { }
+
+ public AppException(string message, params object[] args)
+ : base(String.Format(CultureInfo.CurrentCulture, message, args))
+ {
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Helpers/AutoMapperProfile.cs b/AAIntegration.SimmonsBank.API/Helpers/AutoMapperProfile.cs
new file mode 100644
index 0000000..39e63a4
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Helpers/AutoMapperProfile.cs
@@ -0,0 +1,80 @@
+namespace AAIntegration.SimmonsBank.API.Config;
+
+using AutoMapper;
+using AAIntegration.SimmonsBank.API.Entities;
+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 AutoMapperProfile()
+ { // UserUpdateRequest -> User
+ CreateMap()
+ .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;
+ // ignore null password
+ if (x.DestinationMember.Name == "Password" && src.Password == null) return false;
+
+ return true;
+ }
+ ));
+
+ // AccountUpdateRequest -> Account
+ CreateMap();
+
+ // AccountCreateRequest -> Account
+ CreateMap();
+ /*.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()
+ .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()
+ .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;
+ }
+ ));
+
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Helpers/DataContext.cs b/AAIntegration.SimmonsBank.API/Helpers/DataContext.cs
new file mode 100644
index 0000000..2e4ebd1
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Helpers/DataContext.cs
@@ -0,0 +1,36 @@
+namespace AAIntegration.SimmonsBank.API.Config;
+
+using Microsoft.EntityFrameworkCore;
+using AAIntegration.SimmonsBank.API.Entities;
+using System.Diagnostics;
+using System;
+using System.Collections.Generic;
+using Internal;
+using System.Linq;
+using System.Runtime.CompilerServices;
+using System.Diagnostics.CodeAnalysis;
+
+public class DataContext : DbContext
+{
+ //protected readonly IConfiguration Configuration;
+ readonly ILogger _logger;
+
+ public DataContext(
+ DbContextOptions options,
+ ILogger logger)
+ : base(options)
+ {
+ _logger = logger;
+ //Configuration = configuration;
+ }
+
+ /*protected override void OnConfiguring(DbContextOptionsBuilder options)
+ {
+ // in memory database used for simplicity, change to a real db for production applications
+ options.UseInMemoryDatabase("TestDb");
+ }*/
+
+ public DbSet Users { get; set; }
+ public DbSet Accounts { get; set; }
+ public DbSet Transactions { get; set; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Helpers/ErrorHandlerMiddleware.cs b/AAIntegration.SimmonsBank.API/Helpers/ErrorHandlerMiddleware.cs
new file mode 100644
index 0000000..4a04854
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Helpers/ErrorHandlerMiddleware.cs
@@ -0,0 +1,54 @@
+namespace AAIntegration.SimmonsBank.API.Config;
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Net;
+using System.Text.Json;
+using System.Threading.Tasks;
+
+public class ErrorHandlerMiddleware
+{
+ private readonly RequestDelegate _next;
+ private readonly ILogger _logger;
+
+ public ErrorHandlerMiddleware(RequestDelegate next, ILogger logger)
+ {
+ _next = next;
+ _logger = logger;
+ }
+
+ public async Task Invoke(HttpContext context)
+ {
+ try
+ {
+ await _next(context);
+ }
+ catch (Exception error)
+ {
+ var response = context.Response;
+ response.ContentType = "application/json";
+
+ switch (error)
+ {
+ case AppException e:
+ // custom application error
+ response.StatusCode = (int)HttpStatusCode.BadRequest;
+ break;
+ case KeyNotFoundException e:
+ // not found error
+ response.StatusCode = (int)HttpStatusCode.NotFound;
+ break;
+ default:
+ // unhandled error
+ _logger.LogError(error, error.Message);
+ response.StatusCode = (int)HttpStatusCode.InternalServerError;
+ break;
+ }
+
+ var result = JsonSerializer.Serialize(new { message = error?.Message });
+ await response.WriteAsync(result);
+ }
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.Designer.cs b/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.Designer.cs
new file mode 100644
index 0000000..9acabe0
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.Designer.cs
@@ -0,0 +1,144 @@
+//
+using System;
+using AAIntegration.SimmonsBank.API.Config;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace AAIntegration.SimmonsBank.API.Migrations
+{
+ [DbContext(typeof(DataContext))]
+ [Migration("20240320021418_InitialCreate")]
+ partial class InitialCreate
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.9")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Account", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Balance")
+ .HasColumnType("numeric");
+
+ b.Property("ExternalAccountNumber")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Accounts");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Transaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Amount")
+ .HasColumnType("numeric");
+
+ b.Property("CreatedOn")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreditAccountId")
+ .HasColumnType("integer");
+
+ b.Property("Date")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DebitAccountId")
+ .HasColumnType("integer");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsPending")
+ .HasColumnType("boolean");
+
+ b.Property("UpdatedOn")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreditAccountId");
+
+ b.HasIndex("DebitAccountId");
+
+ b.ToTable("Transactions");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ApiKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("MFAKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SimmonsBankPassword")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SimmonsBankUsername")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Transaction", b =>
+ {
+ b.HasOne("AAIntegration.SimmonsBank.API.Entities.Account", "CreditAccount")
+ .WithMany()
+ .HasForeignKey("CreditAccountId");
+
+ b.HasOne("AAIntegration.SimmonsBank.API.Entities.Account", "DebitAccount")
+ .WithMany()
+ .HasForeignKey("DebitAccountId");
+
+ b.Navigation("CreditAccount");
+
+ b.Navigation("DebitAccount");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.cs b/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.cs
new file mode 100644
index 0000000..f6af8f0
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Migrations/20240320021418_InitialCreate.cs
@@ -0,0 +1,101 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace AAIntegration.SimmonsBank.API.Migrations
+{
+ ///
+ public partial class InitialCreate : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "Accounts",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ Name = table.Column(type: "text", nullable: false),
+ Balance = table.Column(type: "numeric", nullable: false),
+ ExternalAccountNumber = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Accounts", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Users",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ ApiKey = table.Column(type: "text", nullable: false),
+ SimmonsBankUsername = table.Column(type: "text", nullable: false),
+ SimmonsBankPassword = table.Column(type: "text", nullable: false),
+ MFAKey = table.Column(type: "text", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Users", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "Transactions",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ Date = table.Column(type: "timestamp with time zone", nullable: false),
+ CreatedOn = table.Column(type: "timestamp with time zone", nullable: false),
+ UpdatedOn = table.Column(type: "timestamp with time zone", nullable: false),
+ ExternalId = table.Column(type: "text", nullable: false),
+ Description = table.Column(type: "text", nullable: false),
+ DebitAccountId = table.Column(type: "integer", nullable: true),
+ CreditAccountId = table.Column(type: "integer", nullable: true),
+ Amount = table.Column(type: "numeric", nullable: false),
+ IsPending = table.Column(type: "boolean", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_Transactions", x => x.Id);
+ table.ForeignKey(
+ name: "FK_Transactions_Accounts_CreditAccountId",
+ column: x => x.CreditAccountId,
+ principalTable: "Accounts",
+ principalColumn: "Id");
+ table.ForeignKey(
+ name: "FK_Transactions_Accounts_DebitAccountId",
+ column: x => x.DebitAccountId,
+ principalTable: "Accounts",
+ principalColumn: "Id");
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Transactions_CreditAccountId",
+ table: "Transactions",
+ column: "CreditAccountId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Transactions_DebitAccountId",
+ table: "Transactions",
+ column: "DebitAccountId");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "Transactions");
+
+ migrationBuilder.DropTable(
+ name: "Users");
+
+ migrationBuilder.DropTable(
+ name: "Accounts");
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Migrations/DataContextModelSnapshot.cs b/AAIntegration.SimmonsBank.API/Migrations/DataContextModelSnapshot.cs
new file mode 100644
index 0000000..a3f869c
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Migrations/DataContextModelSnapshot.cs
@@ -0,0 +1,141 @@
+//
+using System;
+using AAIntegration.SimmonsBank.API.Config;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace AAIntegration.SimmonsBank.API.Migrations
+{
+ [DbContext(typeof(DataContext))]
+ partial class DataContextModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.9")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Account", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Balance")
+ .HasColumnType("numeric");
+
+ b.Property("ExternalAccountNumber")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Accounts");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Transaction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("Amount")
+ .HasColumnType("numeric");
+
+ b.Property("CreatedOn")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("CreditAccountId")
+ .HasColumnType("integer");
+
+ b.Property("Date")
+ .HasColumnType("timestamp with time zone");
+
+ b.Property("DebitAccountId")
+ .HasColumnType("integer");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("IsPending")
+ .HasColumnType("boolean");
+
+ b.Property("UpdatedOn")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreditAccountId");
+
+ b.HasIndex("DebitAccountId");
+
+ b.ToTable("Transactions");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("ApiKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("MFAKey")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SimmonsBankPassword")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.Property("SimmonsBankUsername")
+ .IsRequired()
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("AAIntegration.SimmonsBank.API.Entities.Transaction", b =>
+ {
+ b.HasOne("AAIntegration.SimmonsBank.API.Entities.Account", "CreditAccount")
+ .WithMany()
+ .HasForeignKey("CreditAccountId");
+
+ b.HasOne("AAIntegration.SimmonsBank.API.Entities.Account", "DebitAccount")
+ .WithMany()
+ .HasForeignKey("DebitAccountId");
+
+ b.Navigation("CreditAccount");
+
+ b.Navigation("DebitAccount");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Models/Accounts/AccountCreateRequest.cs b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountCreateRequest.cs
new file mode 100644
index 0000000..71f4285
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountCreateRequest.cs
@@ -0,0 +1,13 @@
+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; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Accounts/AccountDTO.cs b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountDTO.cs
new file mode 100644
index 0000000..91278bb
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountDTO.cs
@@ -0,0 +1,14 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.Text.Json.Serialization;
+using AAIntegration.SimmonsBank.API.Entities;
+
+namespace AAIntegration.SimmonsBank.API.Models.Accounts;
+
+public class AccountDTO
+{
+ public int Id { get; set; }
+ public string Name { get; set; }
+ public decimal Balance { get; set; }
+ public string ExternalAccountNumber { get; set; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Accounts/AccountUpdateRequest.cs b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountUpdateRequest.cs
new file mode 100644
index 0000000..5a6f983
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Accounts/AccountUpdateRequest.cs
@@ -0,0 +1,8 @@
+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;
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionCreate.cs b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionCreate.cs
new file mode 100644
index 0000000..b5ceda3
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionCreate.cs
@@ -0,0 +1,16 @@
+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; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionDto.cs b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionDto.cs
new file mode 100644
index 0000000..3315364
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionDto.cs
@@ -0,0 +1,19 @@
+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; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionUpdateRequest.cs b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionUpdateRequest.cs
new file mode 100644
index 0000000..c926ff5
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Transactions/TransactionUpdateRequest.cs
@@ -0,0 +1,15 @@
+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;
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Users/UserCreateRequest.cs b/AAIntegration.SimmonsBank.API/Models/Users/UserCreateRequest.cs
new file mode 100644
index 0000000..24e1d63
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Users/UserCreateRequest.cs
@@ -0,0 +1,8 @@
+namespace AAIntegration.SimmonsBank.API.Models.Users;
+
+public class UserCreateRequest
+{
+ public string Username { get; set; }
+ public string Password { get; set; }
+ public string MFAKey { get; set; }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Models/Users/UserUpdateRequest.cs b/AAIntegration.SimmonsBank.API/Models/Users/UserUpdateRequest.cs
new file mode 100644
index 0000000..5646716
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Models/Users/UserUpdateRequest.cs
@@ -0,0 +1,9 @@
+namespace AAIntegration.SimmonsBank.API.Models.Users;
+
+public class UserUpdateRequest
+{
+ public string? Username { get; set; } = null;
+ public string? Password { get; set; } = null;
+ public string? MFAKey { get; set; } = null;
+
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Program.cs b/AAIntegration.SimmonsBank.API/Program.cs
new file mode 100644
index 0000000..9b4d164
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Program.cs
@@ -0,0 +1,124 @@
+//using AAIntegration.SimmonsBank.API.Authorization;
+using AAIntegration.SimmonsBank.API.Config;
+using Microsoft.EntityFrameworkCore;
+
+using AAIntegration.SimmonsBank.API.Services;
+using Microsoft.OpenApi.Models;
+using System.Text.Json.Serialization;
+using AAIntegration.SimmonsBank.API.Configs;
+using AAIntegration.SimmonsBank.API.Handlers;
+using Microsoft.IdentityModel.Tokens;
+using System.Text;
+//using Microsoft.Build.Framework;
+using Microsoft.AspNetCore.Authorization;
+
+internal class Program
+{
+ private static void Main(string[] args)
+ {
+ var builder = WebApplication.CreateBuilder(args);
+
+ // Add services to the container.
+ var MyAllowSpecificOrigins = "_myAllowSpecificOrigins";
+
+ builder.Services.AddCors(options =>
+ {
+ options.AddPolicy("ClientPermission", policy =>
+ {
+ policy.AllowAnyHeader()
+ .AllowAnyMethod()
+ .SetIsOriginAllowed(_ => true)
+ .AllowCredentials();
+ });
+
+ options.AddPolicy(name: MyAllowSpecificOrigins, policy =>
+ {
+ policy.WithOrigins(builder.Configuration.GetSection("ActiveAllocator:AllowedHosts").Get());
+ });
+ });
+
+ // Authentication
+ builder.Services.AddAuthentication()
+ .AddScheme(ApiKeyAuthenticationOptions.DefaultScheme, null);
+
+ // Authorization
+ builder.Services.AddAuthorization(options => {
+ AuthorizationPolicyBuilder defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
+ ApiKeyAuthenticationOptions.DefaultScheme
+ );
+
+ defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
+ options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
+ });
+
+ builder.Services.AddControllersWithViews().AddJsonOptions(x =>
+ {
+ // serialize enums as strings in api responses (e.g. Role)
+ x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
+
+ // ignore omitted parameters on models to enable optional params (e.g. User update)
+ x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
+ });
+
+ builder.Services.AddEndpointsApiExplorer();
+ builder.Services.AddSwaggerGen(c =>
+ {
+ c.SwaggerDoc("v1", new OpenApiInfo { Title = "AA API", Version = "v1" });
+ });
+
+ // Configure strongly typed settings object
+ builder.Services.Configure(builder.Configuration.GetSection("AppSettings"));
+ builder.Services.Configure(builder.Configuration.GetSection("EnvelopeFund"));
+ builder.Services.Configure(builder.Configuration.GetSection("ActiveAllocator:Database"));
+
+ DatabaseConfig dbConfig = builder.Configuration.GetSection("ActiveAllocator:Database").Get();
+
+ builder.Services.AddAutoMapper(typeof(Program));
+ builder.Services.AddDbContext(opt =>
+ opt.UseNpgsql(dbConfig.GetConnectionString()));
+
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+ builder.Services.AddScoped();
+
+ builder.Services.AddScoped();
+
+ var app = builder.Build();
+
+ // Apply Database Migrations - This is NOT recommended for multi-node deployment!!!
+ using var scope = app.Services.CreateScope();
+ using var dbContext = scope.ServiceProvider.GetRequiredService();
+ dbContext.Database.Migrate();
+
+ // Configure the HTTP request pipeline.
+ if (!app.Environment.IsDevelopment())
+ {
+ // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
+ app.UseHsts();
+ }
+
+ app.UseCors("ClientPermission");
+ app.UseHttpsRedirection();
+ app.UseStaticFiles();
+ app.UseSwagger();
+ app.UseSwaggerUI();
+ app.UseRouting();
+ app.UseCors(MyAllowSpecificOrigins);
+
+ app.UseAuthentication();
+ app.UseAuthorization();
+
+ // global error handler
+ app.UseMiddleware();
+
+ app.MapControllerRoute(
+ name: "default",
+ pattern: "{controller}/{action=Index}/{id?}");
+
+ app.MapFallbackToFile("index.html");
+
+ app.Run();
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Properties/launchSettings.json b/AAIntegration.SimmonsBank.API/Properties/launchSettings.json
new file mode 100644
index 0000000..3be65b5
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Properties/launchSettings.json
@@ -0,0 +1,41 @@
+{
+ "$schema": "https://json.schemastore.org/launchsettings.json",
+ "iisSettings": {
+ "windowsAuthentication": false,
+ "anonymousAuthentication": true,
+ "iisExpress": {
+ "applicationUrl": "http://localhost:33077",
+ "sslPort": 44364
+ }
+ },
+ "profiles": {
+ "http": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "http://localhost:5279",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "https": {
+ "commandName": "Project",
+ "dotnetRunMessages": true,
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "applicationUrl": "https://localhost:7243;http://localhost:5279",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ },
+ "IIS Express": {
+ "commandName": "IISExpress",
+ "launchBrowser": true,
+ "launchUrl": "swagger",
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ }
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/Services/AccountService.cs b/AAIntegration.SimmonsBank.API/Services/AccountService.cs
new file mode 100644
index 0000000..22529c1
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Services/AccountService.cs
@@ -0,0 +1,114 @@
+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 GetAll();
+ Account GetById(int accountId);
+ void Create(AccountCreateRequest model);
+ void Update(int accountId, AccountUpdateRequest model);
+ void Delete(int accountId);
+}
+
+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 GetAll()
+ {
+ return _context.Accounts;
+ }
+
+ public Account GetById(int accountId)
+ {
+ return getAccount(accountId);
+ }
+
+ public void Create(AccountCreateRequest model)
+ {
+ // Check that account with same name or same external number doesn't exist
+ IEnumerable accountsWithSameName = _context.Accounts.Where(a => a.Name.ToUpper() == model.Name.ToUpper());
+
+ if (accountsWithSameName.Count() > 0)
+ throw new AppException("Account with name '" + model.Name + "' already exists");
+
+ if (!string.IsNullOrWhiteSpace(model.ExternalAccountNumber))
+ {
+ IEnumerable matches = _context.Accounts.Where(a => a.ExternalAccountNumber == model.ExternalAccountNumber);
+
+ if (matches.Count() > 0)
+ throw new AppException("Account with external account number '" + model.ExternalAccountNumber + "' already exists under account named '" + matches.First().Name + "'");
+ }
+
+ // map model to new account object
+ //var account = _mapper.Map(model);
+
+ Account account = new Account {
+ Name = model.Name,
+ Balance = Convert.ToDecimal(model.InitialBalance),
+ ExternalAccountNumber = model.ExternalAccountNumber
+ };
+
+ _context.Accounts.Add(account);
+ _context.SaveChanges();
+ }
+
+ public void Update(int accountId, AccountUpdateRequest model)
+ {
+ Account account = getAccount(accountId);
+
+ // validate
+ if (model.Name != account.Name && _context.Accounts.Any(x => x.Name == model.Name))
+ 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)
+ {
+ var account = getAccount(accountId);
+ _context.Accounts.Remove(account);
+ _context.SaveChanges();
+ }
+
+ // helper methods
+
+ private Account getAccount(int id)
+ {
+ var account = _context.Accounts.Find(id);
+ if (account == null) throw new KeyNotFoundException("Account not found");
+ return account;
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Services/CacheService.cs b/AAIntegration.SimmonsBank.API/Services/CacheService.cs
new file mode 100644
index 0000000..e2ab0fd
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Services/CacheService.cs
@@ -0,0 +1,51 @@
+namespace AAIntegration.SimmonsBank.API.Services;
+
+using Microsoft.Extensions.Caching.Memory;
+
+public interface ICacheService
+{
+ int GetClientIdFromApiKey(string apiKey);
+}
+
+public class CacheService : ICacheService
+{
+ private readonly IMemoryCache _memoryCache;
+ private readonly IUserService _userService;
+
+ public CacheService(IMemoryCache memoryCache, IUserService userService)
+ {
+ _memoryCache = memoryCache;
+ _userService = userService;
+ }
+
+ public int GetClientIdFromApiKey(string apiKey)
+ {
+ if (!_memoryCache.TryGetValue>($"Authentication_ApiKeys", out var internalKeys))
+ {
+ internalKeys = _userService.GetAllApiKeys();
+
+ _memoryCache.Set($"Authentication_ApiKeys", internalKeys);
+ }
+
+ if (!internalKeys.TryGetValue(apiKey, out var clientId))
+ {
+ return -1;
+ }
+
+ return clientId;
+ }
+
+ /*public void InvalidateApiKey(string apiKey)
+ {
+ if (_memoryCache.TryGetValue>("Authentication_ApiKeys", out var internalKeys))
+ {
+ if (internalKeys.ContainsKey(apiKey))
+ {
+ internalKeys.Remove(apiKey);
+ _memoryCache.Set("Authentication_ApiKeys", internalKeys);
+ }
+ }
+
+ _userService.InvalidateApiKey(apiKey);
+ }*/
+}
diff --git a/AAIntegration.SimmonsBank.API/Services/TransactionService.cs b/AAIntegration.SimmonsBank.API/Services/TransactionService.cs
new file mode 100644
index 0000000..62e5e16
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Services/TransactionService.cs
@@ -0,0 +1,217 @@
+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 GetAll();
+ Transaction GetById(int id);
+ IEnumerable BulkCreate(List model);
+ Transaction Create(TransactionCreate model, bool errorOnFail = true);
+ void Update(int id, TransactionUpdateRequest model);
+ void Delete(int id);
+}
+
+public class TransactionService : ITransactionService
+{
+ private DataContext _context;
+ private readonly IMapper _mapper;
+ private readonly ILogger _logger;
+
+ public TransactionService(
+ DataContext context,
+ IMapper mapper,
+ ILogger logger)
+ {
+ _context = context;
+ _mapper = mapper;
+ _logger = logger;
+ }
+
+ public IEnumerable GetAll()
+ {
+ return _context.Transactions
+ .Include(t => t.DebitAccount)
+ .Include(t => t.CreditAccount)
+ .ToList();
+ }
+
+ public Transaction GetById(int id)
+ {
+ return getTransaction(id);
+ }
+
+ 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 BulkCreate(List model)
+ {
+ List transactions = new List();
+
+ foreach (TransactionCreate tr in model)
+ {
+ var tran = this.Create(tr, false);
+ if (tran != null)
+ transactions.Add(tran);
+ }
+
+ return transactions;
+ }
+
+ public Transaction Create(TransactionCreate model, 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),
+ IsPending = model.IsPending
+ };
+
+ if (this.ValidateTransaction(transaction, 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)
+ {
+ Transaction transaction = getTransaction(id);
+
+ // 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);
+
+ transaction.UpdatedOn = DateTime.UtcNow;
+
+ _context.Transactions.Update(transaction);
+ _context.SaveChanges();
+
+ _logger.LogInformation($"Transaction '{id}' successfully updated.");
+ }
+
+ private bool ValidateTransaction(int transactionId)
+ {
+ return this.ValidateTransaction(getTransaction(transactionId));
+ }
+
+ private bool ErrorOrFalse(bool error, string errorMessage)
+ {
+ if (error)
+ throw new AppException(errorMessage);
+
+ _logger.LogWarning(errorMessage);
+ return false;
+ }
+
+ private bool ValidateTransaction(Transaction transaction, 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.Any(x => x.ExternalId == transaction.ExternalId))
+ 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;
+ }
+
+ public void Delete(int id)
+ {
+ var transaction = getTransaction(id);
+ _context.Transactions.Remove(transaction);
+ _context.SaveChanges();
+ }
+
+ private Transaction getTransaction(int id)
+ {
+ var transaction = _context.Transactions
+ .Include(t => t.DebitAccount)
+ .Include(t => t.CreditAccount)
+ .FirstOrDefault(t => t.Id == id);
+
+ if (transaction == null)
+ throw new KeyNotFoundException("Transaction not found");
+
+ return transaction;
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Services/UserService.cs b/AAIntegration.SimmonsBank.API/Services/UserService.cs
new file mode 100644
index 0000000..cc1c3d6
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Services/UserService.cs
@@ -0,0 +1,146 @@
+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;
+
+public interface IUserService
+{
+ // New Based way
+ string Create(UserCreateRequest model);
+ void Update(string apiKey, UserUpdateRequest model);
+ void Delete(string apiKey);
+ Dictionary GetAllApiKeys();
+
+ /* Other cringe way
+ AuthenticateResponse Authenticate(AuthenticateRequest model);
+ void Register(RegisterRequest model);
+ IEnumerable GetAll();
+ User GetById(int id);
+ void Update(int id, UserUpdateRequest model);
+ void Delete(int id);
+ Dictionary GetAllApiKeys();
+ string GetUserApiKey(int id);
+ void InvalidateApiKey(string apiKey);
+ string CreateUserApiKey(int id);
+ */
+}
+
+public class UserService : IUserService
+{
+ private DataContext _context;
+ private readonly IMapper _mapper;
+ private readonly IOptions _appSettings;
+
+ public UserService(
+ DataContext context,
+ IMapper mapper,
+ IOptions appSettings)
+ {
+ _context = context;
+ _mapper = mapper;
+ _appSettings = appSettings;
+ }
+
+ public string Create(UserCreateRequest model)
+ {
+ User user = new User();
+ user.SimmonsBankUsername = model.Username;
+ user.SimmonsBankPassword = model.Password;
+ user.MFAKey = model.MFAKey;
+
+ // Generate API Key
+ user.ApiKey = generateApiKey();
+
+ // save user
+ _context.Users.Add(user);
+ _context.SaveChanges();
+
+ // Return API Key
+ return user.ApiKey;
+ }
+
+ public void Update(string apiKey, UserUpdateRequest model)
+ {
+ var user = getUser(apiKey);
+
+ // User.Username
+ if (model.Username != null)
+ user.SimmonsBankUsername = model.Username;
+
+ // User.Password
+ if (model.Password != null)
+ user.SimmonsBankPassword = model.Password;
+
+ // User.MFAKey
+ if (model.MFAKey != null)
+ user.MFAKey = model.MFAKey;
+
+ _context.Users.Update(user);
+ _context.SaveChanges();
+ }
+
+ public void Delete(string apiKey)
+ {
+ var user = getUser(apiKey);
+ _context.Users.Remove(user);
+ _context.SaveChanges();
+ }
+
+ public Dictionary GetAllApiKeys()
+ {
+ return _context.Users
+ .Where(u => u.ApiKey != null)
+ .ToDictionary(u => u.ApiKey, u => u.Id);
+ }
+
+
+ // helper methods
+
+ private User getUser(int id)
+ {
+ var user = _context.Users.Find(id);
+ if (user == null) throw new KeyNotFoundException("User not found");
+ return user;
+ }
+
+ private User getUser(string ApiKey)
+ {
+ var user = _context.Users
+ .Where(u => u.ApiKey == ApiKey)
+ .FirstOrDefault();
+
+ if (user == null) throw new KeyNotFoundException("User not found");
+ return user;
+ }
+
+ private const string _prefix = "CT-";
+ private const int _numberOfSecureBytesToGenerate = 32;
+ private const int _lengthOfKey = 32;
+
+ private string generateApiKey()
+ {
+ var bytes = RandomNumberGenerator.GetBytes(_numberOfSecureBytesToGenerate);
+
+ string base64String = Convert.ToBase64String(bytes)
+ .Replace("+", "-")
+ .Replace("/", "_");
+
+ var keyLength = _lengthOfKey - _prefix.Length;
+
+ return _prefix + base64String[..keyLength];
+ }
+
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/Services/VersionService.cs b/AAIntegration.SimmonsBank.API/Services/VersionService.cs
new file mode 100644
index 0000000..7ff9ef7
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/Services/VersionService.cs
@@ -0,0 +1,35 @@
+namespace AAIntegration.SimmonsBank.API.Services;
+
+using AutoMapper;
+using AAIntegration.SimmonsBank.API.Entities;
+using AAIntegration.SimmonsBank.API.Config;
+using AAIntegration.SimmonsBank.API.Models.Accounts;
+using System.Collections.Generic;
+using System.Linq;
+using System;
+using System.Security.Policy;
+
+public interface IVersionService
+{
+ string GetVersion();
+}
+
+public class VersionService : IVersionService
+{
+ const string APP_VERSION = "1.0.0";
+
+ ILogger _logger;
+
+ public VersionService(
+ ILogger logger)
+ {
+ _logger = logger;
+
+ _logger.LogInformation("App Version: " + APP_VERSION);
+ }
+
+ public string GetVersion()
+ {
+ return APP_VERSION;
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/WeatherForecast.cs b/AAIntegration.SimmonsBank.API/WeatherForecast.cs
new file mode 100644
index 0000000..980fe80
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/WeatherForecast.cs
@@ -0,0 +1,12 @@
+namespace AAIntegration.SimmonsBank.API;
+
+public class WeatherForecast
+{
+ public DateOnly Date { get; set; }
+
+ public int TemperatureC { get; set; }
+
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+ public string? Summary { get; set; }
+}
diff --git a/AAIntegration.SimmonsBank.API/appsettings.Development.json b/AAIntegration.SimmonsBank.API/appsettings.Development.json
new file mode 100644
index 0000000..a11de08
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/appsettings.Development.json
@@ -0,0 +1,10 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.AspNetCore.SpaProxy": "Information",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/appsettings.json b/AAIntegration.SimmonsBank.API/appsettings.json
new file mode 100644
index 0000000..cb4ae10
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/appsettings.json
@@ -0,0 +1,31 @@
+{
+ "ActiveAllocator": {
+ "Database": {
+ "Host": "localhost",
+ "Name": "AAISB_DB",
+ "User": "postgres",
+ "Password": "nqA3UV3CliLLHpLL",
+ "Port": "25432"
+ },
+ "AllowedHosts": [
+ "*"
+ ]
+ },
+ "ConnectionStrings": {
+ "PSQLConnection": "Server=localhost;Port=15432;Database=aadb;User Id=postgres;Password=nqA3UV3CliLLHpLL"
+ },
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft": "Warning",
+ "Microsoft.Hosting.Lifetime": "Information"
+ }
+ },
+ "AppSettings": {
+ "Secret": "5de80277015f9fd564c4d1cc2cf827dbb1774cd66e7d79aa258d9c35a9f67f32fc6cf0dc24244242bd9501288e0fd69e315b",
+ "APIUrl": "https://localhost:7260"
+ },
+ "EnvelopeFund": {
+ "CheckIntervalInMinutes": 10
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API
new file mode 100755
index 0000000..d8951c8
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.deps.json b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.deps.json
new file mode 100644
index 0000000..2fb49f4
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.deps.json
@@ -0,0 +1,536 @@
+{
+ "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"
+ }
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.dll
new file mode 100644
index 0000000..d327046
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb
new file mode 100644
index 0000000..e452446
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.runtimeconfig.json b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.runtimeconfig.json
new file mode 100644
index 0000000..d486bb2
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/AAIntegration.SimmonsBank.API.runtimeconfig.json
@@ -0,0 +1,20 @@
+{
+ "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
+ }
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Humanizer.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Humanizer.dll
new file mode 100755
index 0000000..c9a7ef8
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Humanizer.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.AspNetCore.OpenApi.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.AspNetCore.OpenApi.dll
new file mode 100755
index 0000000..20f2ff8
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.AspNetCore.OpenApi.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Abstractions.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Abstractions.dll
new file mode 100755
index 0000000..a89f247
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Abstractions.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Design.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Design.dll
new file mode 100755
index 0000000..8adf225
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Design.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Relational.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Relational.dll
new file mode 100755
index 0000000..44538e5
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.Relational.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.dll
new file mode 100755
index 0000000..94a49a4
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.EntityFrameworkCore.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.Extensions.DependencyModel.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.Extensions.DependencyModel.dll
new file mode 100755
index 0000000..c4fe0b9
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.Extensions.DependencyModel.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Abstractions.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Abstractions.dll
new file mode 100755
index 0000000..b1e3e4c
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Abstractions.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Logging.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Logging.dll
new file mode 100755
index 0000000..3447d4f
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Logging.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Tokens.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Tokens.dll
new file mode 100755
index 0000000..a0d6d60
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.IdentityModel.Tokens.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.OpenApi.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.OpenApi.dll
new file mode 100755
index 0000000..1e0998d
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Microsoft.OpenApi.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Mono.TextTemplating.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Mono.TextTemplating.dll
new file mode 100755
index 0000000..d5a4b3c
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Mono.TextTemplating.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll
new file mode 100755
index 0000000..493fbdc
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.EntityFrameworkCore.PostgreSQL.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.dll
new file mode 100755
index 0000000..c3bd706
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Npgsql.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.Swagger.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.Swagger.dll
new file mode 100755
index 0000000..fd052a3
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.Swagger.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll
new file mode 100755
index 0000000..2ea00ee
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerGen.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll
new file mode 100755
index 0000000..0571d0f
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/Swashbuckle.AspNetCore.SwaggerUI.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/System.CodeDom.dll b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/System.CodeDom.dll
new file mode 100755
index 0000000..3128b6a
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/System.CodeDom.dll differ
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.Development.json b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.Development.json
new file mode 100644
index 0000000..0c208ae
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.json b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.json
new file mode 100644
index 0000000..fe27cc7
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/bin/Debug/net7.0/appsettings.json
@@ -0,0 +1,20 @@
+{
+ "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"
+ }
+}
diff --git a/AAIntegration.SimmonsBank.API/docker-compose.yml b/AAIntegration.SimmonsBank.API/docker-compose.yml
new file mode 100644
index 0000000..e103696
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/docker-compose.yml
@@ -0,0 +1,30 @@
+version: '3.4'
+
+services:
+ activeallocator-site:
+ image: activeallocator:1.0.0
+ container_name: activeallocator
+ env_file:
+ - .env
+ # environment:
+ # - ActiveAllocator__Database__Port=15432
+ #build:
+ #context: .
+ #dockerfile: MoviesAPI/Dockerfile
+ ports:
+ - 80:80
+ - 7555:7260
+ depends_on:
+ - database
+
+ database:
+ container_name: activeallocator-db
+ image: 'postgres:15'
+ #ports:
+ # - 15432:5432
+ env_file:
+ - .env
+ #networks:
+ # - postgres-network
+ volumes:
+ - ./pg-db_data/:/var/lib/postgresql/data/
diff --git a/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.dgspec.json b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.dgspec.json
new file mode 100644
index 0000000..db6a622
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.dgspec.json
@@ -0,0 +1,143 @@
+{
+ "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": []
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.props b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.props
new file mode 100644
index 0000000..741abfd
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.props
@@ -0,0 +1,27 @@
+
+
+
+ True
+ NuGet
+ $(MSBuildThisFileDirectory)project.assets.json
+ /home/william/.nuget/packages/
+ /home/william/.nuget/packages/
+ PackageReference
+ 6.4.2
+
+
+
+
+
+
+
+
+
+
+
+
+ /home/william/.nuget/packages/microsoft.extensions.apidescription.server/6.0.5
+ /home/william/.nuget/packages/microsoft.codeanalysis.analyzers/3.3.3
+ /home/william/.nuget/packages/microsoft.codeanalysis.analyzerutilities/3.3.0
+
+
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.targets b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.targets
new file mode 100644
index 0000000..a07a096
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/AAIntegration.SimmonsBank.API.csproj.nuget.g.targets
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs
new file mode 100644
index 0000000..4257f4b
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/.NETCoreApp,Version=v7.0.AssemblyAttributes.cs
@@ -0,0 +1,4 @@
+//
+using System;
+using System.Reflection;
+[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v7.0", FrameworkDisplayName = ".NET 7.0")]
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfo.cs b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfo.cs
new file mode 100644
index 0000000..c6485ba
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfo.cs
@@ -0,0 +1,22 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+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.
+
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfoInputs.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfoInputs.cache
new file mode 100644
index 0000000..9d10b67
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.AssemblyInfoInputs.cache
@@ -0,0 +1 @@
+ccf0192c63cd8318a7ee7a5d81133f2750591ae8
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GeneratedMSBuildEditorConfig.editorconfig b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GeneratedMSBuildEditorConfig.editorconfig
new file mode 100644
index 0000000..2f80461
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GeneratedMSBuildEditorConfig.editorconfig
@@ -0,0 +1,17 @@
+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 =
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GlobalUsings.g.cs b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GlobalUsings.g.cs
new file mode 100644
index 0000000..025530a
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.GlobalUsings.g.cs
@@ -0,0 +1,17 @@
+//
+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;
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cache
new file mode 100644
index 0000000..e69de29
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cs b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cs
new file mode 100644
index 0000000..7a8df11
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.MvcApplicationPartsAssemblyInfo.cs
@@ -0,0 +1,17 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by a tool.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+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.
+
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.assets.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.assets.cache
new file mode 100644
index 0000000..f6a4143
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.assets.cache differ
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.AssemblyReference.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.AssemblyReference.cache
new file mode 100644
index 0000000..76a709a
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.AssemblyReference.cache differ
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CopyComplete b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CopyComplete
new file mode 100644
index 0000000..e69de29
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CoreCompileInputs.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CoreCompileInputs.cache
new file mode 100644
index 0000000..d9c1ce3
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.CoreCompileInputs.cache
@@ -0,0 +1 @@
+bd7d70d00f668e0d8bf64847deff236ad4b0c3cc
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.FileListAbsolute.txt b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.FileListAbsolute.txt
new file mode 100644
index 0000000..b460a41
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.csproj.FileListAbsolute.txt
@@ -0,0 +1,46 @@
+/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
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.dll b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.dll
new file mode 100644
index 0000000..d327046
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.dll differ
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.genruntimeconfig.cache b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.genruntimeconfig.cache
new file mode 100644
index 0000000..5f870de
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.genruntimeconfig.cache
@@ -0,0 +1 @@
+73736abff76b35e69e45e19ba4a468a4281d3a6a
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb
new file mode 100644
index 0000000..e452446
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/AAIntegration.SimmonsBank.API.pdb differ
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/apphost b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/apphost
new file mode 100755
index 0000000..d8951c8
Binary files /dev/null and b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/apphost differ
diff --git a/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/project.razor.json b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/project.razor.json
new file mode 100644
index 0000000..45e6d67
--- /dev/null
+++ b/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/project.razor.json
@@ -0,0 +1,18648 @@
+{
+ "SerializedFilePath": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/obj/Debug/net7.0/project.razor.json",
+ "FilePath": "/home/william/Git/Integration-TransactionImporter-SimmonsBank/AAIntegration.SimmonsBank.API/AAIntegration.SimmonsBank.API.csproj",
+ "Configuration": {
+ "ConfigurationName": "MVC-3.0",
+ "LanguageVersion": "7.0",
+ "Extensions": [
+ {
+ "ExtensionName": "MVC-3.0"
+ }
+ ]
+ },
+ "ProjectWorkspaceState": {
+ "TagHelpers": [
+ {
+ "HashCode": 1609458209,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n Combines the behaviors of and ,\n so that it displays the page matching the specified route but only if the user\n is authorized to see it.\n \n Additionally, this component supplies a cascading parameter of type ,\n which makes the user's current authentication state available to descendants.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "AuthorizeRouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "NotAuthorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotAuthorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorizing",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorizing",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Resource",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n The resource to which access is being controlled.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Resource",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "RouteData",
+ "TypeName": "Microsoft.AspNetCore.Components.RouteData",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "RouteData",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DefaultLayout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DefaultLayout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -491557804,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n Combines the behaviors of and ,\n so that it displays the page matching the specified route but only if the user\n is authorized to see it.\n \n Additionally, this component supplies a cascading parameter of type ,\n which makes the user's current authentication state available to descendants.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "NotAuthorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotAuthorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorizing",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorizing",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Resource",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n The resource to which access is being controlled.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Resource",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "RouteData",
+ "TypeName": "Microsoft.AspNetCore.Components.RouteData",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "RouteData",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DefaultLayout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DefaultLayout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -2115874921,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotAuthorized",
+ "ParentTag": "AuthorizeRouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1172263241,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotAuthorized",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.NotAuthorized",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -251515451,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorizing",
+ "ParentTag": "AuthorizeRouteView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 231285252,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorizing",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeRouteView.Authorizing",
+ "Common.TypeNameIdentifier": "AuthorizeRouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 742776728,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n Displays differing content depending on the user's authorization status.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "Policy",
+ "TypeName": "System.String",
+ "Documentation": "\n \n The policy name that determines whether the content can be displayed.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Policy",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Roles",
+ "TypeName": "System.String",
+ "Documentation": "\n \n A comma delimited list of roles that are allowed to display the content.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Roles",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "NotAuthorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotAuthorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorizing",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorizing",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Resource",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n The resource to which access is being controlled.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Resource",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -410110985,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n Displays differing content depending on the user's authorization status.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "Policy",
+ "TypeName": "System.String",
+ "Documentation": "\n \n The policy name that determines whether the content can be displayed.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Policy",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Roles",
+ "TypeName": "System.String",
+ "Documentation": "\n \n A comma delimited list of roles that are allowed to display the content.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Roles",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "NotAuthorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotAuthorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorized",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorized",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Authorizing",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Authorizing",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Resource",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n The resource to which access is being controlled.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Resource",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1496365382,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1294825650,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.ChildContent",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1147376349,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotAuthorized",
+ "ParentTag": "AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -509220185,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is not authorized.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotAuthorized",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'NotAuthorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.NotAuthorized",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 319584605,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorized",
+ "ParentTag": "AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'Authorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -932051387,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed if the user is authorized.\n If you specify a value for this parameter, do not also specify a value for .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorized",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'Authorized' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorized",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 746176739,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorizing",
+ "ParentTag": "AuthorizeView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1480175170,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content that will be displayed while asynchronous authorization is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Authorizing",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.AuthorizeView.Authorizing",
+ "Common.TypeNameIdentifier": "AuthorizeView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 1390955865,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "CascadingAuthenticationState"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState",
+ "Common.TypeNameIdentifier": "CascadingAuthenticationState",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1089941022,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState",
+ "Common.TypeNameIdentifier": "CascadingAuthenticationState",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -942630891,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "CascadingAuthenticationState"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent",
+ "Common.TypeNameIdentifier": "CascadingAuthenticationState",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 331311379,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Authorization",
+ "Documentation": "\n \n The content to which the authentication state should be provided.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Authorization.CascadingAuthenticationState.ChildContent",
+ "Common.TypeNameIdentifier": "CascadingAuthenticationState",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Authorization",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -662212303,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.CascadingValue",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that provides a cascading value to all descendant components.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "CascadingValue"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content to which the value should be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n The value to be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Name",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Optionally gives a name to the provided value. Descendant components\n will be able to receive the value by specifying this name.\n \n If no name is specified, then descendant components will receive the\n value based the type of value they are requesting.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Name",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "IsFixed",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n If true, indicates that will not change. This is a\n performance optimization that allows the framework to skip setting up\n change notifications. Set this flag only if you will not change\n during the component's lifetime.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "IsFixed",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue",
+ "Common.TypeNameIdentifier": "CascadingValue",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.GenericTyped": "True",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1943968937,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.CascadingValue",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that provides a cascading value to all descendant components.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.CascadingValue"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.CascadingValue component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n The content to which the value should be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n The value to be provided.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Name",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Optionally gives a name to the provided value. Descendant components\n will be able to receive the value by specifying this name.\n \n If no name is specified, then descendant components will receive the\n value based the type of value they are requesting.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Name",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "IsFixed",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n If true, indicates that will not change. This is a\n performance optimization that allows the framework to skip setting up\n change notifications. Set this flag only if you will not change\n during the component's lifetime.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "IsFixed",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue",
+ "Common.TypeNameIdentifier": "CascadingValue",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.GenericTyped": "True",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1347370380,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n The content to which the value should be provided.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "CascadingValue"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent",
+ "Common.TypeNameIdentifier": "CascadingValue",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 1346182096,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n The content to which the value should be provided.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "Microsoft.AspNetCore.Components.CascadingValue"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.CascadingValue.ChildContent",
+ "Common.TypeNameIdentifier": "CascadingValue",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 545682312,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.DynamicComponent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that renders another component dynamically according to its\n parameter.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "DynamicComponent"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "Type",
+ "TypeName": "System.Type",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the type of the component to be rendered. The supplied type must\n implement .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Type",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Parameters",
+ "TypeName": "System.Collections.Generic.IDictionary",
+ "Documentation": "\n \n Gets or sets a dictionary of parameters to be passed to the component.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Parameters",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent",
+ "Common.TypeNameIdentifier": "DynamicComponent",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1796349880,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.DynamicComponent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that renders another component dynamically according to its\n parameter.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.DynamicComponent"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "Type",
+ "TypeName": "System.Type",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the type of the component to be rendered. The supplied type must\n implement .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Type",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Parameters",
+ "TypeName": "System.Collections.Generic.IDictionary",
+ "Documentation": "\n \n Gets or sets a dictionary of parameters to be passed to the component.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Parameters",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.DynamicComponent",
+ "Common.TypeNameIdentifier": "DynamicComponent",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -100983486,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.LayoutView",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Displays the specified content inside the specified layout and any further\n nested layouts.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "LayoutView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Gets or sets the content to display.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Layout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of the layout in which to display the content.\n The type must implement and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Layout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView",
+ "Common.TypeNameIdentifier": "LayoutView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -681069779,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.LayoutView",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Displays the specified content inside the specified layout and any further\n nested layouts.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.LayoutView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Gets or sets the content to display.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Layout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of the layout in which to display the content.\n The type must implement and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Layout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView",
+ "Common.TypeNameIdentifier": "LayoutView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -552512924,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "LayoutView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent",
+ "Common.TypeNameIdentifier": "LayoutView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1450042199,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.LayoutView.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "Microsoft.AspNetCore.Components.LayoutView"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.LayoutView.ChildContent",
+ "Common.TypeNameIdentifier": "LayoutView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -377053912,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.RouteView",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Displays the specified page component, rendering it inside its layout\n and any further nested layouts.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "RouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "RouteData",
+ "TypeName": "Microsoft.AspNetCore.Components.RouteData",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "RouteData",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DefaultLayout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DefaultLayout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView",
+ "Common.TypeNameIdentifier": "RouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1544200839,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.RouteView",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Displays the specified page component, rendering it inside its layout\n and any further nested layouts.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.RouteView"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "RouteData",
+ "TypeName": "Microsoft.AspNetCore.Components.RouteData",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the route data. This determines the page that will be\n displayed and the parameter values that will be supplied to the page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "RouteData",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RouteData"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DefaultLayout",
+ "TypeName": "System.Type",
+ "Documentation": "\n \n Gets or sets the type of a layout to be used if the page does not\n declare any layout. If specified, the type must implement \n and accept a parameter named .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DefaultLayout",
+ "Common.GloballyQualifiedTypeName": "global::System.Type"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.RouteView",
+ "Common.TypeNameIdentifier": "RouteView",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1168727710,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that supplies route data corresponding to the current navigation state.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Router"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AppAssembly",
+ "TypeName": "System.Reflection.Assembly",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the assembly that should be searched for components matching the URI.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AppAssembly",
+ "Common.GloballyQualifiedTypeName": "global::System.Reflection.Assembly"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAssemblies",
+ "TypeName": "System.Collections.Generic.IEnumerable",
+ "Documentation": "\n \n Gets or sets a collection of additional assemblies that should be searched for components\n that can match URIs.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAssemblies",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IEnumerable"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "NotFound",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotFound",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Found",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Found",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Navigating",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Navigating",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnNavigateAsync",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a handler that should be called before navigating to a new page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnNavigateAsync",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "PreferExactMatches",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n Gets or sets a flag to indicate whether route matching should prefer exact matches\n over wildcards.\n This property is obsolete and configuring it does nothing.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "PreferExactMatches",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1949090136,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n A component that supplies route data corresponding to the current navigation state.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Routing.Router"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AppAssembly",
+ "TypeName": "System.Reflection.Assembly",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the assembly that should be searched for components matching the URI.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AppAssembly",
+ "Common.GloballyQualifiedTypeName": "global::System.Reflection.Assembly"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAssemblies",
+ "TypeName": "System.Collections.Generic.IEnumerable",
+ "Documentation": "\n \n Gets or sets a collection of additional assemblies that should be searched for components\n that can match URIs.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAssemblies",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IEnumerable"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "NotFound",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "NotFound",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Found",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "IsEditorRequired": true,
+ "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Found",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Navigating",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Navigating",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnNavigateAsync",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a handler that should be called before navigating to a new page.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnNavigateAsync",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "PreferExactMatches",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n Gets or sets a flag to indicate whether route matching should prefer exact matches\n over wildcards.\n This property is obsolete and configuring it does nothing.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "PreferExactMatches",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1471076104,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.NotFound",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotFound",
+ "ParentTag": "Router"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.NotFound",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -896158498,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.NotFound",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display when no match is found for the requested route.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "NotFound",
+ "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.NotFound",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -711546968,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.Found",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Found",
+ "ParentTag": "Router"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'Found' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Found",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 1697922391,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.Found",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Gets or sets the content to display when a match is found for the requested route.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Found",
+ "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'Found' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Found",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 612119160,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.Navigating",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Navigating",
+ "ParentTag": "Router"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Navigating",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 1194967104,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Routing.Router.Navigating",
+ "AssemblyName": "Microsoft.AspNetCore.Components",
+ "Documentation": "\n \n Get or sets the content to display when asynchronous navigation is in progress.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Navigating",
+ "ParentTag": "Microsoft.AspNetCore.Components.Routing.Router"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Routing.Router.Navigating",
+ "Common.TypeNameIdentifier": "Router",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Routing",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -160143733,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Forms",
+ "Documentation": "\n \n Adds Data Annotations validation support to an .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "DataAnnotationsValidator"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator",
+ "Common.TypeNameIdentifier": "DataAnnotationsValidator",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1165914937,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Forms",
+ "Documentation": "\n \n Adds Data Annotations validation support to an .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator"
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.DataAnnotationsValidator",
+ "Common.TypeNameIdentifier": "DataAnnotationsValidator",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 135404518,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.EditForm",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n Renders a form element that cascades an to descendants.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "EditForm"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created form element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "EditContext",
+ "TypeName": "Microsoft.AspNetCore.Components.Forms.EditContext",
+ "Documentation": "\n \n Supplies the edit context explicitly. If using this parameter, do not\n also supply , since the model value will be taken\n from the property.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "EditContext",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.EditContext"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Model",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n Specifies the top-level model object for the form. An edit context will\n be constructed for this model. If using this parameter, do not also supply\n a value for .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Model",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted.\n \n If using this parameter, you are responsible for triggering any validation\n manually, e.g., by calling .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnValidSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be valid.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnValidSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnInvalidSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be invalid.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnInvalidSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm",
+ "Common.TypeNameIdentifier": "EditForm",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -2116725859,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.EditForm",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n Renders a form element that cascades an to descendants.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.EditForm"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created form element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "EditContext",
+ "TypeName": "Microsoft.AspNetCore.Components.Forms.EditContext",
+ "Documentation": "\n \n Supplies the edit context explicitly. If using this parameter, do not\n also supply , since the model value will be taken\n from the property.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "EditContext",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.EditContext"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Model",
+ "TypeName": "System.Object",
+ "Documentation": "\n \n Specifies the top-level model object for the form. An edit context will\n be constructed for this model. If using this parameter, do not also supply\n a value for .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Model",
+ "Common.GloballyQualifiedTypeName": "global::System.Object"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ChildContent",
+ "TypeName": "Microsoft.AspNetCore.Components.RenderFragment",
+ "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ChildContent",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.RenderFragment",
+ "Components.ChildContent": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted.\n \n If using this parameter, you are responsible for triggering any validation\n manually, e.g., by calling .\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnValidSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be valid.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnValidSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "OnInvalidSubmit",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n A callback that will be invoked when the form is submitted and the\n is determined to be invalid.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnInvalidSubmit",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for all child content expressions.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm",
+ "Common.TypeNameIdentifier": "EditForm",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1836259642,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "EditForm"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent",
+ "Common.TypeNameIdentifier": "EditForm",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": -1554169027,
+ "Kind": "Components.ChildContent",
+ "Name": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n Specifies the content to be rendered inside this .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "ChildContent",
+ "ParentTag": "Microsoft.AspNetCore.Components.Forms.EditForm"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.ChildContent",
+ "Name": "Context",
+ "TypeName": "System.String",
+ "Documentation": "Specifies the parameter name for the 'ChildContent' child content expression.",
+ "Metadata": {
+ "Components.ChildContentParameterName": "True",
+ "Common.PropertyName": "Context"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.EditForm.ChildContent",
+ "Common.TypeNameIdentifier": "EditForm",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.IsSpecialKind": "Components.ChildContent",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.None"
+ }
+ },
+ {
+ "HashCode": 575389025,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing values.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "InputCheckbox"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueChanged",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueExpression",
+ "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DisplayName",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DisplayName",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox",
+ "Common.TypeNameIdentifier": "InputCheckbox",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 926043404,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputCheckbox",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing values.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "System.Boolean",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "global::System.Boolean"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueChanged",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueExpression",
+ "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DisplayName",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DisplayName",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputCheckbox",
+ "Common.TypeNameIdentifier": "InputCheckbox",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 698269952,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputDate",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing date values.\n Supported types are and .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "InputDate"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputDate component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Type",
+ "TypeName": "Microsoft.AspNetCore.Components.Forms.InputDateType",
+ "IsEnum": true,
+ "Documentation": "\n \n Gets or sets the type of HTML input to be rendered.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Type",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.InputDateType"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ParsingErrorMessage",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ParsingErrorMessage",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Common.PropertyName": "ValueChanged",
+ "Components.EventCallback": "True",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueExpression",
+ "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DisplayName",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DisplayName",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate",
+ "Common.TypeNameIdentifier": "InputDate",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.GenericTyped": "True",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -930024230,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputDate",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing date values.\n Supported types are and .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.InputDate"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputDate component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Type",
+ "TypeName": "Microsoft.AspNetCore.Components.Forms.InputDateType",
+ "IsEnum": true,
+ "Documentation": "\n \n Gets or sets the type of HTML input to be rendered.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Type",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.Forms.InputDateType"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ParsingErrorMessage",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ParsingErrorMessage",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Common.PropertyName": "ValueChanged",
+ "Components.EventCallback": "True",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueExpression",
+ "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DisplayName",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DisplayName",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputDate",
+ "Common.TypeNameIdentifier": "InputDate",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.GenericTyped": "True",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -438909764,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputFile",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n A component that wraps the HTML file input element and supplies a for each file's contents.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "InputFile"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "OnChange",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets the event callback that will be invoked when the collection of selected files changes.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnChange",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputFile",
+ "Common.TypeNameIdentifier": "InputFile",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1901426514,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputFile",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n A component that wraps the HTML file input element and supplies a for each file's contents.\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.InputFile"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "OnChange",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets the event callback that will be invoked when the collection of selected files changes.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "OnChange",
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Components.EventCallback": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the input element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IDictionary"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputFile",
+ "Common.TypeNameIdentifier": "InputFile",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.NameMatch": "Components.FullyQualifiedNameMatch",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": 1021987688,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing numeric values.\n Supported numeric types are , , , , , .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "InputNumber"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputNumber component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ParsingErrorMessage",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ParsingErrorMessage",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Common.PropertyName": "ValueChanged",
+ "Components.EventCallback": "True",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n \n Gets or sets an expression that identifies the bound value.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ValueExpression",
+ "Common.GloballyQualifiedTypeName": "global::System.Linq.Expressions.Expression>",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "DisplayName",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the display name for this field.\n This value is used when generating error messages when the input value fails to parse correctly.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "DisplayName",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ }
+ ],
+ "Metadata": {
+ "Common.TypeName": "Microsoft.AspNetCore.Components.Forms.InputNumber",
+ "Common.TypeNameIdentifier": "InputNumber",
+ "Common.TypeNamespace": "Microsoft.AspNetCore.Components.Forms",
+ "Components.GenericTyped": "True",
+ "Runtime.Name": "Components.IComponent"
+ }
+ },
+ {
+ "HashCode": -1994693326,
+ "Kind": "Components.Component",
+ "Name": "Microsoft.AspNetCore.Components.Forms.InputNumber",
+ "AssemblyName": "Microsoft.AspNetCore.Components.Web",
+ "Documentation": "\n \n An input component for editing numeric values.\n Supported numeric types are , , , , , .\n \n ",
+ "CaseSensitive": true,
+ "TagMatchingRules": [
+ {
+ "TagName": "Microsoft.AspNetCore.Components.Forms.InputNumber"
+ }
+ ],
+ "BoundAttributes": [
+ {
+ "Kind": "Components.Component",
+ "Name": "TValue",
+ "TypeName": "System.Type",
+ "Documentation": "Specifies the type of the type parameter TValue for the Microsoft.AspNetCore.Components.Forms.InputNumber component.",
+ "Metadata": {
+ "Common.PropertyName": "TValue",
+ "Components.TypeParameter": "True",
+ "Components.TypeParameterIsCascading": "False"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ParsingErrorMessage",
+ "TypeName": "System.String",
+ "Documentation": "\n \n Gets or sets the error message used when displaying an a parsing error.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "ParsingErrorMessage",
+ "Common.GloballyQualifiedTypeName": "global::System.String"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "AdditionalAttributes",
+ "TypeName": "System.Collections.Generic.IReadOnlyDictionary",
+ "Documentation": "\n \n Gets or sets a collection of additional attributes that will be applied to the created element.\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "AdditionalAttributes",
+ "Common.GloballyQualifiedTypeName": "global::System.Collections.Generic.IReadOnlyDictionary"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "Value",
+ "TypeName": "TValue",
+ "Documentation": "\n \n Gets or sets the value of the input. This should be used with two-way binding.\n \n \n @bind-Value=\"model.PropertyName\"\n \n ",
+ "Metadata": {
+ "Common.PropertyName": "Value",
+ "Common.GloballyQualifiedTypeName": "TValue",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueChanged",
+ "TypeName": "Microsoft.AspNetCore.Components.EventCallback",
+ "Documentation": "\n \n Gets or sets a callback that updates the bound value.\n \n ",
+ "Metadata": {
+ "Common.GloballyQualifiedTypeName": "global::Microsoft.AspNetCore.Components.EventCallback",
+ "Common.PropertyName": "ValueChanged",
+ "Components.EventCallback": "True",
+ "Components.GenericTyped": "True"
+ }
+ },
+ {
+ "Kind": "Components.Component",
+ "Name": "ValueExpression",
+ "TypeName": "System.Linq.Expressions.Expression>",
+ "Documentation": "\n