UNPKG

@lomray/microservice-payment-stripe

Version:

Stripe payment microservice based on NodeJS & inverted json.

166 lines (162 loc) 8.9 kB
'use strict'; 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;