Add support for fetching only desired transactions related to specified profile

This commit is contained in:
2025-07-08 12:45:43 +02:00
parent 9b24a1d737
commit 32b8d50e5b
7 changed files with 33 additions and 16 deletions

View File

@@ -14,9 +14,9 @@ export type SubmitOptions =
type ActualTransaction = {
id?: string;
account?: string;
account: string;
date: string;
amount?: number;
amount: number;
payee?: string;
payee_name?: string;
imported_payee?: string;
@@ -51,7 +51,7 @@ export class Actual {
}
#map(transaction: Transaction, accounts: ActualAccount[], payees: ActualPayee[]): ActualTransaction {
const actualTransaction: ActualTransaction = {
const actualTransaction: Omit<ActualTransaction, 'account'> & { account?: string } = {
imported_id: transaction.id,
date: transaction.date,
amount: utils.amountToInteger(transaction.amount),
@@ -94,7 +94,7 @@ export class Actual {
break;
}
return actualTransaction;
return actualTransaction as ActualTransaction;
}
async #api<T>(fn: () => Promise<T>): Promise<T> {
@@ -194,7 +194,8 @@ export class Actual {
const query = api.q('transactions')
.limit(limit)
.select(['*']);
.select(['*'])
.options({ splits: 'grouped' });
const { data } = await api.runQuery(query) as { data: ActualTransaction[] };
@@ -209,7 +210,8 @@ export class Actual {
const query = api.q('transactions')
.filter({ date: [{ $gte: start }, { $lte: end }] })
.select(['*']);
.select(['*'])
.options({ splits: 'grouped' });
const { data } = await api.runQuery(query) as { data: ActualTransaction[] };

View File

@@ -4,6 +4,7 @@ import express from "express";
import multer from "multer";
import { Readable } from "stream";
import path from 'path';
import { Transaction } from "@/types/transaction";
export function serve(config: Config, port: number) {
@@ -22,18 +23,23 @@ export function serve(config: Config, port: number) {
app.get("/servers/:server/transactions", async (req, res) => {
const { start, end } = req.query;
let data: Transaction[]|undefined;
if (start && end) {
const data = await getTransactionsFromRange(req.params.server, config, start.toString(), end.toString());
res.json(data);
data = await getTransactionsFromRange(req.params.server, config, start.toString(), end.toString());
}
else {
const limitParam = req.query.limit?.toString();
const limit = (limitParam && Number.parseInt(limitParam)) || undefined;
const data = await getTransactions(req.params.server, config, limit);
res.json(data);
data = await getTransactions(req.params.server, config, limit);
}
const profile = req.query.profile?.toString() || undefined;
const supportedAccounts = profile !== undefined ? config.profiles[profile].supportedAccounts : undefined;
const filterAccounts = supportedAccounts !== undefined ? (t: Transaction) => supportedAccounts.includes(t.from) || supportedAccounts.includes(t.to) : () => true;
res.json(data.filter(filterAccounts))
});
app.post("/prepare", upload.single("file"), async (req, res) => {

View File

@@ -11,6 +11,7 @@ export type ProfileConfig = {
encoding?: string;
config?: ParserConfig;
csv?: Record<string, unknown>;
supportedAccounts?: string[];
};
export type ParserConfig = {