lamassu-server/lib/ofac/index.js
2024-06-28 15:58:59 +01:00

73 lines
2 KiB
JavaScript

const { readdir } = require('fs/promises')
const path = require('path')
const loader = require('./loading')
const matcher = require('./matching')
const nameUtils = require('./name-utils')
const _ = require('lodash/fp')
const logger = require('../logger')
const OFAC_DATA_DIR = process.env.OFAC_DATA_DIR
let structs = null
function load () {
if (!OFAC_DATA_DIR) {
const message = 'The ofacDataDir option has not been set in the environment'
return Promise.reject(new Error(message))
}
const ofacSourcesDir = path.join(OFAC_DATA_DIR, 'sources')
return readdir(ofacSourcesDir)
.then(_.flow(
_.map(file => path.join(ofacSourcesDir, file)),
loader.load
))
.then(result => {
return (structs = result)
})
}
// nameParts should be an object like {firstName: "John", lastName: "Doe", ...}
function makeCompatible (nameParts) {
const partNames = _.keys(nameParts)
const values = _.map(_.lowerCase, _.values(nameParts))
const props = _.zipAll([partNames, values])
return _.map(_.zipObject(['partName', 'value']), props)
}
function match (nameParts, birthDateString, options) {
if (!structs) {
logger.error(new Error('The OFAC data sources have not been loaded yet.'))
return false
}
// Prepare the input data
const parts = makeCompatible(nameParts)
const fullName = nameUtils.makeFullName(parts)
const words = nameUtils.makeWords(fullName)
// birthDateString is in YYYYMMDD format
const birthDate = _.cond([
[_.identity, () => {
const year = parseInt(birthDateString.slice(0, 4))
const month = parseInt(birthDateString.slice(4, 6))
const day = parseInt(birthDateString.slice(6, 8))
const date = new Date(year, month - 1, day)
return {year, month, day, date}
}],
[_.stubTrue, () => null]
])(birthDateString)
const candidate = {parts, fullName, words, birthDate}
const result = matcher.match(structs, candidate, options)
return result
}
function getStructs () {
return structs
}
module.exports = {load, match, getStructs}