chore: use monorepo organization
This commit is contained in:
parent
deaf7d6ecc
commit
a687827f7e
1099 changed files with 8184 additions and 11535 deletions
73
packages/server/lib/ofac/index.js
Normal file
73
packages/server/lib/ofac/index.js
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
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}
|
||||
Loading…
Add table
Add a link
Reference in a new issue