mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-15 12:20:31 +00:00
104 lines
3.4 KiB
TypeScript
104 lines
3.4 KiB
TypeScript
import { forEach } from 'lodash';
|
|
import { Configuration, PlaidApi, PlaidEnvironments } from 'plaid';
|
|
import { createPlaidApiEvent } from './PlaidApiEventsDBSync';
|
|
import config from '@/config';
|
|
|
|
const OPTIONS = { clientApp: 'Plaid-Pattern' };
|
|
|
|
// We want to log requests to / responses from the Plaid API (via the Plaid client), as this data
|
|
// can be useful for troubleshooting.
|
|
|
|
/**
|
|
* Logging function for Plaid client methods that use an access_token as an argument. Associates
|
|
* the Plaid API event log entry with the item and user the request is for.
|
|
*
|
|
* @param {string} clientMethod the name of the Plaid client method called.
|
|
* @param {Array} clientMethodArgs the arguments passed to the Plaid client method.
|
|
* @param {Object} response the response from the Plaid client.
|
|
*/
|
|
const defaultLogger = async (clientMethod, clientMethodArgs, response) => {
|
|
const accessToken = clientMethodArgs[0].access_token;
|
|
// const { id: itemId, user_id: userId } = await retrieveItemByPlaidAccessToken(
|
|
// accessToken
|
|
// );
|
|
// await createPlaidApiEvent(1, 1, clientMethod, clientMethodArgs, response);
|
|
|
|
// console.log(response);
|
|
};
|
|
|
|
/**
|
|
* Logging function for Plaid client methods that do not use access_token as an argument. These
|
|
* Plaid API event log entries will not be associated with an item or user.
|
|
*
|
|
* @param {string} clientMethod the name of the Plaid client method called.
|
|
* @param {Array} clientMethodArgs the arguments passed to the Plaid client method.
|
|
* @param {Object} response the response from the Plaid client.
|
|
*/
|
|
const noAccessTokenLogger = async (
|
|
clientMethod,
|
|
clientMethodArgs,
|
|
response
|
|
) => {
|
|
// console.log(response);
|
|
|
|
// await createPlaidApiEvent(
|
|
// undefined,
|
|
// undefined,
|
|
// clientMethod,
|
|
// clientMethodArgs,
|
|
// response
|
|
// );
|
|
};
|
|
|
|
// Plaid client methods used in this app, mapped to their appropriate logging functions.
|
|
const clientMethodLoggingFns = {
|
|
accountsGet: defaultLogger,
|
|
institutionsGet: noAccessTokenLogger,
|
|
institutionsGetById: noAccessTokenLogger,
|
|
itemPublicTokenExchange: noAccessTokenLogger,
|
|
itemRemove: defaultLogger,
|
|
linkTokenCreate: noAccessTokenLogger,
|
|
transactionsSync: defaultLogger,
|
|
sandboxItemResetLogin: defaultLogger,
|
|
};
|
|
// Wrapper for the Plaid client. This allows us to easily log data for all Plaid client requests.
|
|
export class PlaidClientWrapper {
|
|
constructor() {
|
|
// Initialize the Plaid client.
|
|
const configuration = new Configuration({
|
|
basePath: PlaidEnvironments[config.plaid.env],
|
|
baseOptions: {
|
|
headers: {
|
|
'PLAID-CLIENT-ID': config.plaid.clientId,
|
|
'PLAID-SECRET':
|
|
config.plaid.env === 'development'
|
|
? config.plaid.secretDevelopment
|
|
: config.plaid.secretSandbox,
|
|
'Plaid-Version': '2020-09-14',
|
|
},
|
|
},
|
|
});
|
|
|
|
this.client = new PlaidApi(configuration);
|
|
|
|
// Wrap the Plaid client methods to add a logging function.
|
|
forEach(clientMethodLoggingFns, (logFn, method) => {
|
|
this[method] = this.createWrappedClientMethod(method, logFn);
|
|
});
|
|
}
|
|
|
|
// Allows us to log API request data for troubleshooting purposes.
|
|
createWrappedClientMethod(clientMethod, log) {
|
|
return async (...args) => {
|
|
try {
|
|
const res = await this.client[clientMethod](...args);
|
|
await log(clientMethod, args, res);
|
|
return res;
|
|
} catch (err) {
|
|
await log(clientMethod, args, err?.response?.data);
|
|
throw err;
|
|
}
|
|
};
|
|
}
|
|
}
|