[Bug]: GoCardless token expires before completion on long imports
#3590 opened on Oct 6, 2024
Description
Verified issue does not already exist?
- I have searched and found no existing issue
- I will be providing steps how to reproduce the bug (in most cases this will also mean uploading a demo budget file)
What happened?
Hello,
When importing accounts with a long history (390 days) and a lot of transactions, the GoCardless JWT token actually expires before the sync completes, but isn't refreshed in all the operations that make API calls to GoCardless, leading to an exception in the logs and the UI crashing (and the account never being imported).
Here's the relevant part of the stacktrace:
2024-10-06T21:43:11.762Z info: POST 200 /sync/sync
Error /gocardless/get-accounts InvalidGoCardlessTokenError: Token is invalid or expired
at handleGoCardlessError (file:///app/src/app-gocardless/services/gocardless-service.js:46:13)
at Object.getDetailedAccount (file:///app/src/app-gocardless/services/gocardless-service.js:413:7)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async file:///app/src/app-gocardless/services/gocardless-service.js:152:25
at async Promise.all (index 0)
at async Object.getRequisitionWithAccounts (file:///app/src/app-gocardless/services/gocardless-service.js:150:30)
at async file:///app/src/app-gocardless/app-gocardless.js:68:9 {
I imagine this can crash in multiple places, but we can see for example in the getDetailedAccount call, it doesn't call setToken.
I don't see any downsides to calling setToken before each API call (especially if the expiration time is cached so it doesn't need to be decoded every time), so that should fix the issue, unfortunately I don't have the infrastructure setup to test the fix myself.
Thanks.
Where are you hosting Actual?
Docker
What browsers are you seeing the problem on?
Any
Operating System
Any