From 33ef5ab9c4cfc909ff97727a120580b4b0e64efb Mon Sep 17 00:00:00 2001 From: Alessandro Cifani Date: Thu, 23 May 2024 16:08:30 +0200 Subject: [PATCH] feat: get accounts as csv --- routes.ts | 47 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 34 insertions(+), 13 deletions(-) diff --git a/routes.ts b/routes.ts index 61b8c98..cb54e3f 100644 --- a/routes.ts +++ b/routes.ts @@ -29,15 +29,25 @@ router.get('/budget/:month', async (req, res) => { res.status(200).json(budget); }); -router.get('/accounts', async (_, res) => { - const accounts = await actual.getAccounts(); - res.status(200).json(accounts); -}); +router.get( + '/accounts', + async (_, res, next) => { + const accounts = await actual.getAccounts(); + res.locals.data = accounts; + next(); + }, + formatHandler, +); -router.get('/accounts/:accountid', async (req, res) => { - const account = await actual.getAccount(req.params.accountid); - res.status(200).json(account); -}); +router.get( + '/accounts/:accountid', + async (req, res, next) => { + const account = await actual.getAccount(req.params.accountid); + res.locals.data = account; + next(); + }, + formatHandler, +); router.get( '/accounts/:accountid/transactions', @@ -65,13 +75,24 @@ export { router }; function jsonToCSV(data: any) { let csv = ''; - csv += Object.keys(data?.[0]).join(',') + '\n'; - for (const row of data) { - csv += Object.values(row) + const unpackHeaders = (x: object) => Object.keys(x).join(',') + '\n'; + const unpackValues = (x: object) => + Object.values(x) .map((v) => JSON.stringify(v)) - .join(','); - csv += '\n'; + .join(',') + '\n'; + + // object + if (!Array.isArray(data)) { + csv += unpackHeaders(data); + csv += unpackValues(data); + return csv; + } + + // array + csv += unpackHeaders(data?.[0]); + for (const row of data) { + csv += unpackValues(row); } return csv;