Add a field with all transactions to /nordigen/transactions endpoint (#190)

Helps with actualbudget/actual#919 by adding the `all` field wit both
pending and booked transactions to the output of
`getTransactionsWithBalance()` and, by extension, the
`/nordigen/transactions` endpoint.

I could alter the `getTransactions()` to return the `all` field as well
but I figured that keeping it such that it returns the output from
Nordigen API 1:1 might be better so I left it as is. If you don't agree,
let me know and I'll update this.
This commit is contained in:
Jakub Kuczys
2023-04-22 17:44:43 +02:00
committed by GitHub
parent 2f54a948be
commit 7c744f0e3d
6 changed files with 38 additions and 3 deletions

View File

@@ -151,7 +151,7 @@ app.post(
balances,
institutionId,
startingBalance,
transactions: { booked, pending },
transactions: { booked, pending, all },
} = await nordigenService.getTransactionsWithBalance(
requisitionId,
accountId,
@@ -169,6 +169,7 @@ app.post(
transactions: {
booked,
pending,
all,
},
},
});

View File

@@ -16,7 +16,7 @@ export interface IBank {
/**
* Function sorts an array of transactions from newest to oldest
*/
sortTransactions: (transactions: Transaction[]) => Transaction[];
sortTransactions: <T extends Transaction>(transactions: T[]) => T[];
/**
* Calculates account balance before which was before transactions provided in sortedTransactions param

View File

@@ -4,6 +4,7 @@ import {
Institution,
Transactions,
Balance,
Transaction,
} from './nordigen-node.types.js';
export type DetailedAccount = Omit<NordigenAccountDetails, 'status'> &
@@ -11,6 +12,7 @@ export type DetailedAccount = Omit<NordigenAccountDetails, 'status'> &
export type DetailedAccountWithInstitution = DetailedAccount & {
institution: Institution;
};
export type TransactionWithBookedStatus = Transaction & { booked: boolean };
export type NormalizedAccountDetails = {
/**

View File

@@ -170,7 +170,7 @@ export const nordigenService = {
* @throws {RateLimitError}
* @throws {UnknownError}
* @throws {ServiceError}
* @returns {Promise<{iban: string, balances: Array<import('../nordigen-node.types.js').Balance>, institutionId: string, transactions: {booked: Array<import('../nordigen-node.types.js').Transaction>, pending: Array<import('../nordigen-node.types.js').Transaction>}, startingBalance: number}>}
* @returns {Promise<{iban: string, balances: Array<import('../nordigen-node.types.js').Balance>, institutionId: string, transactions: {booked: Array<import('../nordigen-node.types.js').Transaction>, pending: Array<import('../nordigen-node.types.js').Transaction>, all: Array<import('../nordigen.types.js').TransactionWithBookedStatus>}, startingBalance: number}>}
*/
getTransactionsWithBalance: async (
requisitionId,
@@ -202,6 +202,13 @@ export const nordigenService = {
const sortedPendingTransactions = bank.sortTransactions(
transactions.transactions?.pending,
);
const allTransactions = sortedBookedTransactions.map((t) => {
return { ...t, booked: true };
});
sortedPendingTransactions.forEach((t) =>
allTransactions.push({ ...t, booked: false }),
);
const sortedAllTransactions = bank.sortTransactions(allTransactions);
const startingBalance = bank.calculateStartingBalance(
sortedBookedTransactions,
@@ -216,6 +223,7 @@ export const nordigenService = {
transactions: {
booked: sortedBookedTransactions,
pending: sortedPendingTransactions,
all: sortedAllTransactions,
},
};
},

View File

@@ -173,6 +173,24 @@ describe('nordigenService', () => {
institutionId: mockRequisition.institution_id,
startingBalance: expect.any(Number),
transactions: {
all: expect.arrayContaining([
expect.objectContaining({
bookingDate: expect.any(String),
transactionAmount: {
amount: expect.any(String),
currency: 'EUR',
},
transactionId: expect.any(String),
valueDate: expect.any(String),
}),
expect.objectContaining({
transactionAmount: {
amount: expect.any(String),
currency: 'EUR',
},
valueDate: expect.any(String),
}),
]),
booked: expect.arrayContaining([
expect.objectContaining({
bookingDate: expect.any(String),

View File

@@ -0,0 +1,6 @@
---
category: Enhancements
authors: [Jackenmen]
---
Add an `all` field to /nordigen/transactions endpoint with ordered array of both booked and pending transactions