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

495 lines
11 KiB
JavaScript

const db = require('./db')
const { aggregateSettings, deserialize } = require('./helpers/portal')
const Portal = {}
Portal.fetchInstanceSettings = async () => {
const text = `
SELECT
name, value
FROM
instance_settings
WHERE
name
IN (
'portal_name_sl',
'portal_name_en',
'portal_code',
'portal_description_sl',
'portal_description_en',
'is_consultancy_enabled',
'is_dictionaries_enabled',
'is_extraction_enabled')`
const { rows: fetchedSettings } = await db.query(text)
const aggregatedSettings = aggregateSettings(fetchedSettings)
const deserializedSettings = deserialize.settings(aggregatedSettings)
return deserializedSettings
}
Portal.updateInstaceSettings = async payload => {
const isExtractionEnabled = payload.isExtractionEnabled ? 'T' : 'F'
const isDictionariesEnabled = payload.isDictionariesEnabled ? 'T' : 'F'
const isConsultancyEnabled = payload.isConsultancyEnabled ? 'T' : 'F'
const values = [
payload.portalNameSl,
payload.portalNameEn,
payload.portalCode,
payload.portalDescriptionSl,
payload.portalDescriptionEn,
isExtractionEnabled,
isDictionariesEnabled,
isConsultancyEnabled
]
const text = `
UPDATE
instance_settings
SET
value
= CASE name
WHEN
'portal_name_sl' THEN $1
WHEN
'portal_name_en' THEN $2
WHEN
'portal_code' THEN $3
WHEN
'portal_description_sl' THEN $4
WHEN
'portal_description_en' THEN $5
WHEN
'is_extraction_enabled' THEN $6
WHEN
'is_dictionaries_enabled' THEN $7
WHEN
'is_consultancy_enabled' THEN $8
ELSE value
END`
await db.query(text, values)
}
Portal.fetchInstanceDictSettings = async () => {
const text = `
SELECT
name, value
FROM
instance_settings
WHERE
name
IN (
'min_entries_per_dictionary',
'dictionary_publish_approval',
'num_of_history_entires_per_entry',
'can_publish_entries_in_edit')`
const { rows: fetchedSettings } = await db.query(text)
const aggregatedSettings = aggregateSettings(fetchedSettings)
const deserializedSettings = deserialize.dictSettings(aggregatedSettings)
return deserializedSettings
}
Portal.updateInstaceDictSettings = async payload => {
const dictionaryPublish = payload.dictionaryPublishApproval ? 'T' : 'F'
const canPublishEntriesInEdit = payload.canPublishEntriesInEdit ? 'T' : 'F'
const values = [
payload.minEntriesPerDictionary,
dictionaryPublish,
// payload.keepNumOfExportsPerDict,
// payload.dictionaryAutoSaveFrequency,
payload.numOfHistoryEntriesPerEntry,
canPublishEntriesInEdit
]
const text = `
UPDATE
instance_settings
SET
value
= CASE name
WHEN
'min_entries_per_dictionary' THEN $1
WHEN
'dictionary_publish_approval' THEN $2
WHEN
'num_of_history_entires_per_entry' THEN $3
WHEN
'can_publish_entries_in_edit' THEN $4
ELSE value
END`
await db.query(text, values)
}
Portal.fetchInstanceConsultancySettings = async () => {
const text = `
SELECT
name, value
FROM
instance_settings
WHERE
name
IN (
'consultancy_type',
'zrc_email',
'zrc_url')`
const { rows: fetchedSettings } = await db.query(text)
const aggregatedSettings = aggregateSettings(fetchedSettings)
const deserializedSettings = deserialize.consultSettings(aggregatedSettings)
return deserializedSettings
}
Portal.updateInstaceConsultancySettings = async payload => {
const values = [payload.consultancyType, payload.zrcEmail, payload.zrcURL]
const text = `
UPDATE
instance_settings
SET
value
= CASE name
WHEN
'consultancy_type' THEN $1
WHEN
'zrc_email' THEN $2
WHEN
'zrc_url' THEN $3
ELSE value
END`
await db.query(text, values)
}
Portal.create = async portal => {
const isEnabled = true
const values = [
portal.name,
portal.url_update,
portal.url_index,
portal.code,
isEnabled
]
const text = `
INSERT INTO linked_portal (
name,
url_update,
url_index,
code,
is_enabled
)
VALUES ($1, $2, $3, $4, $5)
RETURNING id`
const { rows } = await db.query(text, values)
return rows
}
Portal.fetchAll = async () => {
const text = `
SELECT
id,
name,
url_index,
is_enabled,
code,
time_last_synced,
EXISTS (SELECT ld.name
FROM linked_dictionary as ld
WHERE lp.id = ld.linked_portal_id) is_linked
FROM linked_portal as lp
ORDER BY id`
const { rows: fetchedConnections } = await db.query(text)
const deserializedConnections = fetchedConnections.map(connection =>
deserialize.connections(connection)
)
return deserializedConnections
}
Portal.fetchPortal = async portalId => {
const value = [portalId]
const text = `
SELECT
name,
url_update,
url_index,
code
FROM
linked_portal
WHERE
id = $1`
const { rows } = await db.query(text, value)
const fetchedPortal = rows[0]
const deserializedPortal = deserialize.connections(fetchedPortal)
return deserializedPortal
}
Portal.update = async (portalId, payload) => {
const values = [
payload.name,
payload.code,
payload.url_update,
payload.url_index,
portalId
]
const text = `
UPDATE
linked_portal
SET
name = $1,
code = $2,
url_update = $3,
url_index = $4
WHERE id = $5`
await db.query(text, values)
}
Portal.syncRemoteDictionaries = async (linkedPortalId, dictionaries) => {
const text = 'SELECT sync_remote_dictionaries($1, $2)'
const values = [linkedPortalId, dictionaries]
await db.query(text, values)
}
Portal.deleteLinkedDictionary = async linkedPortalId => {
const text = `DELETE from linked_portal WHERE id = $1`
const value = [linkedPortalId]
await db.query(text, value)
}
Portal.fetchDictionaries = async portalId => {
const value = [portalId]
const text = `
SELECT
name,
target_dictionary_id
FROM linked_dictionary
WHERE linked_portal_id = $1`
const { rows: fetchedDictionaries } = await db.query(text, value)
return fetchedDictionaries
}
Portal.fetchSelectedLinkedDictionaries = async (id, resultsPerPage, page) => {
const {
rows: [{ result }]
} = await db.query(
`
SELECT jsonb_build_object(
'pages_total', (
SELECT CEIL(COUNT(*) / $2::float)
FROM linked_dictionary
WHERE linked_dictionary.linked_portal_id = $1
),
'results', ARRAY(
SELECT jsonb_build_object(
'id', linked_dictionary.id,
'name', linked_dictionary.name,
'isEnabled', linked_dictionary.is_enabled,
'code', linked_portal.code
)
FROM linked_dictionary
LEFT JOIN linked_portal
ON linked_dictionary.linked_portal_id = linked_portal.id
WHERE linked_dictionary.linked_portal_id = $1
ORDER BY linked_dictionary.id
LIMIT $2
OFFSET $3
)
) result`,
[id, resultsPerPage, resultsPerPage * (page - 1)]
)
return result
}
Portal.updateSelectedDictionaries = async (id, body) => {
const portalId = id
let enableArr = body.isEnabled ? Object.keys(body.isEnabled) : []
const dbClient = await db.getClient()
try {
await dbClient.query('BEGIN')
const setAllToFalse = `
UPDATE linked_dictionary
SET is_enabled = false
WHERE linked_portal_id = $1`
await dbClient.query(setAllToFalse, [portalId])
enableArr = enableArr.map(
linkedDictionaryId => +linkedDictionaryId.replaceAll("'", '')
)
const text = `
UPDATE linked_dictionary
SET is_enabled = true
WHERE id = ANY ($1)
AND linked_portal_id = $2`
const values = [enableArr, portalId]
await dbClient.query(text, values)
await dbClient.query('COMMIT')
} catch (error) {
await dbClient.query('ROLLBACK')
throw error
} finally {
dbClient.release()
}
}
Portal.fetchAllLinkedDictionaries = async (resultsPerPage, page) => {
const {
rows: [{ result }]
} = await db.query(
`
SELECT jsonb_build_object(
'pages_total', (
SELECT CEIL(COUNT(*) / $1::float)
FROM linked_dictionary
),
'results', ARRAY(
SELECT jsonb_build_object(
'id', linked_dictionary.id,
'name', linked_dictionary.name,
'isEnabled', linked_dictionary.is_enabled,
'code', linked_portal.code
)
FROM linked_dictionary
LEFT JOIN linked_portal
ON linked_dictionary.linked_portal_id = linked_portal.id
ORDER BY linked_portal.id
LIMIT $1
OFFSET $2
)
) result`,
[resultsPerPage, resultsPerPage * (page - 1)]
)
return result
}
Portal.updateAllDictionaries = async body => {
const enableArr = Object.keys(body.isEnabled)
const dbClient = await db.getClient()
try {
await dbClient.query('BEGIN')
const setAllToFalse = `
UPDATE linked_dictionary
SET is_enabled = false`
await dbClient.query(setAllToFalse)
const enableAllDictionary = enableArr.map(async userId => {
userId = +userId.replaceAll("'", '')
const text = `
UPDATE linked_dictionary
SET is_enabled = true
WHERE id = $1`
const values = [userId]
await dbClient.query(text, values)
})
await Promise.all(enableAllDictionary)
await dbClient.query('COMMIT')
} catch (error) {
await dbClient.query('ROLLBACK')
throw error
} finally {
dbClient.release()
}
}
Portal.updatePortalStatus = async (portalId, isEnabled) => {
const values = [isEnabled, portalId]
const text = `
UPDATE linked_portal
SET is_enabled = $1
WHERE id = $2`
await db.query(text, values)
}
Portal.getInstanceSettingValue = async settingName => {
const values = [settingName]
const text = `
SELECT value
FROM instance_settings
WHERE name = $1`
const { rows } = await db.query(text, values)
const settingValue = rows[0].value
return settingValue
}
Portal.fetchAllInstanceSettingNames = async () => {
const { rows } = await db.query('SELECT name FROM instance_settings')
const settingNames = rows.map(row => row.name)
return settingNames
}
Portal.getSlovenianLanguageId = async () => {
const { rows } = await db.query("SELECT id FROM language WHERE code = 'sl'")
const id = rows[0].id
return id
}
Portal.getSearchAggregateNames = async (
primaryDomainIds,
dictionaryIds,
languageIds
) => {
const text = `
SELECT jsonb_build_object(
'primaryDomains', jsonb_object(
ARRAY(
SELECT ARRAY [id, name_sl]::TEXT[]
FROM domain_primary
WHERE id = ANY ($1)
)
),
'dictionaries', jsonb_object(
ARRAY(
SELECT ARRAY [id, name_sl]::TEXT[]
FROM dictionary
WHERE id = ANY ($2)
)
),
'languages', jsonb_object(
ARRAY(
SELECT ARRAY [id, name_sl]::TEXT[]
FROM language
WHERE id = ANY ($3)
)
)
) "names"
`
const values = [primaryDomainIds, dictionaryIds, languageIds]
const {
rows: [{ names }]
} = await db.query(text, values)
return names
}
module.exports = Portal