71 lines
2.2 KiB
JavaScript
71 lines
2.2 KiB
JavaScript
const cds = require ('@sap/cds')
|
|
const READ='READ', WRITE = ['CREATE','UPDATE']
|
|
|
|
const intercept = exports.intercept = cds.service.impl (async (srv) => {
|
|
|
|
for (let each in srv.entities) {
|
|
|
|
// intercept JSON-encoded elements
|
|
const jsons = await jsonsIn (srv.entities[each].elements)
|
|
if (jsons) {
|
|
srv.before (WRITE, each, ({data:row})=>{
|
|
for (let e of jsons) if (row[e]) row[e] = JSON.stringify (row[e])
|
|
})
|
|
srv.after (READ, each, (row)=>{
|
|
for (let e of jsons) if (row[e]) row[e] = JSON.parse (row[e])
|
|
})
|
|
}
|
|
|
|
// intercept references
|
|
const refs = await refsIn (srv.entities[each].elements, srv.model)
|
|
if (refs) srv.after (READ, each, (rows, req)=>{
|
|
for (let row of rows) {
|
|
for (let {element,codelist} of refs) {
|
|
const entry = codelist [row[element]]
|
|
if (entry) {
|
|
const localized = entry.texts [req.user.locale || intercept.locale]
|
|
row[element] = localized ? localized.name : entry.name
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
function jsonsIn (elements) {
|
|
const jsons=[]; for (let e in elements) {
|
|
if (elements[e]['@JSON']) jsons.push(e)
|
|
}
|
|
return jsons.length && jsons
|
|
}
|
|
|
|
async function refsIn (elements, model) {
|
|
const refs=[]; for (let e in elements) {
|
|
const $ref = elements[e]['@ref']
|
|
if ($ref) {
|
|
const d = model.definitions [$ref['=']]
|
|
refs.push({
|
|
element:e,
|
|
codelist: CodeLists[d.name] || (CodeLists[d.name] = await load(d))
|
|
})
|
|
}
|
|
}
|
|
return refs.length && refs
|
|
}
|
|
|
|
const load = exports.load = async (codelist) => {
|
|
const all = {}
|
|
const [entries,texts] = await Promise.all ([
|
|
SELECT.from (codelist),
|
|
SELECT.from (codelist.elements.texts.target)
|
|
])
|
|
for (let {code,name,descr} of entries) all[code] = {name,descr}
|
|
for (let {code,locale,name,descr} of texts) (all[code].texts || (all[code].texts={})) [locale] = {name,descr}
|
|
return all
|
|
}
|
|
|
|
const CodeLists = {}
|