diff --git a/package-lock.json b/package-lock.json index 447f928..9157990 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "method-node", - "version": "1.1.13", + "version": "1.1.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "method-node", - "version": "1.1.13", + "version": "1.1.14", "license": "ISC", "dependencies": { "axios": "^1.7.4", diff --git a/package.json b/package.json index fb35a90..1aade2e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "method-node", - "version": "1.1.13", + "version": "1.1.14", "description": "Node.js library for the Method API", "main": "dist/index.ts", "module": "dist/index.mjs", diff --git a/src/resources/Account/types.ts b/src/resources/Account/types.ts index eec5704..7a780da 100644 --- a/src/resources/Account/types.ts +++ b/src/resources/Account/types.ts @@ -384,6 +384,7 @@ export interface IAccountSubscription { id: string; name: TAccountSubscriptionTypes; status: TAccountSubscriptionStatuses; + payload: any | null; latest_request_id: string | null; created_at: string; updated_at: string; diff --git a/src/resources/Entity/Attributes.ts b/src/resources/Entity/Attributes.ts index 00b851f..934288c 100644 --- a/src/resources/Entity/Attributes.ts +++ b/src/resources/Entity/Attributes.ts @@ -1,6 +1,6 @@ import Resource, { IResourceListOpts } from '../../resource'; import Configuration, { IResponse } from '../../configuration'; -import type { IEntityAttributes } from './types'; +import type { IEntityAttributes, IEntityAttributesCreateOpts } from './types'; export default class EntityAttributes extends Resource { constructor(config: Configuration) { @@ -34,7 +34,7 @@ export default class EntityAttributes extends Resource { * @returns Returns an Entity’s Attributes object. */ - async create() { - return super._create, {}>({}); + async create(opts: IEntityAttributesCreateOpts) { + return super._create, IEntityAttributesCreateOpts>(opts); } }; diff --git a/src/resources/Entity/Subscriptions.ts b/src/resources/Entity/Subscriptions.ts index 3e17924..dfc7b82 100644 --- a/src/resources/Entity/Subscriptions.ts +++ b/src/resources/Entity/Subscriptions.ts @@ -43,8 +43,8 @@ export default class EntitySubscriptions extends Resource { * @returns Returns a map of Subscription name to either Subscription object or Error. */ - async create(sub_name: TEntitySubscriptionNames, requestConfig?: IRequestConfig) { - return super._create, IEntitySubscriptionCreateOpts>({ enroll: sub_name }, requestConfig); + async create(opts: IEntitySubscriptionCreateOpts, requestConfig?: IRequestConfig) { + return super._create, IEntitySubscriptionCreateOpts>(opts, requestConfig); } /** diff --git a/src/resources/Entity/types.ts b/src/resources/Entity/types.ts index f9c80de..b7c78c0 100644 --- a/src/resources/Entity/types.ts +++ b/src/resources/Entity/types.ts @@ -152,21 +152,49 @@ export interface IEntityCreditScores { updated_at: string, }; -export type TCreditHealthAttributeRating = 'excellent' | 'good' | 'fair' | 'needs_work'; +export const CreditHealthAttributeRatings = { + excellent: 'excellent', + good: 'good', + fair: 'fair', + needs_work: 'needs_work', +} as const; + +export type TCreditHealthAttributeRating = keyof typeof CreditHealthAttributeRatings; export interface ICreditHealthAttribute { value: number; rating: TCreditHealthAttributeRating; + metadata?: {} | null; } export interface IEntityAttributesType { credit_health_credit_card_usage: ICreditHealthAttribute; credit_health_derogatory_marks: ICreditHealthAttribute; credit_health_hard_inquiries: ICreditHealthAttribute; + credit_health_soft_inquiries: ICreditHealthAttribute; credit_health_total_accounts: ICreditHealthAttribute; credit_health_credit_age: ICreditHealthAttribute; credit_health_payment_history: ICreditHealthAttribute; credit_health_open_accounts: ICreditHealthAttribute; + credit_health_entity_delinquent: ICreditHealthAttribute; +} + +export const EntityAttributeNames = { + credit_health_credit_card_usage: 'credit_health_credit_card_usage', + credit_health_derogatory_marks: 'credit_health_derogatory_marks', + credit_health_hard_inquiries: 'credit_health_hard_inquiries', + credit_health_soft_inquiries: 'credit_health_soft_inquiries', + credit_health_total_accounts: 'credit_health_total_accounts', + credit_health_credit_age: 'credit_health_credit_age', + credit_health_payment_history: 'credit_health_payment_history', + credit_health_open_accounts: 'credit_health_open_accounts', + credit_health_entity_delinquent: 'credit_health_entity_delinquent', +} as const; + +export type TEntityAttributeNames = keyof typeof EntityAttributeNames; + +export interface IEntityAttributesCreateOpts { + attributes: TEntityAttributeNames[]; } export interface IEntityAttributes { @@ -263,10 +291,17 @@ export const EntitySubscriptionStatuses = { export type TEntitySubscriptionStatuses = keyof typeof EntitySubscriptionStatuses; +export interface IEntitySubscriptionPayload { + attributes?: { + requested_attributes: TEntityAttributeNames[]; + } | null; +}; + export interface IEntitySubscription { id: string; name: TEntitySubscriptionNames; status: TEntitySubscriptionStatuses; + payload: IEntitySubscriptionPayload | null; latest_request_id: string | null; created_at: string; updated_at: string; @@ -275,10 +310,12 @@ export interface IEntitySubscription { export interface IEntitySubscriptionResponse { connect?: IEntitySubscription; credit_score?: IEntitySubscription; + attribute?: IEntitySubscription; }; export interface IEntitySubscriptionCreateOpts { enroll: TEntitySubscriptionNames; + payload?: IEntitySubscriptionPayload; }; export const EntityVerificationSessionStatuses = { diff --git a/test/resources/Account.tests.ts b/test/resources/Account.tests.ts index 8bf753e..7bc5105 100644 --- a/test/resources/Account.tests.ts +++ b/test/resources/Account.tests.ts @@ -146,7 +146,7 @@ describe('Accounts - core methods tests', () => { mask: '8721', ownership: 'unknown', type: 'credit_card', - name: 'Chase Sapphire Reserve' + name: 'Chase Credit Card' }, latest_verification_session: accounts_create_liability_response.latest_verification_session, balance: null, @@ -638,6 +638,7 @@ describe('Accounts - core methods tests', () => { id: create_txn_subscriptions_response.id, name: 'transaction', status: 'active', + payload: null, latest_request_id: null, created_at: create_txn_subscriptions_response.created_at, updated_at: create_txn_subscriptions_response.updated_at @@ -656,6 +657,7 @@ describe('Accounts - core methods tests', () => { id: create_update_subscriptions_response.id, name: 'update', status: 'active', + payload: null, latest_request_id: null, created_at: create_update_subscriptions_response.created_at, updated_at: create_update_subscriptions_response.updated_at @@ -674,6 +676,7 @@ describe('Accounts - core methods tests', () => { id: create_update_snapshot_subscriptions_response.id, name: 'update.snapshot', status: 'active', + payload: null, latest_request_id: null, created_at: create_update_snapshot_subscriptions_response.created_at, updated_at: create_update_snapshot_subscriptions_response.updated_at @@ -703,6 +706,7 @@ describe('Accounts - core methods tests', () => { id: create_update_subscriptions_response.id, name: 'update', status: 'active', + payload: null, latest_request_id: null, created_at: subscriptions_response.update?.created_at || '', updated_at: subscriptions_response.update?.updated_at || '' @@ -714,6 +718,7 @@ describe('Accounts - core methods tests', () => { id: create_txn_subscriptions_response.id, name: 'transaction', status: 'active', + payload: null, latest_request_id: null, created_at: subscriptions_transactions_response.transaction?.created_at || '', updated_at: subscriptions_transactions_response.transaction?.updated_at || '' @@ -725,6 +730,7 @@ describe('Accounts - core methods tests', () => { id: create_update_snapshot_subscriptions_response.id, name: 'update.snapshot', status: 'active', + payload: null, latest_request_id: null, created_at: subscriptions_update_snapshot_response['update.snapshot']?.created_at || '', updated_at: subscriptions_update_snapshot_response['update.snapshot']?.updated_at || '' @@ -746,6 +752,7 @@ describe('Accounts - core methods tests', () => { id: create_txn_subscriptions_response.id, name: 'transaction', status: 'active', + payload: null, latest_request_id: null, created_at: retrieve_subscriptions_response.created_at, updated_at: retrieve_subscriptions_response.updated_at @@ -764,6 +771,7 @@ describe('Accounts - core methods tests', () => { id: create_update_subscriptions_response.id, name: 'update', status: 'active', + payload: null, latest_request_id: null, created_at: retrieve_subscriptions_response.created_at, updated_at: retrieve_subscriptions_response.updated_at @@ -782,6 +790,7 @@ describe('Accounts - core methods tests', () => { id: create_update_snapshot_subscriptions_response.id, name: 'update.snapshot', status: 'active', + payload: null, latest_request_id: null, created_at: retrieve_subscriptions_response.created_at, updated_at: retrieve_subscriptions_response.updated_at @@ -800,6 +809,7 @@ describe('Accounts - core methods tests', () => { id: create_update_snapshot_subscriptions_response.id, name: 'update.snapshot', status: 'inactive', + payload: null, latest_request_id: null, created_at: delete_subscriptions_response.created_at, updated_at: delete_subscriptions_response.updated_at @@ -939,7 +949,7 @@ describe('Accounts - core methods tests', () => { credit_limit: 2800000, usage_pattern: null }, - data_as_of: null, + data_as_of: retrieve_updates_response.data_as_of, error: null, created_at: retrieve_updates_response.created_at, updated_at: retrieve_updates_response.updated_at @@ -975,7 +985,7 @@ describe('Accounts - core methods tests', () => { credit_limit: 2800000, usage_pattern: null }, - data_as_of: null, + data_as_of: update_to_check?.data_as_of || null, error: null, created_at: update_to_check?.created_at || '', updated_at: update_to_check?.updated_at || '' @@ -1110,7 +1120,7 @@ describe('Accounts - core methods tests', () => { status: 'available', status_error: null, latest_request_id: accounts_retrieve_product_list_response.card_brand?.latest_request_id || null, - is_subscribable: false, + is_subscribable: true, created_at: accounts_retrieve_product_list_response.card_brand?.created_at || '', updated_at: accounts_retrieve_product_list_response.card_brand?.updated_at || '' }, diff --git a/test/resources/Entity.tests.ts b/test/resources/Entity.tests.ts index 620e18a..51f537a 100644 --- a/test/resources/Entity.tests.ts +++ b/test/resources/Entity.tests.ts @@ -15,6 +15,7 @@ import type { IEntityAttributes, IEntityVehicles, } from '../../src/resources/Entity'; +import { EntityAttributeNames } from '../../src/resources/Entity/types'; import type { IAccount } from '../../src/resources/Account'; import { IResponse } from '../../src/configuration'; @@ -38,6 +39,7 @@ describe('Entities - core methods tests', () => { let entities_retrieve_product_list_response: IResponse; let entities_create_connect_subscription_response: IResponse; let entities_create_credit_score_subscription_response: IResponse; + let entities_create_attributes_subscription_response: IResponse; let entities_create_verification_session_response: IResponse; let entities_create_phone_verification_session_response: IResponse; @@ -461,13 +463,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully retrieve the results of a credit score request for an entity', async () => { - const getCreditScores = async () => { - return await client - .entities(entities_create_response.id) - .creditScores.retrieve(entities_create_credit_score_response.id); - }; - - const credit_scores = await awaitResults(getCreditScores); + const credit_scores = await client + .entities(entities_create_response.id) + .creditScores.retrieve(entities_create_credit_score_response.id); const expect_results: IEntityCreditScores = { id: entities_create_credit_score_response.id, @@ -492,7 +490,7 @@ describe('Entities - core methods tests', () => { description: "Lack of sufficient relevant real estate account information" } ], - created_at: credit_scores.scores[0].created_at, + created_at: credit_scores.scores?.[0]?.created_at || '', } ], error: null, @@ -504,13 +502,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully list credit scores for an entity', async () => { - const listCreditScores = async () => { - return await client - .entities(entities_create_response.id) - .creditScores.list(); - }; - - const credit_scores = await awaitResults(listCreditScores); + const credit_scores = await client + .entities(entities_create_response.id) + .creditScores.list(); const expect_results: IEntityCreditScores = { id: entities_create_credit_score_response.id, @@ -535,7 +529,7 @@ describe('Entities - core methods tests', () => { description: "Lack of sufficient relevant real estate account information" } ], - created_at: credit_scores[0].scores[0].created_at, + created_at: credit_scores[0].scores?.[0]?.created_at || '', } ], error: null, @@ -551,7 +545,9 @@ describe('Entities - core methods tests', () => { it('should successfully create an attributes request for an entity', async () => { entities_create_attribute_response = await client .entities(entities_create_response.id) - .attributes.create(); + .attributes.create({ + attributes: [EntityAttributeNames.credit_health_credit_card_usage] + }); const expect_results: IEntityAttributes = { id: entities_create_attribute_response.id, @@ -567,13 +563,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully retrieve the results of an attributes request for an entity', async () => { - const getAttributes = async () => { - return await client - .entities(entities_create_response.id) - .attributes.retrieve(entities_create_attribute_response.id); - }; - - const attributes = await awaitResults(getAttributes); + const attributes = await client + .entities(entities_create_response.id) + .attributes.retrieve(entities_create_attribute_response.id); const expect_results: IEntityAttributes = { id: attributes.id, @@ -589,13 +581,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully list attributes for an entity', async () => { - const listAttributes = async () => { - return await client - .entities(entities_create_response.id) - .attributes.list(); - }; - - const attributes = await awaitResults(listAttributes); + const attributes = await client + .entities(entities_create_response.id) + .attributes.list(); attributes[0].should.be.eql(entities_create_attribute_response); }); @@ -657,13 +645,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully retrieve the results of a request for an identity', async () => { - const getIdentities = async () => { - return await client - .entities(entity_with_identity_cap.id) - .identities.retrieve(entities_create_idenitity_response.id); - }; - - const identities = await awaitResults(getIdentities); + const identities = await client + .entities(entity_with_identity_cap.id) + .identities.retrieve(entities_create_idenitity_response.id); const expect_results: IEntityIdentity = { id: entities_create_idenitity_response.id, @@ -706,13 +690,9 @@ describe('Entities - core methods tests', () => { }); it('should successfully list identities for an entity', async () => { - const listIdentities = async () => { - return await client - .entities(entity_with_identity_cap.id) - .identities.list(); - }; - - const identities = await awaitResults(listIdentities); + const identities = await client + .entities(entity_with_identity_cap.id) + .identities.list(); identities[0].should.be.eql(entities_create_idenitity_response); }); @@ -986,12 +966,15 @@ describe('Entities - core methods tests', () => { it('should create a connect subscription for an entity', async () => { entities_create_connect_subscription_response = await client .entities(entities_create_response.id) - .subscriptions.create('connect'); + .subscriptions.create({ + enroll: 'connect' + }); const expect_connect_results: IEntitySubscription = { id: entities_create_connect_subscription_response.id, name: 'connect', status: 'active', + payload: null, latest_request_id: null, created_at: entities_create_connect_subscription_response.created_at, updated_at: entities_create_connect_subscription_response.updated_at, @@ -1006,13 +989,16 @@ describe('Entities - core methods tests', () => { it('should create a credit_score subscription for an entity', async () => { entities_create_credit_score_subscription_response = await client .entities(entities_create_response.id) - .subscriptions.create('credit_score'); + .subscriptions.create({ + enroll: 'credit_score' + }); const expect_credit_score_results: IEntitySubscription = { id: entities_create_credit_score_subscription_response.id, name: 'credit_score', status: 'active', latest_request_id: null, + payload: null, created_at: entities_create_credit_score_subscription_response.created_at, updated_at: @@ -1025,6 +1011,35 @@ describe('Entities - core methods tests', () => { ); }); + it('should create an attributes subscription for an entity', async () => { + entities_create_attributes_subscription_response = await client + .entities(entities_create_response.id) + .subscriptions.create({ + enroll: 'attribute', + payload: { + attributes: { + requested_attributes: [EntityAttributeNames.credit_health_credit_card_usage] + } + } + }); + + const expect_results: IEntitySubscription = { + id: entities_create_attributes_subscription_response.id, + name: 'attribute', + status: 'active', + payload: { + attributes: { + requested_attributes: [EntityAttributeNames.credit_health_credit_card_usage] + } + }, + latest_request_id: entities_create_attributes_subscription_response.latest_request_id, + created_at: entities_create_attributes_subscription_response.created_at, + updated_at: entities_create_attributes_subscription_response.updated_at, + }; + + entities_create_attributes_subscription_response.should.be.eql(expect_results); + }); + it('should retrieve a subscription for an entity', async () => { const entities_connect_subscription_response = await client .entities(entities_create_response.id) @@ -1042,6 +1057,7 @@ describe('Entities - core methods tests', () => { id: entities_create_connect_subscription_response.id, name: 'connect', status: 'active', + payload: null, latest_request_id: entities_connect_subscription_response.latest_request_id, created_at: entities_connect_subscription_response.created_at, @@ -1052,6 +1068,7 @@ describe('Entities - core methods tests', () => { id: entities_create_credit_score_subscription_response.id, name: 'credit_score', status: 'active', + payload: null, latest_request_id: entities_credit_score_subscription_response.latest_request_id, created_at: entities_credit_score_subscription_response.created_at, @@ -1072,10 +1089,28 @@ describe('Entities - core methods tests', () => { .subscriptions.list(); const expect_results: IEntitySubscriptionResponse = { + attribute: { + id: entities_create_attributes_subscription_response.id, + name: 'attribute', + status: 'active', + payload: { + attributes: { + requested_attributes: [EntityAttributeNames.credit_health_credit_card_usage] + } + }, + latest_request_id: + entities_subscription_list_response.attribute?.latest_request_id || + null, + created_at: + entities_subscription_list_response.attribute?.created_at || '', + updated_at: + entities_subscription_list_response.attribute?.updated_at || '', + }, connect: { id: entities_create_connect_subscription_response.id, name: 'connect', status: 'active', + payload: null, latest_request_id: entities_subscription_list_response.connect?.latest_request_id || null, @@ -1088,6 +1123,7 @@ describe('Entities - core methods tests', () => { id: entities_create_credit_score_subscription_response.id, name: 'credit_score', status: 'active', + payload: null, latest_request_id: entities_subscription_list_response.credit_score ?.latest_request_id || null, @@ -1110,6 +1146,7 @@ describe('Entities - core methods tests', () => { id: entities_create_connect_subscription_response.id, name: 'connect', status: 'inactive', + payload: null, latest_request_id: null, created_at: entities_subscription_delete_response.created_at, updated_at: entities_subscription_delete_response.updated_at, diff --git a/test/resources/Event.tests.ts b/test/resources/Event.tests.ts index 357da8f..4bef6d6 100644 --- a/test/resources/Event.tests.ts +++ b/test/resources/Event.tests.ts @@ -8,6 +8,7 @@ import type { IEntityAttributes, IEntityCreditScores, } from '../../src/resources/Entity/types'; +import { EntityAttributeNames } from '../../src/resources/Entity/types'; import type { IAccount } from '../../src/resources/Account'; import { IResponse } from '../../src/configuration'; @@ -52,7 +53,9 @@ describe('Events - core methods tests', () => { holder_id: entity_response.id, }); - attribute_response = await client.entities(entity_response.id).attributes.create(); + attribute_response = await client.entities(entity_response.id).attributes.create({ + attributes: [EntityAttributeNames.credit_health_credit_card_usage], + }); credit_score_response = await client.entities(entity_response.id).creditScores.create(); });