Skip to content

Commit 33ef5ab

Browse files
committed
feat: get accounts as csv
1 parent bd7e598 commit 33ef5ab

File tree

1 file changed

+34
-13
lines changed

1 file changed

+34
-13
lines changed

routes.ts

+34-13
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,25 @@ router.get('/budget/:month', async (req, res) => {
2929
res.status(200).json(budget);
3030
});
3131

32-
router.get('/accounts', async (_, res) => {
33-
const accounts = await actual.getAccounts();
34-
res.status(200).json(accounts);
35-
});
32+
router.get(
33+
'/accounts',
34+
async (_, res, next) => {
35+
const accounts = await actual.getAccounts();
36+
res.locals.data = accounts;
37+
next();
38+
},
39+
formatHandler,
40+
);
3641

37-
router.get('/accounts/:accountid', async (req, res) => {
38-
const account = await actual.getAccount(req.params.accountid);
39-
res.status(200).json(account);
40-
});
42+
router.get(
43+
'/accounts/:accountid',
44+
async (req, res, next) => {
45+
const account = await actual.getAccount(req.params.accountid);
46+
res.locals.data = account;
47+
next();
48+
},
49+
formatHandler,
50+
);
4151

4252
router.get(
4353
'/accounts/:accountid/transactions',
@@ -65,13 +75,24 @@ export { router };
6575

6676
function jsonToCSV(data: any) {
6777
let csv = '';
68-
csv += Object.keys(data?.[0]).join(',') + '\n';
6978

70-
for (const row of data) {
71-
csv += Object.values(row)
79+
const unpackHeaders = (x: object) => Object.keys(x).join(',') + '\n';
80+
const unpackValues = (x: object) =>
81+
Object.values(x)
7282
.map((v) => JSON.stringify(v))
73-
.join(',');
74-
csv += '\n';
83+
.join(',') + '\n';
84+
85+
// object
86+
if (!Array.isArray(data)) {
87+
csv += unpackHeaders(data);
88+
csv += unpackValues(data);
89+
return csv;
90+
}
91+
92+
// array
93+
csv += unpackHeaders(data?.[0]);
94+
for (const row of data) {
95+
csv += unpackValues(row);
7596
}
7697

7798
return csv;

0 commit comments

Comments
 (0)