Files
term_portal/express/models/system/eurotermbank.js
T
2023-03-10 12:50:23 +01:00

184 lines
4.6 KiB
JavaScript

const db = require('../../models/db')
const Cursor = require('pg-cursor')
const axios = require('axios').default
const xmlFlow = require('xml-flow')
const { removeHtmlTags } = require('../helpers')
const Eurotermbank = {}
// Push all changes to Eurotermbank.
Eurotermbank.push = async () => {
const dbClient = await db.getClient()
try {
const { rows: dictrionariesToSync } = await dbClient.query(
'SELECT id, name_sl FROM dictionary ORDER BY id'
)
for (const { id, name_sl: name } of dictrionariesToSync) {
// Create/update collection metadata.
await centralSyncApi.put(id.toString(), {
name,
domainid: 2841
})
const text = `
SELECT
id,
term,
definition,
ARRAY(
SELECT name
FROM entry_domain_label edl
LEFT JOIN domain_label dl ON dl.id = edl.domain_label_id
WHERE entry_id = e.id
) domain_labels,
ARRAY(
SELECT jsonb_build_object(
'link', link,
'type', type)
FROM entry_link
WHERE entry_id = e.id
) links,
ARRAY(
SELECT jsonb_build_object(
'lang_code', l.code,
'terms', ef.term,
'definition', ef.definition,
'synonyms', ef.synonym)
FROM entry_foreign ef
LEFT JOIN language l ON l.id = ef.language_id
WHERE entry_id = e.id
) foreign_entries
FROM entry e
WHERE
e.dictionary_id = $1
AND is_valid`
const values = [id]
const cursor = dbClient.query(new Cursor(text, values))
let entries = []
do {
// Keep getting and sending entries in batches of 100.
entries = await cursor.read(100)
if (entries.length) {
const tbxPayload = generateTbxPayload(entries)
await centralSyncApi.post(`${id}/entries`, tbxPayload, {
headers: { 'content-type': 'application/xml' }
})
}
} while (entries.length === 100)
}
} finally {
dbClient.release()
}
}
const centralSyncApi = axios.create({
baseURL:
'https://test-fedterm.eurotermbank.com/api/termservice/sync/collection/external/',
auth: {
username: 'SlovenianNTP',
password: '3l063Ni=p0tr4l(t3rm'
}
})
function generateTbxPayload(entries) {
// Opening boilerplate.
let tbxPayload =
'<?xml version="1.0" encoding="utf-8"?><!DOCTYPE martif SYSTEM "https://eurotermbank.com/TBXcoreStructV02%20%281%29.dtd"><martif type="TBX" xml:lang="en"><martifHeader><fileDesc><sourceDesc><p>Sync collection sample</p></sourceDesc></fileDesc><encodingDesc><p type="XCSURI">https://eurotermbank.com/tbx-0.5.1.xcs</p></encodingDesc></martifHeader><text><body>'
// Entry content TBX.
tbxPayload += entries.reduce(
(payload, entry) => (payload += generateEntryTbx(entry)),
''
)
// Closing boilerplate.
tbxPayload += '</body></text></martif>'
return tbxPayload
}
function generateEntryTbx(entry) {
const entryObj = {
$name: 'termEntry',
$attrs: { id: entry.id },
$markup: [
{
$name: 'langSet',
$attrs: { 'xml:lang': 'sl' },
$markup: [
{
$name: 'ntig',
$markup: [
{
$name: 'termGrp',
$markup: [{ $name: 'term', $text: removeHtmlTags(entry.term) }]
}
]
}
]
}
]
}
if (entry.definition) {
const definitionObj = {
$name: 'descripGrp',
$markup: [
{
$name: 'descrip',
$attrs: { type: 'definition' },
$text: removeHtmlTags(entry.definition)
}
]
}
entryObj.$markup[0].$markup.push(definitionObj)
}
entry.foreign_entries.forEach(fEntry => {
const fEntryObj = {
$name: 'langSet',
$attrs: { 'xml:lang': fEntry.lang_code },
$markup: [
{
$name: 'ntig',
$markup: [
{
$name: 'termGrp',
$markup: [
{ $name: 'term', $text: removeHtmlTags(fEntry.terms[0]) }
]
}
]
}
]
}
if (fEntry.definition) {
const fDefinitionObj = {
$name: 'descripGrp',
$markup: [
{
$name: 'descrip',
$attrs: { type: 'definition' },
$text: removeHtmlTags(fEntry.definition)
}
]
}
fEntryObj.$markup.push(fDefinitionObj)
}
entryObj.$markup.push(fEntryObj)
})
return xmlFlow.toXml(entryObj)
}
module.exports = Eurotermbank