From d0b0097032d86ea695de1a9c4c69b38c1df94511 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Tue, 24 Feb 2026 06:52:13 -0600 Subject: [PATCH] feat(web): handle adding accounts to institution --- .../src/services/institutionService.ts | 38 +++ src/FiscalOS.Web/src/views/HomeView.vue | 300 +++++++++++------- 2 files changed, 215 insertions(+), 123 deletions(-) diff --git a/src/FiscalOS.Web/src/services/institutionService.ts b/src/FiscalOS.Web/src/services/institutionService.ts index 916848c..3d89ec9 100644 --- a/src/FiscalOS.Web/src/services/institutionService.ts +++ b/src/FiscalOS.Web/src/services/institutionService.ts @@ -21,12 +21,16 @@ export interface IInstitutionService { createLinkToken: () => Promise>; connect: (publicToken: string, plaidInstitutionId: string) => Promise>; getInstitutions: () => Promise>; + getAvailableAccounts: (institutionId: string) => Promise>; } export class InstitutionService implements IInstitutionService { private readonly client: IClient; private readonly endpoints = { link: '/api/institutions/link', + available(id: string) { + return `/api/institutions/${id}/available`; + }, connect: '/api/institutions/connect', institutions: '/api/institutions', }; @@ -105,13 +109,47 @@ export class InstitutionService implements IInstitutionService { return Err([new Error('Failed to get institutions')]); } } + + async getAvailableAccounts(institutionId: string) { + const request = new ClientRequest(this.endpoints.available(institutionId)); + + try { + const res = await this.client.get(request); + + if (res.ok === false) { + return Err([new Error('Failed to get available accounts')]); + } + + const data = await res.json(); + + return Ok(data.accounts as AvailableAccount[]); + } catch (e) { + console.error(e); + return Err([new Error('Failed to get available accounts')]); + } + } } type LinkTokenResponse = { linkToken: string; }; +type Account = { + id: string; + name: string; +} + export type Institution = { id: string; name: string; + accounts: Account[]; +}; + +export type AvailableAccount = { + providerInstitutionId: string; + providerId: string; + providerName: string; + currentBalance: number; + availableBalance: number; + currencyCode: string; }; diff --git a/src/FiscalOS.Web/src/views/HomeView.vue b/src/FiscalOS.Web/src/views/HomeView.vue index 4deddcf..764b903 100644 --- a/src/FiscalOS.Web/src/views/HomeView.vue +++ b/src/FiscalOS.Web/src/views/HomeView.vue @@ -1,156 +1,210 @@