2022-04-18 16:54:53 +00:00
|
|
|
import * as plugins from './tink.plugins.js';
|
2022-02-19 12:15:59 +00:00
|
|
|
|
2022-08-23 14:56:59 +00:00
|
|
|
export interface IProviderData {
|
|
|
|
credentialsId: string;
|
|
|
|
providerName: string;
|
|
|
|
status: string;
|
|
|
|
sessionExpiryDate: number;
|
|
|
|
accountIds: string[];
|
|
|
|
statusUpdated: number;
|
|
|
|
}
|
|
|
|
|
2022-04-18 16:54:53 +00:00
|
|
|
import { TinkUser } from './tink.classes.tinkuser.js';
|
2022-02-19 12:15:59 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* a provider consent maps to tinks bank consents
|
|
|
|
*/
|
|
|
|
export class TinkProviderConsent {
|
2022-08-23 14:56:59 +00:00
|
|
|
public static async getProviderUserAccessToken(tinkUserRefArg: TinkUser) {
|
2022-02-19 12:15:59 +00:00
|
|
|
const authorizationCode = await tinkUserRefArg.tinkAccountRef.getUserAuthorizationCode(
|
|
|
|
tinkUserRefArg.externalUserIdArg,
|
|
|
|
tinkUserRefArg.tinkAccountRef.clientId,
|
|
|
|
'accounts:read,balances:read,transactions:read,provider-consents:read'
|
|
|
|
);
|
|
|
|
const accessToken = await tinkUserRefArg.tinkAccountRef.getUserAccessToken(authorizationCode);
|
2022-08-23 14:56:59 +00:00
|
|
|
return accessToken;
|
|
|
|
}
|
|
|
|
|
|
|
|
// STATIC
|
|
|
|
public static async getProviderConsentsForUser(tinkUserRefArg: TinkUser) {
|
|
|
|
const returnProviderConsents: TinkProviderConsent[] = [];
|
|
|
|
const accessToken = await this.getProviderUserAccessToken(tinkUserRefArg);
|
2022-02-19 12:15:59 +00:00
|
|
|
const responseData = await tinkUserRefArg.tinkAccountRef.request({
|
|
|
|
urlArg: '/api/v1/provider-consents',
|
|
|
|
accessToken,
|
|
|
|
methodArg: 'GET',
|
2022-04-18 16:54:53 +00:00
|
|
|
payloadArg: null,
|
|
|
|
});
|
2022-08-23 14:56:59 +00:00
|
|
|
// console.log(responseData); // no nextPageToken here?
|
|
|
|
if (responseData.providerConsents) {
|
|
|
|
for (const providerConsentData of responseData.providerConsents) {
|
|
|
|
returnProviderConsents.push(new TinkProviderConsent(tinkUserRefArg, providerConsentData));
|
|
|
|
}
|
|
|
|
}
|
2022-02-19 12:15:59 +00:00
|
|
|
return returnProviderConsents;
|
|
|
|
}
|
|
|
|
|
|
|
|
// INSTANCE
|
2022-08-23 14:56:59 +00:00
|
|
|
tinkUserRef: TinkUser;
|
|
|
|
data: IProviderData;
|
|
|
|
constructor(tinkUserRefArg: TinkUser, dataArg: IProviderData) {
|
|
|
|
this.tinkUserRef;
|
|
|
|
this.data = dataArg;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* refresh the bank account data from origin
|
|
|
|
*/
|
|
|
|
public async refresh() {
|
|
|
|
const userAccessToken = await TinkProviderConsent.getProviderUserAccessToken(this.tinkUserRef);
|
|
|
|
const response = await this.tinkUserRef.tinkAccountRef.request({
|
|
|
|
accessToken: userAccessToken,
|
|
|
|
methodArg: 'POST',
|
|
|
|
urlArg: `https://api.tink.com/api/v1/credentials/${this.data.credentialsId}/refresh`,
|
|
|
|
payloadArg: null
|
|
|
|
});
|
|
|
|
|
|
|
|
// polling as per documentation for status 'UPDATED';
|
|
|
|
let pollingRounds = 0;
|
|
|
|
let status = null;
|
|
|
|
while(status !== 'UPDATED' && pollingRounds < 10) {
|
|
|
|
await plugins.smartdelay.delayFor(2000);
|
|
|
|
await this.update();
|
|
|
|
status = this.data.status;
|
|
|
|
pollingRounds++;
|
|
|
|
}
|
|
|
|
// think about how to handle errors here
|
|
|
|
}
|
|
|
|
|
|
|
|
public async update() {
|
|
|
|
const providerConsents = await TinkProviderConsent.getProviderConsentsForUser(this.tinkUserRef);
|
|
|
|
for (const providerConsent of providerConsents) {
|
|
|
|
if (providerConsent.data.credentialsId === this.data.credentialsId) {
|
|
|
|
this.data = providerConsent.data;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-02-19 12:15:59 +00:00
|
|
|
}
|