apxtrib/src/models/Referentialssave.js

236 lines
7.9 KiB
JavaScript
Executable File

const glob = require('glob')
const path = require('path')
const fs = require('fs-extra')
// Check if package is installed or not to pickup the right config file
const config = require('../tribes/townconf.js')
const logger = require('../core/logger')
const Referentials = {}
/*
Manage Referential object data
each object is compose of a list of fields
each fields have it owns structur and check
those common rules allow to be used to manage:
- forms (creation to collect data)
- data check
- data access rights
common referential data stored in /data/shared/referential/
*/
Referentials.clientconf = (xworkOn, listkey) => {
/*
Retourne les info d'un clientconf.json sur une liste de [cle]
*/
let conf = {}
const dataconf = {}
logger.info(`${config.tribes}/${xworkOn}/clientconf.json`)
try {
conf = fs.readJsonSync(`${config.tribes}/${xworkOn}/clientconf.json`);
// remove information notrelevant for
['emailFrom', 'emailClient', 'emailCc', 'commentkey', 'clezoomprivate', 'stripekeyprivate', 'genericpsw'].forEach(c => {
delete conf[c]
})
listkey.forEach(k => dataconf[k] = conf[k])
logger.info('dataconf', dataconf)
} catch (err) {
logger.info('Attention demande sur clienId inconnu ' + xworkOn)
}
return {
status: 200,
payload: {
data: dataconf
}
}
}
Referentials.clientconfglob = () => ({
status: 200,
payload: {
data: fs.readJsonSync(`${config.tmp}/clientconfglob.json`)
}
})
Referentials.inittribeid = () => {
logger.info('Clientconf list for this server', `${config.tribes}/**/clientconf.json`)
const TribesGlobalConfig = glob.sync(`${config.tribes}/**/clientconf.json`)
.map(f => fs.readJsonSync(f))
// store global conf for sharing to other api
fs.outputJsonSync(`${config.tmp}/clientconfglob.json`, TribesGlobalConfig, {
spaces: 2
})
return { status: 200, payload: { moreinfo: TribesGlobalConfig } }
}
Referentials.generetribeids = () => {
const tribeids = []
fs.readJsonSync(`${config.tmp}/clientconfglob.json`)
.forEach(c => {
if (!tribeids.includes(c.tribeid)) tribeids.push(c.tribeid)
})
fs.outputJsonSync(`${config.tmp}/tribeids.json`, tribeids)
logger.info(`update ${config.tribes}/tribeids`)
return tribeids
}
Referentials.genereallowedDOM = () => {
const confglob = fs.readJsonSync(`${config.tmp}/clientconfglob.json`)
let allDom = []
confglob.forEach(c => {
c.allowedDOMs.forEach(d => {
if (!allDom.includes(d)) allDom = allDom.concat(d)
})
})
return allDom
}
Referentials.getref = (source, ref, xworkOn, xlang, singlelang = true) => {
let referent = {}
let src = `${config.tribes}/${xworkOn}/referentials/${xlang}/${source}/${ref}.json`
if (!singlelang) {
// request full referential to manage
src = `${config.tribes}/${xworkOn}/referentials/dataManagement/${source}/${ref}.json`
}
logger.info(src)
try {
referent = fs.readJsonSync(src)
} catch (err) {
logger.info(`Attention demande de referentiel inexistant pour ${src} `)
}
return {
status: 200,
payload: {
data: referent
}
}
}
Referentials.putref = (source, name, xworkOn, data) => {
/*
We get a referential, we have 3 kinds of sources:
* data = [{uuid,desc:{fr:,en,},desclong:{fr:,en:}, other field}]
only desc and desclong have a translation
* json = {"fr":{},"en":{}, ...} are full complex object in language
* object = [{uuid,desc:{fr,en},desclong:{fr,en}},tpl,}]
Difference between data and object is that object defines rule to manage an object, and how to create a forms to get data each data is saved in one folder object/uuid.json and have to respect the corresponding object referentials definition.
*/
logger.info(data)
// Create a backup of the day hour if exist
const file = `${config.tribes}/${xworkOn}/referentials/dataManagement/${source}/${name}.json`
if (fs.existsSync(file)) {
// backup change done per hour
const origin = fs.readJsonSync(file, 'utf-8')
fs.outputJsonSync(`${config.tribes}/${xworkOn}/referentials/dataManagementBackup/${source}/${name}${moment().format('YYYYMMDDHHmm')}.json`, origin, { spaces: 2 })
} else {
logger.info(`Referential ${name}.json does not exist this created it`)
}
logger.info('ref backup before update', name)
fs.outputJsonSync(file, data, { spaces: 2 })
// update/create new referential and new version
return Referentials.update(xworkOn, source, name)
}
Referentials.updatefull = (tribeid) => {
// source json are only per lg so no full update for json
let err = '';
['object', 'data'].forEach(o => {
glob.sync(`${config.tribes}/${tribeid}/referentials/dataManagement/${o}/*.json`)
.forEach(f => {
if (finipaspar_lg) {
const res = Referentials.update(tribeid, o, path.basename(f, '.json'))
if (res.status !== 200) {
err += `Error on ${o}/${path.basename(f)}`
}
}
})
})
if (err !== '') {
return { status: 500, payload: { info: ['Errupdateref'], model: 'Referentials', moreinfo: err } }
}
return { status: 200, payload: { info: ['Success'], model: 'Referentials' } }
}
Referentials.update = (tribeid, source, name) => {
/*
Replace for each language the referential name for a tribeid
After each update the version number is incremented by 1 in clientconf.json
*/
if (!fs.existsSync(`${config.tribes}/${tribeid}/referentials/${source}/${name}.json`)) {
return {
status: 500,
payload: {
info: ['unknownRef'],
model: 'Referentials',
moreinfo: `file does not exist ${config.tribes}/${tribeid}/referentials/${source}/${name}.json`
}
}
}
;
const clientconf = fs.readJsonSync(`${config.tribes}/${tribeid}/clientconf.json`)
if (!clientconf.langueReferential) {
return {
status: 500,
payload: {
info: ['missingConf'],
model: 'Referentials',
moreinfo: ` ${config.tribes}/${tribeid}/clientconf.json does not contain langueReferential array`
}
}
}
const ref = fs.readJsonSync(`${config.tribes}/${tribeid}/referentials/${source}/${name}.json`)
clientconf.langueReferential.forEach(lg => {
/* if( !fs.existsSync( `${config.tribes}/${tribeid}/referentials/${lg}` ) ) {
[ '', '/data', '/json', '/object' ].forEach( p => {
fs.mkdirSync( `${config.tribes}/${tribeid}/referentials/${lg}${p}` );
} )
}
*/
// manage translation
let refnew = []
if (source === 'json') {
refnew = ref[lg]
} else {
refnew = []
ref.forEach(d => {
if (d.desc) d.desc = d.desc[lg]
if (d.desclong) d.desclong = d.desclong[lg]
if (d.info) d.info = d.info[lg]
if (d.placeholder) d.placeholder = d.placeholder[lg]
refnew.push(d)
})
}
// save new ref in language
logger.info('testtttt', refnew)
logger.info(`${config.tribes}/${tribeid}/referentials/${source}/${name}_${lg}.json`)
fs.outputJsonSync(`${config.tribes}/${tribeid}/referentials/${source}/${name}_${lg}.json`, refnew, {
spaces: 2
})
})
// upgrade version number
if (!clientconf.referentials[source][name]) clientconf.referentials[source][name] = { version: 0 }
clientconf.referentials[source][name].version += 1
return {
status: 200,
payload: {
info: ['successUpdate'],
model: 'Referentials',
moreinfo: `${name} updated`
}
}
}
// logger.info( Referentials.update( 'apixtribe', "object", "user" ) )
Referentials.genereobjet = (tribeid, destination, tplmustache, objet, filtre) => {
/* @TODO
Genere des objets d'agregat
@tribeid = data/tribee/ identifiant client
@destinations = [] of destination
@tplmustache = fichier mustache de mise en page
@objet = nom d'objet contact, companies, items, users
@filtre = fonction a executer
*/
}
module.exports = Referentials