refactor: yagni and flow of external compliance

This commit is contained in:
Rafael Taranto 2024-06-17 22:11:24 +01:00
parent b06927fd1c
commit 04eea85a0d
29 changed files with 389 additions and 1417 deletions

View file

@ -1,55 +1,88 @@
const _ = require('lodash/fp')
const logger = require('./logger')
const configManager = require('./new-config-manager')
const ph = require('./plugin-helper')
const getPlugin = settings => {
const pluginCodes = ['sumsub']
const enabledAccounts = _.filter(_plugin => _plugin.enabled, _.map(code => ph.getAccountInstance(settings.accounts[code], code), pluginCodes))
if (_.isEmpty(enabledAccounts)) {
throw new Error('No external compliance services are active. Please check your 3rd party service configuration')
}
if (_.size(enabledAccounts) > 1) {
throw new Error('Multiple external compliance services are active. Please check your 3rd party service configuration')
}
const account = _.head(enabledAccounts)
const plugin = ph.load(ph.COMPLIANCE, account.code, account.enabled)
const getPlugin = (settings, pluginCode) => {
const account = settings.accounts[pluginCode]
const plugin = ph.load(ph.COMPLIANCE, pluginCode)
return ({ plugin, account })
}
const createApplicant = (settings, customer, applicantLevel) => {
const { plugin } = getPlugin(settings)
const { id } = customer
return plugin.createApplicant({ levelName: applicantLevel, externalUserId: id })
}
const getApplicant = (settings, customer) => {
const getStatus = (settings, service, customerId) => {
try {
const { plugin } = getPlugin(settings)
const { id } = customer
return plugin.getApplicant({ externalUserId: id }, false)
.then(res => ({
provider: plugin.CODE,
...res.data
const { plugin, account } = getPlugin(settings, service)
return plugin.getApplicantStatus(account, customerId)
.then((status) => ({
service,
status
}))
.catch(() => ({}))
} catch (e) {
return {}
.catch((error) => {
logger.error(`Error getting applicant for service ${service}:`, error)
return {
service: service,
status: null,
}
})
} catch (error) {
logger.error(`Error loading plugin for service ${service}:`, error)
return Promise.resolve({
service: service,
status: null,
})
}
}
const createApplicantExternalLink = (settings, customerId, triggerId) => {
const getStatusMap = (settings, customerExternalCompliance) => {
const triggers = configManager.getTriggers(settings.config)
const trigger = _.find(it => it.id === triggerId)(triggers)
const { plugin } = getPlugin(settings)
return plugin.createApplicantExternalLink({ levelName: trigger.externalServiceApplicantLevel, userId: customerId })
.then(r => r.data.url)
const services = _.flow(
_.map('externalService'),
_.compact,
_.uniq
)(triggers)
const applicantPromises = _.map(service => {
return getStatus(settings, service, customerExternalCompliance)
})(services)
return Promise.all(applicantPromises)
.then((applicantResults) => {
return _.reduce((map, result) => {
map[result.service] = result.status
return map
}, {})(applicantResults)
})
}
const createApplicant = (settings, externalService, customerId) => {
const account = settings.accounts[externalService]
const { plugin } = getPlugin(settings, externalService)
return plugin.createApplicant(account, customerId, account.applicantLevel)
}
const createLink = (settings, externalService, customerId) => {
const account = settings.accounts[externalService]
const { plugin } = getPlugin(settings, externalService)
return plugin.createLink(account, customerId, account.applicantLevel)
}
const getApplicantByExternalId = (settings, externalService, customerId) => {
const account = settings.accounts[externalService]
const { plugin } = getPlugin(settings, externalService)
return plugin.getApplicantByExternalId(account, customerId)
}
module.exports = {
getStatusMap,
getStatus,
createApplicant,
getApplicant,
createApplicantExternalLink
getApplicantByExternalId,
createLink
}