@lomray/microservice-payment-stripe
Version:
Stripe payment microservice based on NodeJS & inverted json.
166 lines (162 loc) • 8.9 kB
JavaScript
;
var tslib = require('tslib');
var microserviceHelpers = require('@lomray/microservice-helpers');
var microserviceNodejsLib = require('@lomray/microservice-nodejs-lib');
var extractIdFromStripeInstance = require('../../helpers/extract-id-from-stripe-instance.js');
var toExpirationDate = require('../../helpers/formatters/to-expiration-date.js');
var isAllowedInstantPayout = require('../../helpers/is-allowed-instant-payout.js');
var isExternalAccountIsBankAccount = require('../../helpers/is-external-account-is-bank-account.js');
var messages = require('../../helpers/validators/messages.js');
var bankAccount = require('../../repositories/bank-account.js');
var card = require('../../repositories/card.js');
var customer = require('../../repositories/customer.js');
/**
* External account webhook handlers
*/
class ExternalAccount {
/**
* @constructor
*/
constructor(manager) {
this.manager = manager;
this.cardRepository = manager.getCustomRepository(card);
this.bankAccountRepository = manager.getCustomRepository(bankAccount);
}
/**
* Handles connect account create
* @description NOTES: Connect account event
*/
handleExternalAccountCreated(event) {
return tslib.__awaiter(this, void 0, void 0, function* () {
/* eslint-disable camelcase */
const externalAccount = event.data.object;
if (!(externalAccount === null || externalAccount === void 0 ? void 0 : externalAccount.account)) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('The connected account reference in external account data'),
});
}
const { userId, params } = yield customer.getCustomerByAccountId(extractIdFromStripeInstance(externalAccount.account), this.manager);
if (!isExternalAccountIsBankAccount(externalAccount)) {
const { id: cardId, last4: lastDigits, brand, funding, exp_year, exp_month, available_payout_methods: availablePayoutMethods, default_for_currency: isDefault, address_zip: billingPostalCode, address_country: billingCountry, fingerprint, issuer, country, } = externalAccount;
/**
* Only connected custom account can attach few external account for payouts
*/
if (params.accountType === 'custom') {
// User SHOULD NOT be eligible in any way to attach same card as payout method
const { isExist, type } = yield card.getCardDataByFingerprint({
userId,
fingerprint,
});
if (isExist && type === 'externalAccount') {
/**
* @TODO: Handle for custom account duplicated card attach. Throw error and delete card from Stripe, etc..
*/
const message = 'External account attached card is duplicated.';
microserviceHelpers.Log.error(message);
}
}
yield this.cardRepository.save(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ lastDigits,
brand,
funding,
userId, origin: country }, (fingerprint ? { fingerprint } : {})), { isInstantPayoutAllowed: isAllowedInstantPayout(availablePayoutMethods) }), (billingCountry ? { country: billingCountry } : {})), (billingPostalCode ? { postalCode: billingPostalCode } : {})), { isDefault: Boolean(isDefault), expired: toExpirationDate(exp_month, exp_year), params: { cardId, issuer } }));
return;
}
const { id: bankAccountId, last4: lastDigits, account_holder_name: holderName, bank_name: bankName, default_for_currency: isDefault, available_payout_methods: availablePayoutMethods, } = externalAccount;
yield this.bankAccountRepository.save({
isDefault: Boolean(isDefault),
bankAccountId,
lastDigits,
userId,
isInstantPayoutAllowed: isAllowedInstantPayout(availablePayoutMethods),
holderName,
bankName,
params: { bankAccountId },
});
/* eslint-enable camelcase */
});
}
/**
* Handles connect account update
* @description Connect account event
*/
handleExternalAccountUpdated(event) {
return tslib.__awaiter(this, void 0, void 0, function* () {
/* eslint-disable camelcase */
const externalAccount = event.data.object;
if (!isExternalAccountIsBankAccount(externalAccount)) {
const card$1 = yield card.getCardById(externalAccount.id, this.manager);
if (!card$1) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('Failed to handle external account updated. Card'),
});
}
const { last4: lastDigits, brand, exp_year, exp_month, default_for_currency: isDefault, available_payout_methods: availablePayoutMethods, funding, issuer, country, address_country: billingCountry, address_zip: billingPostalCode, } = externalAccount;
card$1.isDefault = Boolean(isDefault);
card$1.lastDigits = lastDigits;
card$1.expired = toExpirationDate(exp_month, exp_year);
card$1.brand = brand;
card$1.funding = funding;
card$1.origin = country;
card$1.params.issuer = issuer;
card$1.country = billingCountry;
card$1.postalCode = billingPostalCode;
card$1.isInstantPayoutAllowed = isAllowedInstantPayout(availablePayoutMethods);
yield this.cardRepository.save(card$1);
return;
}
const bankAccount$1 = yield bankAccount.getBankAccountById(externalAccount.id, this.manager);
if (!bankAccount$1) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('Failed to handle external account updated. Bank account'),
});
}
const { last4: lastDigits, account_holder_name: holderName, bank_name: bankName, default_for_currency: isDefault, available_payout_methods: availablePayoutMethods, } = externalAccount;
bankAccount$1.isDefault = Boolean(isDefault);
bankAccount$1.lastDigits = lastDigits;
bankAccount$1.holderName = holderName;
bankAccount$1.bankName = bankName;
bankAccount$1.isInstantPayoutAllowed = isAllowedInstantPayout(availablePayoutMethods);
yield this.bankAccountRepository.save(bankAccount$1);
/* eslint-enable camelcase */
});
}
/**
* Handles connect account deleted
* @description Connect account event
*/
handleExternalAccountDeleted(event) {
return tslib.__awaiter(this, void 0, void 0, function* () {
const externalAccount = event.data.object;
if (!(externalAccount === null || externalAccount === void 0 ? void 0 : externalAccount.account)) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('The connected account reference in external account data'),
});
}
const externalAccountId = extractIdFromStripeInstance(externalAccount.id);
if (!isExternalAccountIsBankAccount(externalAccount)) {
const card$1 = yield card.getCardById(externalAccountId, this.manager);
if (!card$1) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('Failed to handle external account deleted. Card'),
});
}
yield this.cardRepository.remove(card$1);
return;
}
const bankAccount$1 = yield bankAccount.getBankAccountById(externalAccountId, this.manager);
if (!bankAccount$1) {
throw new microserviceNodejsLib.BaseException({
status: 500,
message: messages.getNotFoundMessage('Failed to handle external account deleted. Bank account'),
});
}
yield this.bankAccountRepository.remove(bankAccount$1);
});
}
}
module.exports = ExternalAccount;