|
1 | 1 | import path from 'path' |
2 | 2 | import { parseISO, format, subMonths } from 'date-fns' |
3 | | -import { |
| 3 | +import plaid, { |
| 4 | + AccountBase, |
4 | 5 | Configuration, |
5 | 6 | CountryCode, |
6 | 7 | ItemPublicTokenExchangeResponse, |
7 | 8 | LinkTokenCreateRequest, |
8 | 9 | PlaidApi, |
9 | 10 | PlaidEnvironments, |
10 | 11 | Products, |
11 | | - TransactionsGetRequest, |
12 | | - TransactionsGetRequestOptions, |
13 | | - TransactionsGetResponse |
| 12 | + TransactionsGetRequest |
14 | 13 | } from 'plaid' |
15 | 14 | import { Config, updateConfig } from '../../common/config' |
16 | 15 | import { PlaidConfig, PlaidEnvironmentType } from '../../types/integrations/plaid' |
@@ -176,40 +175,40 @@ export class PlaidIntegration { |
176 | 175 | accountConfig: AccountConfig, |
177 | 176 | startDate: Date, |
178 | 177 | endDate: Date |
179 | | - ): Promise<TransactionsGetResponse> => { |
| 178 | + ): Promise<{ accounts: AccountBase[]; transactions: plaid.Transaction[] }> => { |
180 | 179 | return new Promise(async (resolve, reject) => { |
181 | 180 | accountConfig = accountConfig as PlaidAccountConfig |
| 181 | + |
| 182 | + const dateFormat = 'yyyy-MM-dd' |
| 183 | + const start = format(startDate, dateFormat) |
| 184 | + const end = format(endDate, dateFormat) |
| 185 | + |
| 186 | + const request: TransactionsGetRequest = { |
| 187 | + access_token: accountConfig.token, |
| 188 | + start_date: start, |
| 189 | + end_date: end |
| 190 | + } |
| 191 | + |
182 | 192 | try { |
183 | | - const dateFormat = 'yyyy-MM-dd' |
184 | | - const start = format(startDate, dateFormat) |
185 | | - const end = format(endDate, dateFormat) |
186 | | - |
187 | | - let transactionsGetRequest: TransactionsGetRequest = { |
188 | | - access_token: accountConfig.token, |
189 | | - start_date: start, |
190 | | - end_date: end |
191 | | - } |
192 | | - let transactionsGetRequestOptions: TransactionsGetRequestOptions = { |
193 | | - account_ids: [accountConfig.id], |
194 | | - count: 500, |
195 | | - offset: 0 |
196 | | - } |
197 | | - let accounts: TransactionsGetResponse = null |
198 | | - |
199 | | - await this.client.transactionsGet(transactionsGetRequest, transactionsGetRequestOptions).then(res => { |
200 | | - accounts = res.data |
201 | | - }) |
202 | | - |
203 | | - while (accounts.transactions.length < accounts.total_transactions) { |
204 | | - transactionsGetRequestOptions.offset += transactionsGetRequestOptions.count |
205 | | - const next_page = await this.client.transactionsGet( |
206 | | - transactionsGetRequest, |
207 | | - transactionsGetRequestOptions |
208 | | - ) |
209 | | - accounts.transactions = accounts.transactions.concat(next_page.data.transactions) |
210 | | - } |
| 193 | + const response = await this.client.transactionsGet(request) |
| 194 | + |
| 195 | + let transactions = response.data.transactions |
| 196 | + const total_transactions = response.data.total_transactions |
| 197 | + // Manipulate the offset parameter to paginate |
| 198 | + // transactions and retrieve all available data |
| 199 | + |
| 200 | + while (transactions.length < total_transactions) { |
| 201 | + const paginatedRequest: TransactionsGetRequest = { |
| 202 | + ...request, |
| 203 | + options: { |
| 204 | + offset: transactions.length |
| 205 | + } |
| 206 | + } |
211 | 207 |
|
212 | | - return resolve(accounts) |
| 208 | + const paginatedResponse = await this.client.transactionsGet(paginatedRequest) |
| 209 | + transactions = transactions.concat(paginatedResponse.data.transactions) |
| 210 | + } |
| 211 | + return resolve({ accounts: response.data.accounts, transactions: transactions }) |
213 | 212 | } catch (e) { |
214 | 213 | return reject(e) |
215 | 214 | } |
@@ -269,7 +268,7 @@ export class PlaidIntegration { |
269 | 268 | })) |
270 | 269 |
|
271 | 270 | logInfo( |
272 | | - `Fetched ${data.accounts.length} sub-accounts and ${data.total_transactions} transactions.`, |
| 271 | + `Fetched ${data.accounts.length} sub-accounts and ${data.transactions.length} transactions.`, |
273 | 272 | accounts |
274 | 273 | ) |
275 | 274 | return accounts |
|
0 commit comments