Skip to content

Commit 497d160

Browse files
authored
chore: Added state and expiry date to accounting transfer (#3131)
* Added state and expiry date to accounting transfer * Added expiresAt to TigerBeetle transfer * Converted timeout from seconds to milliseconds * Updated test to check if expiresAt is set
1 parent 8c8a9b9 commit 497d160

File tree

13 files changed

+261
-9
lines changed

13 files changed

+261
-9
lines changed

bruno/collections/Rafiki/Rafiki Admin APIs/Get Accounting Ledger Transfers.bru

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ body:graphql {
2121
transferType
2222
ledger
2323
createdAt
24+
state
25+
expiresAt
2426
}
2527
credits {
2628
id
@@ -30,6 +32,8 @@ body:graphql {
3032
transferType
3133
ledger
3234
createdAt
35+
state
36+
expiresAt
3337
}
3438
}
3539
}

localenv/mock-account-servicing-entity/generated/graphql.ts

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/accounting/tigerbeetle/service.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,41 @@ describe('TigerBeetle Accounting Service', (): void => {
235235
expect(transferDebit.expiresAt).toBeUndefined()
236236
})
237237

238+
test('Returns expiry date correctly', async (): Promise<void> => {
239+
const receivingAccount = await accountFactory.build()
240+
const balances = [BigInt(100), BigInt(100)]
241+
const accounts = await Promise.all(
242+
balances.map(async (balance) => {
243+
return await accountFactory.build({
244+
balance,
245+
asset: receivingAccount.asset
246+
})
247+
})
248+
)
249+
const timeout = 10
250+
await Promise.all(
251+
accounts.map(async (account, i) => {
252+
const transfer = await accountingService.createTransfer({
253+
sourceAccount: account,
254+
sourceAmount: BigInt(10 * (i + 1)),
255+
destinationAccount: receivingAccount,
256+
timeout: timeout
257+
})
258+
assert.ok(!isTransferError(transfer))
259+
await transfer.post()
260+
})
261+
)
262+
const transfer = await accountingService.getAccountTransfers(
263+
receivingAccount.id
264+
)
265+
expect(transfer.credits).not.toHaveLength(0)
266+
const timestamp = transfer.credits[0].timestamp
267+
const expiresAtTime = transfer.credits[0].expiresAt?.getTime()
268+
expect(expiresAtTime).toBe(
269+
new Date(Number(timestamp) + timeout * 1000).getTime()
270+
)
271+
})
272+
238273
test('Returns undefined for nonexistent account', async (): Promise<void> => {
239274
await expect(
240275
accountingService.getTotalReceived(uuid())

packages/backend/src/accounting/tigerbeetle/utils.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ export function tbTransferToLedgerTransfer(
6060
transferRef: fromTigerBeetleId(tbTransfer.user_data_128),
6161
type: transferTypeFromCode(tbTransfer.code),
6262
state: state,
63-
ledger: tbTransfer.ledger
63+
ledger: tbTransfer.ledger,
64+
expiresAt: expiresAtFromTimestampAndTimeout(
65+
tbTransfer.timestamp,
66+
tbTransfer.timeout
67+
)
6468
}
6569
}
70+
71+
function expiresAtFromTimestampAndTimeout(
72+
timestamp: bigint,
73+
timeout: number
74+
): Date | undefined {
75+
return timeout
76+
? new Date(Number(timestamp / 1_000_000n) + timeout * 1000)
77+
: undefined
78+
}

packages/backend/src/graphql/generated/graphql.schema.json

Lines changed: 57 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/generated/graphql.ts

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/src/graphql/resolvers/accounting_transfer.psql.test.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { Config } from '../../config/app'
77
import { truncateTables } from '../../tests/tableManager'
88
import {
99
AccountingTransferConnection,
10+
TransferState,
1011
TransferType
1112
} from '../generated/graphql'
1213
import { createAsset } from '../../tests/asset'
@@ -99,6 +100,7 @@ describe('Accounting Transfer', (): void => {
99100
// Top up debit account first:
100101
const transferAmount = 123
101102
const ledger = 1
103+
const tomorrow = new Date(new Date().getDate() + 1)
102104
const queryLimit = 20
103105

104106
const insertedTransfer = await createLedgerTransfer(
@@ -109,7 +111,8 @@ describe('Accounting Transfer', (): void => {
109111
ledger: ledger,
110112
state: LedgerTransferState.POSTED,
111113
transferRef: uuid(),
112-
type: LedgerTransferType.DEPOSIT
114+
type: LedgerTransferType.DEPOSIT,
115+
expiresAt: tomorrow
113116
},
114117
appContainer.knex
115118
)
@@ -127,6 +130,8 @@ describe('Accounting Transfer', (): void => {
127130
transferType
128131
ledger
129132
createdAt
133+
state
134+
expiresAt
130135
}
131136
credits {
132137
id
@@ -136,6 +141,8 @@ describe('Accounting Transfer', (): void => {
136141
transferType
137142
ledger
138143
createdAt
144+
state
145+
expiresAt
139146
}
140147
}
141148
}
@@ -161,7 +168,9 @@ describe('Accounting Transfer', (): void => {
161168
debitAccountId: accountDebitId,
162169
amount: `${transferAmount}`,
163170
transferType: TransferType.Deposit,
164-
ledger
171+
ledger,
172+
state: TransferState.Posted,
173+
expiresAt: tomorrow.toISOString()
165174
})
166175

167176
// Credit:
@@ -179,6 +188,8 @@ describe('Accounting Transfer', (): void => {
179188
transferType
180189
ledger
181190
createdAt
191+
state
192+
expiresAt
182193
}
183194
credits {
184195
id
@@ -188,6 +199,8 @@ describe('Accounting Transfer', (): void => {
188199
transferType
189200
ledger
190201
createdAt
202+
state
203+
expiresAt
191204
}
192205
}
193206
}
@@ -214,7 +227,9 @@ describe('Accounting Transfer', (): void => {
214227
creditAccountId: accountCreditId,
215228
amount: `${transferAmount}`,
216229
transferType: TransferType.Deposit,
217-
ledger
230+
ledger,
231+
state: TransferState.Posted,
232+
expiresAt: tomorrow.toISOString()
218233
})
219234
})
220235
})

0 commit comments

Comments
 (0)