197 lines
5.5 KiB
JavaScript
197 lines
5.5 KiB
JavaScript
const { removeHtmlTags } = require('../../helpers')
|
|
const { searchEngineClient, ENTRY_INDEX } = require('../../search-engine')
|
|
|
|
exports.deserialize = {
|
|
primaryDomain(domain) {
|
|
const deserializedDomain = {
|
|
id: domain.id,
|
|
nameSl: domain.name_sl,
|
|
nameEn: domain.name_en
|
|
}
|
|
|
|
return deserializedDomain
|
|
},
|
|
|
|
secondaryDomain(domain) {
|
|
const deserializedDomain = {
|
|
id: domain.id,
|
|
isApproved: domain.approved,
|
|
nameSl: domain.name_sl,
|
|
nameEn: domain.name_en
|
|
}
|
|
|
|
return deserializedDomain
|
|
},
|
|
|
|
approvedSecondaryDomain(domain) {
|
|
const deserializedDomain = {
|
|
id: domain.id,
|
|
nameSl: domain.name_sl,
|
|
nameEn: domain.name_en
|
|
}
|
|
|
|
return deserializedDomain
|
|
},
|
|
|
|
language(language) {
|
|
const deserializedLanguage = {
|
|
id: language.id,
|
|
code: language.code,
|
|
nameSl: language.name_sl,
|
|
nameEn: language.name_en
|
|
}
|
|
|
|
return deserializedLanguage
|
|
},
|
|
|
|
editDescription(dictionary) {
|
|
const deserializedDictionary = {
|
|
id: dictionary.id,
|
|
nameSl: dictionary.name_sl,
|
|
nameEn: dictionary.name_en,
|
|
nameSlShort: dictionary.name_sl_short,
|
|
author: dictionary.author,
|
|
domainPrimary: dictionary.domain_primary_id,
|
|
description: dictionary.description,
|
|
issn: dictionary.issn
|
|
}
|
|
|
|
return deserializedDictionary
|
|
},
|
|
|
|
editUsers(dictionary) {
|
|
const deserializedDictionary = {
|
|
id: dictionary.id,
|
|
nameSl: dictionary.name_sl,
|
|
terminologyReviewFlag: dictionary.entries_have_terminology_review_flag,
|
|
languageReviewFlag: dictionary.entries_have_language_review_flag,
|
|
status: dictionary.status
|
|
}
|
|
|
|
return deserializedDictionary
|
|
},
|
|
|
|
editStructure(dictionary) {
|
|
const deserializedDictionary = {
|
|
id: dictionary.id,
|
|
nameSl: dictionary.name_sl,
|
|
hasDomainLabels: dictionary.entries_have_domain_labels,
|
|
hasLabel: dictionary.entries_have_label,
|
|
hasDefinition: dictionary.entries_have_definition,
|
|
hasSynonyms: dictionary.entries_have_synonyms,
|
|
hasLinks: dictionary.entries_have_links,
|
|
hasOther: dictionary.entries_have_other,
|
|
hasForeignLanguages: dictionary.entries_have_foreign_languages,
|
|
hasForeignDefinitions: dictionary.entries_have_foreign_definitions,
|
|
hasForeignSynonyms: dictionary.entries_have_foreign_synonyms,
|
|
hasImages: dictionary.entries_have_images,
|
|
hasAudio: dictionary.entries_have_audio,
|
|
hasVideo: dictionary.entries_have_videos
|
|
}
|
|
|
|
return deserializedDictionary
|
|
},
|
|
|
|
editDomainLabels(domainLabel) {
|
|
const deserializedDomainLabel = {
|
|
id: domainLabel.id,
|
|
name: domainLabel.name,
|
|
isVisible: domainLabel.is_visible
|
|
}
|
|
|
|
return deserializedDomainLabel
|
|
},
|
|
|
|
imports(oneImport) {
|
|
const deserializedImports = {
|
|
timeStarted: oneImport.time_started,
|
|
status: oneImport.status,
|
|
deleteExisting: oneImport.delete_existing_entries,
|
|
fileFormat: oneImport.file_format,
|
|
countValidEntries: oneImport.count_valid_entries
|
|
}
|
|
|
|
return deserializedImports
|
|
}
|
|
}
|
|
|
|
exports.bulkIndex = async (entries, primaryDomain, dictionary, source) => {
|
|
const entriesCount = entries.length
|
|
if (!entries.length) return
|
|
|
|
// Construct request body.
|
|
const bulkBody = new Array(entriesCount * 2)
|
|
for (let i = 0; i < entriesCount; i++) {
|
|
let entry = prepareEntryForIndexing(entries[i])
|
|
bulkBody[i * 2] = { index: { _index: ENTRY_INDEX, _id: entry.id } }
|
|
|
|
entry.primaryDomain = primaryDomain
|
|
entry.dictionary = dictionary
|
|
entry.source = source
|
|
entry = removeHtmlTags(JSON.stringify(entry))
|
|
bulkBody[i * 2 + 1] = entry
|
|
}
|
|
|
|
// Send the request.
|
|
const bulkResponse = await searchEngineClient.bulk({ body: bulkBody })
|
|
|
|
// Log possible errors.
|
|
if (bulkResponse.errors) {
|
|
const erroredDocuments = []
|
|
bulkResponse.items.forEach((action, i) => {
|
|
const operation = Object.keys(action)[0]
|
|
if (action[operation].error) {
|
|
erroredDocuments.push({
|
|
// If the status is 429 it means that you can retry the document,
|
|
// otherwise it's very likely a mapping error, and you should
|
|
// fix the document before to try it again.
|
|
status: action[operation].status,
|
|
error: action[operation].error,
|
|
operation: action[operation].body[i * 2],
|
|
document: action[operation].body[i * 2 + 1]
|
|
})
|
|
}
|
|
})
|
|
console.log('Errors indexing documents:') // eslint-disable-line no-console
|
|
console.log(erroredDocuments) // eslint-disable-line no-console
|
|
}
|
|
}
|
|
|
|
function prepareEntryForIndexing(entry) {
|
|
// Snake case property names into camel case.
|
|
entry.isValid = entry.is_valid
|
|
delete entry.is_valid
|
|
|
|
entry.isPublished = entry.is_published
|
|
delete entry.is_published
|
|
|
|
entry.isTerminologyReviewed = entry.is_terminology_reviewed
|
|
delete entry.is_terminology_reviewed
|
|
|
|
entry.isLanguageReviewed = entry.is_language_reviewed
|
|
delete entry.is_language_reviewed
|
|
|
|
entry.homonymSort = entry.homonym_sort
|
|
delete entry.homonym_sort
|
|
|
|
entry.timeMostRecentComment = entry.time_most_recent_comment
|
|
delete entry.time_most_recent_comment
|
|
|
|
entry.domainLabels = entry.domain_labels
|
|
delete entry.domain_labels
|
|
|
|
entry.foreignEntries = entry.foreign_entries
|
|
delete entry.foreign_entries
|
|
|
|
// Remove (top-level) properies with null or empty array values.
|
|
entry = Object.fromEntries(
|
|
Object.entries(entry).filter(
|
|
([_, v]) => v !== null && (!Array.isArray(v) || v.length)
|
|
)
|
|
)
|
|
|
|
return entry
|
|
}
|
|
|
|
exports.prepareEntryForIndexing = prepareEntryForIndexing
|