tink/ts/tink.classes.tinkproviderconsent.ts

88 lines
2.8 KiB
TypeScript
Raw Normal View History

import * as plugins from './tink.plugins.js';
2022-02-19 12:15:59 +00:00
export interface IProviderData {
credentialsId: string;
providerName: string;
status: string;
sessionExpiryDate: number;
accountIds: string[];
statusUpdated: number;
}
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 {
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);
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',
payloadArg: null,
});
// 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
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
}