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 = '

Sync collection sample

https://eurotermbank.com/tbx-0.5.1.xcs

' // Entry content TBX. tbxPayload += entries.reduce( (payload, entry) => (payload += generateEntryTbx(entry)), '' ) // Closing boilerplate. tbxPayload += '
' 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