feat(api): implement storing connected insitution in db

This commit is contained in:
Stevan Freeborn
2026-02-12 20:49:12 -06:00
parent 6bf317d480
commit eeab35b773
6 changed files with 106 additions and 11 deletions
+20 -3
View File
@@ -1,3 +1,5 @@
using FiscalOS.Core.Accounts;
namespace FiscalOS.API.Accounts.Connect;
internal static class Endpoint
@@ -12,7 +14,10 @@ internal static class Endpoint
private static async Task<IResult> HandleAsync(
HttpContext httpContext,
[FromBody] Request request,
[FromServices] AppDbContext appDbContext
[FromServices] AppDbContext appDbContext,
[FromServices] PlaidService plaidService,
[FromServices] IEncryptor encryptor,
CancellationToken ct
)
{
var userId = httpContext.GetUserId();
@@ -25,7 +30,7 @@ internal static class Endpoint
)
)
.ThenInclude(i => i.Metadata)
.SingleOrDefaultAsync(u => u.Id == userId);
.SingleOrDefaultAsync(u => u.Id == userId, ct);
if (user is null)
{
@@ -41,10 +46,22 @@ internal static class Endpoint
return Results.Problem(
statusCode: StatusCodes.Status409Conflict,
title: "Institution already connected",
detail: "The user has already connected an institution with the provided Plaid Institution ID."
detail: "The user has already connected an institution with the provided Plaid Institution Id."
);
}
var (itemId, accessToken) = await plaidService.ExchangeTokenAsync(request.PublicToken);
var item = await plaidService.GetItemAsync(accessToken);
var encryptedAccessToken = await encryptor.EncryptAsyncFor(user, accessToken, ct);
var plaidMetadata = PlaidMetadata.From(item.InstitutionId, item.InstitutionName, encryptedAccessToken);
var institution = Institution.From(item.InstitutionName, plaidMetadata);
user.AddInstitution(institution);
await appDbContext.SaveChangesAsync(ct);
return Results.Ok();
}
}
+1
View File
@@ -8,6 +8,7 @@ global using FiscalOS.API.Http;
global using FiscalOS.API.Login;
global using FiscalOS.API.Refresh;
global using FiscalOS.Core.Authentication;
global using FiscalOS.Core.Security;
global using FiscalOS.Infra.Accounts.Plaid;
global using FiscalOS.Infra.Authentication;
global using FiscalOS.Infra.Data;