refactor: yagni and flow of external compliance
This commit is contained in:
parent
b06927fd1c
commit
04eea85a0d
29 changed files with 389 additions and 1417 deletions
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue