Initial commit
This commit is contained in:
@@ -0,0 +1,486 @@
|
||||
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',
|
||||
'portal_code',
|
||||
'portal_description',
|
||||
'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.portalName,
|
||||
payload.portalCode,
|
||||
payload.portalDescription,
|
||||
isExtractionEnabled,
|
||||
isDictionariesEnabled,
|
||||
isConsultancyEnabled
|
||||
]
|
||||
|
||||
const text = `
|
||||
UPDATE
|
||||
instance_settings
|
||||
SET
|
||||
value
|
||||
= CASE name
|
||||
WHEN
|
||||
'portal_name' THEN $1
|
||||
WHEN
|
||||
'portal_code' THEN $2
|
||||
WHEN
|
||||
'portal_description' THEN $3
|
||||
WHEN
|
||||
'is_extraction_enabled' THEN $4
|
||||
WHEN
|
||||
'is_dictionaries_enabled' THEN $5
|
||||
WHEN
|
||||
'is_consultancy_enabled' THEN $6
|
||||
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
|
||||
Reference in New Issue
Block a user