From cd269b3540fb5e3a988c1b59d3763db360b1fb34 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Tue, 17 Sep 2024 13:20:04 +0100 Subject: many, many changes --- gui/src/ajax/backend.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 2 deletions(-) (limited to 'gui/src/ajax') diff --git a/gui/src/ajax/backend.ts b/gui/src/ajax/backend.ts index d58e513..90a7ea5 100644 --- a/gui/src/ajax/backend.ts +++ b/gui/src/ajax/backend.ts @@ -1,5 +1,58 @@ +import { BalanceMap, newCategoryBalanceMapFromDto } from "../types/balanceMap"; +import { BudgetMap, newBudgetMapFromDto } from "../types/budgetMap"; +import { Category, newCategoryFromDto } from "../types/category"; + const backendUrl = "http://localhost:8000"; -async function getAllAccounts(): Promise { - return; +function makeGetter(params: FetcherMakerParams): Getter { + const parser = + "parser" in params + ? params.parser + : (dto: unknown[]) => dto.map(params.elementParser); + + return async function () { + const response = await fetch(`${backendUrl}${params.path}`); + const dto = await response.json(); + + try { + return parser(dto); + } catch (err) { + console.error(`Error parsing DTO. ${err?.toString() ?? ""}`); + return null; + } + }; } + +export const getAllCategories: Getter = async () => { + const balances = await getAllCategoryBalances(); + const budgets = await getAllCurrentCategoryBudgets(); + return makeGetter({ + path: "/category", + elementParser: newCategoryFromDto(balances, budgets), + })(); +}; + +export const getAllCategoryBalances: Getter> = makeGetter< + BalanceMap +>({ + path: "/balance/category", + parser: newCategoryBalanceMapFromDto, +}); + +export const getAllCurrentCategoryBudgets: Getter> = + makeGetter>({ + path: "/budget/category?current", + parser: newBudgetMapFromDto, + }); + +type FetcherMakerParams = { + path: string; +} & AnyParser; + +type Parser = { parser: (dto: unknown) => T | null }; +type ElementParser = { elementParser: (dto: unknown) => T | null }; +type AnyParser = T extends any[] + ? Parser | ElementParser + : Parser; + +type Getter = () => Promise; -- cgit v1.2.3