73 lines
2 KiB
JavaScript
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}
|