1
0
forked from apxtri/apxtri
apxtri/models/Odmdb.js
2024-06-10 08:26:45 +02:00

1114 lines
98 KiB
JavaScript

const glob = require("glob");
const path = require("path");
const fs = require("fs-extra");
const dayjs = require("dayjs");
const axios = require("axios");
const conf = require(`../../../conf.json`);
const Checkjson = require(`./Checkjson.js`);
const { promiseHooks } = require("v8");
const currentmod = "Odmdb";
const log = conf.api.activelog.includes(currentmod);
/**
* This manage Objects for indexing, searching, checking and act to CRUD
* @objectPathName = objectpath/objectname
* objectpath/objectname/conf.json
* /idx/all_key1.json = {key1value:{object}}
* lst_key1.json = [key1valA,key1val2,...]
* key2_key1.json = {key2value:[key1value]}
* all_key1_filtername = {key1value:{object}}
* /itm/apxidvalue.json
* in conf.json:
* {
* "name": "object name ex:'nations'",
* "schema": "relativ schema from dirapi dirtown ex:'adminapi/schema/nations.json'"",
* "lastupdateschema": 0, time stamp last schema update
* "lastupdatedata":0 time stamp last itm update
* }
*
* Specifics key in schema to apxtri:
* apxid : the field value to use to store item apx
* apxuniquekey : list of field that has to be unique you cannot have 2 itm with same key value
* apxidx : list of index file /idx/
* { "name":"lst_fieldA", "keyval": "alias" }, => lst_fieldA.json = [fieldAvalue1,...]
{ "name":"all_fieldA", "keyval": "fieldA" }, => all_fieldA.json =
if fieldA in apxuniquekey = {fieldAvalue1:{object}}
not in apxuniquekey = {fieldAvalue1:[{object}]}
{ "name":"word_fieldA", "keyval": "fieldA", "objkey": ["fieldB"]}, => word_fieldA.json
if fieldA in apxuniquekey = {fieldAvalue1:fieldBvalue,}
if fieldA not in uniquekey = {fieldAvalue1: [fieldBv1,fieldBv2,]}
{ "name":"word_fieldA", "keyval": "fieldA", "objkey": ["fieldB","fieldC"]}, => word_fieldA.json
if fieldA in apxuniquekey = {fieldAvalue1:{fieldB:val,fieldC:val},}
if fieldA not in uniquekey = {fieldAvalue1: [{fieldB:val,fieldC:val},]}
* apxaccessrights : list of profil with CRUD accesrights
**/
const Odmdb = {};
/**
*const Checkjson = require(`../../../adminapi/apxtri/models/Checkjson`);
@api syncObject
* @param {string} url to an existing object conf (/objectname/conf.json)
* @param {timestamp} timestamp
* 0 => rebuild local object from all_{idapx}.json
* >0 => update itm and idx search by datetime
* @param
*/
Odmdb.syncObject = () => {};
/**
* @api createObject: create a space to host object
*
* @source {string} "new", url,
* @schemapath {string} path to create or replace a schema ${schemaPath}/schema/
* @objectPath {string} path where object are store
* @objectName {string} name of the object
* @schema {object} the json schema for this object
* @lgjson {object} the json file for a specific language
* @lg {string} the 2 letters language
*
* Setup a new object localy =>
* source
*
* - from scratch =>
* Create
* - from a synchronization
* Download from source all_{apxid}.json
*
*
*/
Odmdb.createObject = (
source,
schemaPath,
objectPath,
objectName,
schema,
lgjson,
lg
) => {
if (!fs.existsSync(schemaPath)) {
return {
status: 404,
ref: "Odmdb",
info: "pathnamedoesnotexist",
moreinfo: { fullpath: schemaPath },
};
}
if (!fs.existsSync(objectPath)) {
return {
status: 404,
ref: "Odmdb",
info: "pathnamedoesnotexist",
moreinfo: { fullpath: objectPath },
};
}
// store schema file if not empty undefined or {}
if (
schema &&
!(Object.keys(schema).length === 0 && schema.constructor === Object)
) {
fs.outputJSONSync(`${schemaPath}/schema/${objectName}.json`, schema, {
spaces: 2,
});
}
if (
lgjson &&
lg &&
!(Object.keys(lgjson).length === 0 && lgjson.constructor === Object)
) {
fs.outputJSONSync(`${schemaPath}/lg/${objectName}_${lg}.json`, lgjson, {
spaces: 2,
});
}
//create environnement object with the new schema config
if (!fs.existsSync(`${objectPath}/${objectName}`)) {
fs.outputJsonSync(
`${objectPath}/${objectName}/idx/confjson`,
{ schema: `${schemaPath}/schema/${objectName}.json` },
{ spaces: 2 }
);
}
return { status: 200 };
};
/**
* Update an object
* @param {string} objectPathname
* @param {object} meta update request
* lg:
* lgobj: object to store in /lg/objectname_lg.json
* schema: an update schema
* @return {status, ref:"Odmdb", msg:"", data}
*
* Create a tmp object env and check existing object to identify any issues
* If all is fine then apply change by replacing
*/
Odmdb.updateObject = (objectPathname, meta) => {};
/**
* Get a schema from objectPathname
*
* todo only local schema => plan a sync each 10minutes
* @schemaPath local path adminapi/schema/objectName.json or /tribename/schema/objectName
* @validschema boolean if necessary to check schema or not mainly use when change schema;
* @lg language you want to get schema
* @return {status:200,data:{conf:"schemaconf",schema:"schemacontent"} }
*/
Odmdb.Schema = (objectPathname, validschema, lg = "en") => {
const replacelg = (data) => {
// data.en version schema de base, data.fr version schema traduite
Object.keys(data.lg).forEach((k) => {
console.log(k);
if (data.lg[k].title) data.en[k].title = data.lg[k].title;
if (data.lg[k].description)
data.en[k].description = data.lg[k].description;
if (data.lg.properties) {
console.log("properties");
console.log(data.en.properties);
console.log(data.lg.properties);
const res = replacelg({
en: data.en.properties,
lg: data.lg.properties,
});
data.lg.properties = res.lg;
data.en.properties = res.en;
}
});
return data;
};
const getschemalg = (schemaPath, lg) => {
if (schemaPath.slice(-5) != ".json") schemaPath += ".json";
if (schemaPath.substring(0, 4) == "http") {
// lance requete http pour recuperer le schema avec un await axios
} else {
schemaPath = `../../${schemaPath}`;
if (log)
console.log(
currentmod,
"resolve path schemaPath:",
path.resolve(schemaPath)
);
if (!fs.existsSync(schemaPath)) {
return {};
} else {
let schemalg = fs.readJsonSync(schemaPath);
if (lg != "en") {
let lgtrans = {};
try {
lgtrans = fs.readJsonSync(
schemaPath
.replace("/schema/", "/schema/lg/")
.replace(".json", `_${lg}.json`)
);
const res = replacelg({ en: schemalg, lg: lgtrans });
//console.log(res.en.title,res.lg.title)
schemalg = res.en;
} catch (err) {
// console.log('Err',err)
// no translation file deliver en by default
}
}
return schemalg;
}
}
};
const convoptionstoenum = (propertie, lg) => {
if (!propertie.options) return propertie;
if (!propertie.options["$ref"]) {
propertie.msg = "missingref";
return propertie;
}
let optionsfile;
let optionstype;
if (propertie.options["$ref"].includes("/options/")) {
propertie.comment = `options:${propertie.options["$ref"]}}`;
optionstype = "options";
optionsfile = path.resolve(
`../../${propertie.options["$ref"]}_${lg}.json`
);
}
if (propertie.options["$ref"].includes("/idx/")) {
(propertie.comment = `itms:${propertie.options["$ref"]}}`),
(optionstype = "idx");
optionsfile = path.resolve(`../../${propertie.options["$ref"]}.json`);
}
if (log) console.log(currentmod, "Lien vers options:", optionsfile);
if (!fs.existsSync(optionsfile)) {
propertie.msg = "missingref";
return propertie;
} else {
delete propertie.options;
if (optionstype == "options") {
propertie.enum = fs.readJSONSync(optionsfile).lst_idx;
}
if (optionstype == "idx") {
propertie.enum = fs.readJSONSync(optionsfile);
}
}
return propertie;
};
if (log) console.log(currentmod, `${objectPathname}/conf.json`);
const res = {
status: 200,
ref: "Odmdb",
msg: "getschema",
data: {},
};
if (fs.existsSync(`${objectPathname}/conf.json`)) {
res.data.conf = fs.readJsonSync(`${objectPathname}/conf.json`);
res.data.schema = getschemalg(res.data.conf.schema, lg);
} else {
res.data.conf = {};
}
if (!res.data.schema || Object.keys(res.data.schema).length == 0) {
return {
status: 404,
ref: "Odmdb",
msg: "schemanotfound",
data: { objectPathname: path.resolve(objectPathname), schema: {} },
};
}
// get $ref from $def
if (res.data.schema["$defs"]) {
Object.keys(res.data.schema["$defs"]).forEach((ss) => {
Object.keys(res.data.schema["$defs"][ss].properties).forEach((pp) => {
res.data.schema["$defs"][ss].properties[pp] = convoptionstoenum(
res.data.schema["$defs"][ss].properties[pp],
lg
);
});
});
}
Object.keys(res.data.schema.properties).forEach((p) => {
if (
res.data.schema.properties[p].type == "object" &&
res.data.schema.properties[p]["$ref"]
) {
let subschema;
const localdef = res.data.schema.properties[p]["$ref"].includes("#/");
if (
localdef &&
!(
res.data.schema["$defs"] &&
res.data.schema["$defs"][propertie["$ref"]]
)
) {
res.status = 404;
res.msg = "missinglocalref";
res.data.missingref = propertie;
return res;
}
if (localdef) {
res.data.schema.properties[p] =
res.data.schema["$defs"][res.data.schema.properties[p]["$ref"]];
} else {
subschema = Odmdb.Schema(
path.resolve(res.data.schema.properties[p]["$ref"]),
validschema,
lg
);
if (subschema.status == 200) {
res.data.schema.properties[p] = subschema.data.schema;
} else {
subschema.data.originschemaproperty = p;
return subschema;
}
}
}
if (res.data.schema.properties[p].options) {
//remplace options par enum:[]
res.data.schema.properties[p] = convoptionstoenum(
res.data.schema.properties[p],
lg
);
}
});
if (!res.data.schema.apxid) {
return {
status: 406,
ref: "Odmdb",
msg: "missingprimarykey",
data: {},
};
}
if (res.data.schema.apxidx) {
//add apxidx to apxuniquekey in case not
if (!res.data.schema.apxuniquekey) {
return {
status: 406,
ref: "Odmdb",
msg: "missingapxuniquekey",
data: {},
};
}
if (!res.data.schema.apxuniquekey.includes(res.data.schema.apxid)) {
res.data.schema.apxuniquekey.push(res.data.schema.apxid);
}
//`../../${req.session.header.xtribe}/objects/persons`
res.data.schema.apxidx.forEach((idx) => {
if (
idx.objkey &&
!res.data.schema.apxuniquekey.includes(idx.keyval) &&
!idx.objkey.includes(res.data.schema.apxid)
) {
return {
status: 406,
ref: "Odmdb",
msg: "unconsistencyapxidx",
data: {
name: idx.name,
keyval: idx.keyval,
objkey: idx.objkey,
apxid: res.data.schema.apxid,
},
};
}
});
}
if (validschema || 1 == 1) {
// return {status:200, ref, msg} or {status!:200,multimsg:[{ref,msg;data}]}
const check = Checkjson.schema.validation(res.data.schema);
if (check.status != 200) {
res.multimsg = check.multimsg;
res.status = check.status;
}
}
return res;
};
Odmdb.search = (objectPathname, objsearch, role) => {
/*
if (fields exist):
return data:{id:{field:value}]}
else:
return data:[id]
exemple:
objsearch= {
apxid:['toto','titi'],fields:['firstname']
}
return data:{toto:{firstname:"Paul"},titi:"fistname:"Jacques"}
ADD HERE OTHER OPTION USING IDX FOR PERFORMANCE
example: search exact match hill in townId
heavy search={txt:"hill",algo:"match",fieldstring:"toxnId"}
light search={txt:"hill", algo:"match", indexfilter:{"key":"townId","value":[]}}
light search={txt:"hill", algo:"match", indexfilter:{"key":"nationId","value":"ants"}}
*/
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
//console.log(getschema.data);
const apxid = getschema.data.schema.apxid;
let subsearch = objsearch.apxid
? objsearch.apxid
: fs.readJSONSync(`${objectPathname}/idx/lst_${apxid}.json`);
// ADD HERE OTHER FILTRATION SEARCH depending of question
if (objsearch.condition) {
// remove or add in subsearch
}
if (objsearch.fields) {
const resultat = {};
//console.log(getschema.data.schema.apxaccessrights);
//console.log(role);
const accessright = Odmdb.accessright(
getschema.data.schema.apxaccessrights,
role
);
//console.log(accessright);
if (objsearch.fields == "all") {
//console.log(getschema.data)
objsearch.fields = Object.keys(getschema.data.schema.properties);
}
const ifields = {};
subsearch.forEach((i) => {
const ifields = {};
if (fs.existsSync(`${objectPathname}/itm/${i}.json`)) {
const itm = fs.readJSONSync(`${objectPathname}/itm/${i}.json`);
if (itm.owner && itm.owner == role.xalias) {
role.xprofils.push("owner");
} else {
role.xprofils = role.xprofils.filter((e) => e !== "owner");
}
objsearch.fields.forEach((f) => {
if (accessright.R.length == 0 || accessright.R.includes(f)) {
ifields[f] = itm[f];
} else {
//ifields[f] = "unauthorized";
}
});
} else {
ifields.notfound = true;
}
resultat[i] = ifields;
});
return {
status: 200,
ref: "Odmdb",
msg: "resultsearchlist",
data: resultat,
};
} else {
return {
status: 200,
ref: "Odmdb",
msg: "resultsearchlist",
data: [subsearch],
};
}
};
Odmdb.r = (objectPathname, apxid, role) => {
const itmf = `${objectPathname}/itm/${apxid}.json`;
if (!fs.existsSync(itmf)) {
return {
status: 404,
ref: "Odmdb",
msg: "persondoesnotexist",
data: { person: apxid },
};
}
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
const itm = fs.readJsonSync(itmf);
if (itm.owner && itm.owner == role.xalias) {
role.xprofils.push("owner");
}
const accessright = Odmdb.accessright(
getschema.data.schema.apxaccessrights,
role
);
if (!accessright.R) {
return {
status: 403,
ref: "Odmdb",
msg: "profilnotallow",
data: { person: apxid },
};
}
const data = {};
accessright.R.forEach((p) => {
data[p] = itm[p];
});
return { status: 200, ref: "Odmdb", msg: "profilallow", data };
};
/**
* To get an array of item (itm) per primarykey with a list of field
* Object are store in objectPath/objectName/conf.json contain
*
* @objectPathname where object are store (where /object/conf.json indicate where the schema is)
* @uuidprimarykeyList list of uuid requested
* @role {xalias,xprofiles} allow to get accessright come from header
* @propertiesfilter (optionnal) key to return for each object (if undefined then return all)
* @Return {status:200; data:{uuid:{data filter by @propertiesfilter},uuid:"notfound"}}
ASUP doit être gerer au niveau des view des index
*/
Odmdb.ASUPreads = (objectPathname, apxidlist, role, propertiesfilter) => {
const res = { status: 200, data: {} };
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
// Test if readable at least if owner
role.xprofils.push("owner");
const accessright = (Odmdb.accessright =
(getschema.data.schema.apxaccessright, role.xprofils));
if (!accessright.R) {
return {
status: 403,
ref: "Odmdb",
msg: "profilnotallow",
data: { crud: "R", accessright },
};
}
apxidlist.forEach((id) => {
if (fs.existsSync(`${objectPathname}/itm/${id}.json`)) {
const objectdata = fs.readJsonSync(`${objectPathname}/itm/${id}.json`);
if (objectdata.owner && objectdata.owner == role.xalias) {
if (!role.xprofils.includes("owner")) role.xprofils.push("owner");
} else {
if (role.xprofils.includes("owner"))
role.xprofils = role.xprofils.filter((e) => e !== "owner");
}
const accessright = Odmdb.accessright(
getschema.data.schema.apxaccessright,
role
);
if (!accessright.R) {
res.data[id] = "forbiden";
} else {
let newpropertiesfilter = Object.keys(objectdata);
if (accessright.R.length > 0) {
const setaccess = new Set(accessright.R);
if (!propertiesfilter) propertiesfilter = Object.keys(objectdata);
newpropertiesfilter = propertiesfilter.filter((f) =>
setaccess.has(f)
);
}
const objinfo = {};
newpropertiesfilter.forEach((k) => {
if (objectdata[k]) objinfo[k] = objectdata[k];
});
res.data[id] = objinfo;
}
} else {
res.data[id] = "notfound";
}
});
return res;
};
/**
* Convert profils in accessright
* @param {*} apxaccessright from schema object {profilname:{R}}
* @param {*} role {xprofils,xalias} accessible after isAuthenticated
* @returns access right to C create if present, to read (properties list or all if empty), to Update properties list or all if empty, D elete
* example: {"C":[],"R":[properties list],"U":[properties ist],"D":[]}
*/
Odmdb.accessright = (apxaccessrights, role) => {
//if (log) console.log(currentmod,"apxaccessrights",apxaccessrights)
//if (log) console.log(currentmod,"role",role)
const accessright = {};
console.log();
role.xprofils.forEach((p) => {
if (apxaccessrights[p]) {
Object.keys(apxaccessrights[p]).forEach((act) => {
if (!accessright[act]) {
accessright[act] = apxaccessrights[p][act];
} else {
if (accessright[act].length != 0) {
//case where [] that mean all accessright on any properties
accessright[act] = [
...new Set([...accessright[act], ...apxaccessrights[p][act]]),
];
}
}
//if (log) console.log(currentmod,act,accessright[act])
});
}
});
return accessright;
};
/**
* CUD a data itm into objectPathname if checkJson is valid
* and update idx
* idx is upto date for unique properties but not for list
* @param {string} objectpathname folder name where object are stored
* @param {object} itm an object respecting the checkJson schema in objectPathname/conf.json
* @param {string} crud: C reate U pdate D elete
* @param {array} role {xprofils,xalias} xprofils list of profils like anonymous,pagans, person owner is deuce if object properties owner is alias
* */
Odmdb.cud = (objectPathname, crud, itm, role, runindex = true) => {
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
if (!itm[getschema.data.schema.apxid]) {
return {
status: 406,
ref: "Odmdb",
msg: "apxidmissing",
data: { missingkey: getschema.data.schema.apxid },
};
}
fs.ensureDirSync(`${objectPathname}/itm/`);
fs.ensureDirSync(`${objectPathname}/idx/`);
const existid = fs.existsSync(
`${objectPathname}/itm/${itm[getschema.data.schema.apxid]}.json`
);
if (log) console.log(currentmod, "Pass schema itm existid = ", existid);
/*const pathindex = `${objectPathname}/idx/lst_${getschema.data.schema.apxid}.json`;
if (!fs.existsSync(pathindex)) {
fs.outputJSONSync(pathindex, []);
fs.ensureDirSync(`${objectPathname}/itm/`);
}
const existid = fs
.readJSONSync(pathindex)
.includes(itm[getschema.data.schema.apxid]);
*/
if (existid && crud == "C") {
return {
status: 406,
ref: "Odmdb",
msg: "alreadyexist",
data: {
objectname: path.basename(objectPathname),
key: getschema.data.schema.apxid,
val: itm[getschema.data.schema.apxid],
},
};
}
if (!existid && ["U", "D"].includes(crud)) {
return {
status: 404,
ref: "Odmdb",
msg: "doesnotexist",
data: {
objectname: path.basename(objectPathname),
key: getschema.data.schema.apxid,
val: itm[getschema.data.schema.apxid],
},
};
}
const feedbackinfo = {};
const itmold = existid
? fs.readJSONSync(
`${objectPathname}/itm/${itm[getschema.data.schema.apxid]}.json`
)
: {};
if (existid && itmold.owner && itmold.owner == role.xalias) {
role.xprofils.push("owner");
}
if (!existid && crud == "C" && !itm.owner) {
// set owner cause this is a Create
itm.owner = role.xalias;
role.xprofils.push("owner");
}
//get accessright {C:[],R:[],U:[],D:[]} if exist means authorize, if array contain properties (for R and U) right is only allowed on properties
const accessright = Odmdb.accessright(
getschema.data.schema.apxaccessrights,
role
);
if (log) console.log(currentmod, "Accessright to: ", accessright);
if (getschema.data.schema.apxaccessrights.contextrules) {
//Need to check context to validate accessright
//require('../../')
}
if (
(crud == "C" && !accessright.C) ||
(crud == "D" && !accessright.D) ||
(crud == "U" && !accessright.U)
) {
if (log) console.log(currentmod, "Forbidden accessright:", accessright);
return {
status: 403,
ref: "Odmdb",
msg: "profilnotallow",
data: { crud, accessright },
};
}
//delete or save
if (crud == "D") {
itmold["dt_delete"] = dayjs().toISOString();
fs.outputJSONSync(
`${objectPathname}/delitm/${itmold[getschema.data.schema.apxid]}.json`,
itmold
);
fs.rmSync(
`${objectPathname}/itm/${itmold[getschema.data.schema.apxid]}.json`
);
} else {
// if Create Update erase old version
let itmtostore = itm;
if (crud == "U" && accessright.U.length > 0) {
itmtostore = itmold;
const keynotallow = Object.keys(itm).filter(
(el) => !accessright.U.includes(el)
);
if (keynotallow.length > 0) {
feedbackinfo.keynotallow = keynotallow;
}
accessright.U.forEach(async (p) => {
itmtostore[p] = itm[p];
});
itmtostore.dt_update = dayjs().toISOString();
}
Object.keys(itmtostore).forEach((k) => {
//Manage base64 case image to convert ans store in webp
if (k.includes("imgbase64_") && itmtostore[k] != "") {
fs.ensureDirSync(`${objectPathname}/img/`);
const imgb64 = itmtostore[k].replace(/^data:image\/(png|png|gif|bmp|jpg|jpeg);base64,/,"");//.replace(/\+/g," ");
const extension = itmtostore[k].split(";base64,")[0].split("/")[1];
const newk = k.split("_").slice(1).join("_");
const filenameimg = `/img/${
itmtostore[getschema.data.schema.apxid]
}_${newk}.${extension}`;
if (!getschema.data.schema.properties[newk]) {
if (log)
console.log(
currentmod,
" Check your schema it miss a propertie because imgbase64_blabla must have a blabla propertie to host the pathfile image"
);
} else {
const objectname = objectPathname.split("/").slice(-1)[0];
itmtostore[newk] = `/objectimg/${objectname}${filenameimg}`;
//const webp = require("webp-converter");
//const buf = Buffer.from(itmtostore[k], 'base64');
//const imgwebp = await webp.bufferToWebp(buf);
//@TODO use sharp to resize img with attribut sizeHW in propertie
fs.writeFileSync(`${objectPathname}/${filenameimg}`, imgb64,{encoding:"base64"});
itmtostore[k] = "";
}
}
});
if (crud == "C") itmtostore.dt_create = dayjs().toISOString();
// check consistency of datatostore
const chkdata = Checkjson.schema.data(
getschema.data.schema,
itmtostore,
false
);
if (chkdata.status != 200) {
if (log) console.log(currentmod, "Unconsistency data", chkdata);
return chkdata;
}
if (log) console.log(currentmod, "Data compliance with schema");
if (!getschema.data.schema.apxuniquekey)
getschema.data.schema.apxuniquekey = [];
if (log)
console.log(
currentmod,
`${objectPathname}/itm/${chkdata.data.apxid}.json`
);
if (log) console.log(currentmod, chkdata.data.itm);
fs.outputJSONSync(
`${objectPathname}/itm/${chkdata.data.apxid}.json`,
chkdata.data.itm
);
}
//if (log) console.log(currentmod,"getschema", getschema);
//rebuild index if requested
if (log) console.log(currentmod, "runidx", runindex);
if (runindex) Odmdb.runidx(objectPathname, getschema.data.schema);
getschema.data.conf.lastupdatedata = dayjs().toISOString();
fs.outputJSONSync(`${objectPathname}/conf.json`, getschema.data.conf);
return {
status: 200,
ref: "Odmdb",
msg: "cudsuccessfull",
data: feedbackinfo,
};
};
/**
* apxidx:[list of index file
* { name: string, // filename in /idx/name.json
* type: array (list of unique value found in keyval), example: [val1, val2, val3,....] eventualy filter
* view (only unique key and object with objkey eventually filter by filter ) example: {idalias:{itm}}
* distribution (=> {val of keyval:[apxid itm value]} with )
* keyval:string, // a propertie of type string or array
* objkeys:[] and array of properties if empty [] means all properties, if 1 element => an array of this properties
* filter : an eval function base on itm data (itm.key) that return true (return data item) or false (ignore item)
*
*/
Odmdb.runidx = (objectPathname, schema) => {
if (log) console.log(currentmod, `idx for ${objectPathname}`);
if (!schema || !schema.apxid) {
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
schema = getschema.data.schema;
}
const ventil = {};
schema.apxidx.forEach((id) => {
ventil[id.name] = id;
if (id.keyval.includes(".")) {
// Means keyval is an object that can be only string for an idx
ventil[id.name].isobject = true;
ventil[id.name].isunique = false;
ventil[id.name].nbobjkey = 0;
ventil[id.name].keyvaltype = "string";
ventil[id.name].filter = id.filter ? id.filter.replace(/;/g, "") : ""; // check integrity of string
ventil[id.name].data = {};
} else {
ventil[id.name].isunique = schema.apxuniquekey.includes(id.keyval);
ventil[id.name].nbobjkey = id.objkey ? id.objkey.length : 0;
ventil[id.name].keyvaltype = schema.properties[id.keyval].type;
ventil[id.name].filter = id.filter ? id.filter.replace(/;/g, "") : ""; // check integrity of string
ventil[id.name].data = ventil[id.name].type == "array" ? [] : {};
}
});
glob.sync(`${objectPathname}/itm/*.json`).forEach((i) => {
const itm = fs.readJSONSync(i);
Object.keys(ventil).forEach((n) => {
let keep = true;
if (ventil[n].filter != "") {
try {
keep = eval(ventil[n].filter);
} catch (err) {
keep = false;
}
}
if (keep && ventil[n].type == "array" && itm[ventil[n].keyval]) {
if (ventil[n].keyvaltype == "array") {
itm[ventil[n].keyval].forEach((v) => {
if (!ventil[n].data.includes(v)) ventil[n].data.push(v);
});
} else {
if (!ventil[n].data.includes(itm[ventil[n].keyval]))
ventil[n].data.push(itm[ventil[n].keyval]);
}
}
if (
keep &&
ventil[n].type == "view" &&
ventil[n].isunique &&
itm[ventil[n].keyval]
) {
if (ventil[n].nbobjkey == 0)
ventil[n].data[itm[ventil[n].keyval]] = itm;
if (ventil[n].nbobjkey == 1)
ventil[n].data[itm[ventil[n].keyval]] = itm[ventil[n].objkey[0]];
if (ventil[n].nbobjkey > 1) {
const objdata = {};
Object.keys(itm).forEach((k) => {
if (ventil[n].objkey.includes(k)) objdata[k] = itm[k];
});
ventil[n].data[itm[ventil[n].keyval]] = objdata;
}
}
if (keep && ventil[n].type == "distribution" && itm[ventil[n].keyval]) {
const listval =
ventil[n].keyvaltype == "string"
? [itm[ventil[n].keyval]]
: itm[ventil[n].keyval];
// itm[ventil[n].keyval] is an array
listval.forEach((val) => {
if (!ventil[n].data[val]) ventil[n].data[val] = [];
ventil[n].data[val].push(itm[schema.apxid]);
});
}
if (
keep &&
ventil[n].type == "distribution" &&
ventil[n].isobject &&
itm[ventil[n].keyval.split(".")[0]]
) {
let itmval = JSON.parse(JSON.stringify(itm));
if (log) console.log(currentmod, ventil[n].keyval);
if (log) console.log(currentmod, itmval);
ventil[n].keyval
.split(".")
.forEach((i) => (itmval = itmval[i] ? itmval[i] : null));
if (itmval) {
if (!ventil[n].data[itmval]) ventil[n].data[itmval] = [];
ventil[n].data[itmval].push(itm[schema.apxid]);
}
}
});
});
Object.keys(ventil).forEach((n) => {
//if (log) console.log(currentmod,`${objectPathname}/idx/${ventil[n].name}.json`)
fs.outputJSON(
`${objectPathname}/idx/${ventil[n].name}.json`,
ventil[n].data
);
});
};
/**
* create/update idx from itm(s)
*
* @param {string} objectPathname
* @param {object} itm item to Create or to Update or {} if crud == I or crud == D
* @param {object} itmold (current item) if crud == U or D to get previous itm before change or {} if crud==I or C
* @param {letter} crud CUDI C add, U update, D delete I reindex
* @param {array} idx if specific request to rebuild list of idx only if [] then use schema one
* @param {object} schema if empty it use schema from Odmdb.Schema().data.schema
*
* example create alias 12 name fred:
* Odmdb.idxfromitm('../../../ndda/persons',"C",{alias:'12',name:"fred"},{},[], {person schema})
* example update alias 12 in name freddy:
* Odmdb.idxfromitm('../../../ndda/persons',"U",{alias:'12',name:"freddy"},{alias:'12',name:"fred"},[], {person schema})
* example delete alias 12:
* Odmdb.idxfromitm('../../../ndda/persons',"D",{},{alias:'12',name:"fred"},[], {person schema})
* example to rebuild all index from scratch
* Odmdb.idxfromitm('../../../ndda/persons',"I",{},{},[], {person schema})
* example to rebuild only publickey_alias index from scratch
* Odmdb.idxfromitm('../../../ndda/pagans',"I",{},{},[{ name:"publickey_alias",keyval:"publickey",objkey:["alias"]}], {pagans schema})
*
*/
Odmdb.ASUPidxfromitm = (
objectPathname,
crud,
itm,
itmold,
idxs = [],
schema
) => {
if (log)
console.log(currentmod, `idxfromitem for ${objectPathname} action:${crud}`);
if (!schema || !schema.apxid) {
const getschema = Odmdb.Schema(objectPathname, true);
if (getschema.status != 200) return getschema;
schema = getschema.data.schema;
}
if (log) console.log(currentmod, schema.apxuniquekey);
const itms = crud == "I" ? glob.sync(`${objectPathname}/itm/*.json`) : [itm];
if (log) console.log(currentmod, itms);
if (crud == "I") {
//reinit all idx
idxs.forEach((idx) => {
fs.remove(`${objectPathname}/idx/${idx.name}.json`);
});
}
let idxtoreindex = []; //store index that has to be reprocessto get full context
idxs = idxs.length == 0 ? schema.apxidx : idxs; // get all index if none
itms.forEach((i) => {
if (crud == "I") {
itm = fs.readJSONSync(i);
}
//if (log) console.log(currentmod,itm);
idxs.forEach((idx) => {
const keyvalisunique = schema.apxuniquekey.includes(idx.keyval); // check if keyval is unique mean store as an object (or string) else store as an array
const idxsrc = `${objectPathname}/idx/${idx.name}.json`;
const idxinit = idx.name.substring(0, 4) == "lst_" ? [] : {}; // select type of idx (array or object)
let idxfile = !fs.existsSync(idxsrc) ? idxinit : fs.readJSONSync(idxsrc);
if (idx.name.substring(0, 4) == "lst_") {
if (["D", "U"].includes(crud)) {
if (keyvalisunique) {
idxfile = idxfile.filter((e) => e !== itmold[idx.keyval]);
} else {
idxtoreindex.push(idx); //@todo
}
}
if (log) console.log(currentmod, idx.keyval);
if (log) console.log(currentmod, itm[idx.keyval]);
if (
["C", "U", "I"].includes(crud) &&
!idxfile.includes(itm[idx.keyval])
) {
idxfile.push(itm[idx.keyval]);
}
} else {
if (!idx.objkey) {
//mean all properties
idx.objkey = Object.keys(schema.properties);
}
if (keyvalisunique && idx.objkey.length == 1) {
if (["D", "U"].includes(crud)) {
delete idxfile[itmold[idx.keyval]];
} else {
idxfile[itm[idx.keyval]] = itm[idx.objkey[0]];
}
}
if (keyvalisunique && idx.objkey.length > 1) {
if (["D", "U"].includes(crud)) {
delete idxfile[itmold[idx.keyval]];
} else {
const itmfilter = {};
idx.objkey.forEach((i) => {
if (itm[i]) itmfilter[i] = itm[i];
});
idxfile[itm[idx.keyval]] = itmfilter;
}
}
if (!keyvalisunique && idx.objkey.length == 1) {
if (
["D", "U"].includes(crud) &&
idxfile[itmold[idx.keyval]].IndexOf(itmold[idx.objkey[0]]) > -1
) {
// U because need to remove previous value before adding it
idxfile[itmold[idx.keyval]].splice(
idxfile[itmold[idx.keyval]].IndexOf(itmold[idx.objkey[0]]),
1
);
}
if (["C", "U", "I"].includes(crud)) {
if (!idxfile[itm[idx.keyval]]) idxfile[itm[idx.keyval]] = [];
if (!idxfile[itm[idx.keyval]].includes(itm[idx.objkey[0]])) {
idxfile[itm[idx.keyval]].push(itm[idx.objkey[0]]);
}
}
}
if (!keyvalisunique && idx.objkey.length > 1) {
if (["D", "U"].includes(crud) && idxfile[itmold[idx.keyval]]) {
// U because need to remove previous value before adding it
let arrayofit = [];
idxfile[itmold[idx.keyval]].forEach((it) => {
if (it[schema.apxid] != itm[schema.apxid]) arrayofit.push(it);
});
idxfile[itmold[idx.keyval]] = arrayofit;
}
if (["C", "U", "I"].includes(crud)) {
const itmfilter = {};
idx.objkey.forEach((i) => {
if (itm[i]) itmfilter[i] = itm[i];
});
if (!idxfile[itm[idx.keyval]]) idxfile[itm[idx.keyval]] = [];
idxfile[itm[idx.keyval]].push(itmfilter);
}
}
}
fs.outputJSONSync(idxsrc, idxfile);
});
});
if (crud != "I") {
//update lastupdatedata to inform something change
const confschema = fs.readJSONSync(`${objectPathname}/conf.json`);
confschema.lastupdatedata = dayjs().toISOString();
fs.outputJSONSync(`${objectPathname}/conf.json`, confschema);
}
return { status: 200, ref: "Odmdb", msg: "successreindex", data: {} };
};
Odmdb.updatefromidxall = (objectname, idxname, data, lastupdate) => {
/**
* Update all itm of objectname from index idx/idxname with data
* if itm exist in local and not in data then /ojectname/conf.json.lastupdate = now
* not then /ojectname/conf.json.lastupdate = lastupdate
* this way mean next time server A want to refresh from B its lastupdate < than on A
*/
let conflastupdate = 0;
let localidx = {};
if (fs.existsSync(`../nationchains/${objectname}/idx/${idxname}`)) {
localidx = fs.readJsonSync(`../nationchains/${objectname}/idx/${idxname}`);
}
Object.keys(data).forEach((id) => {
if (localidx[id]) {
if (
localidx[id].dt_update &&
data[id].dt_update &&
localidx[id].dt_update > data[id].dt_update
) {
// means local information is fresher than the one in data for replacement
// .toISIString ex: 2019-01-25T02:00:00.000Z'
conflastupdate = dayjs().toISOString();
} else {
// replace itm with data
localidx[id] = data[id];
fs.outputJsonSync(
`../nationchains/${objectname}/itm/${id}.json`,
data[id]
);
}
} else {
// add itm
localidx[id] = data[id];
fs.outputJsonSync(
`../nationchains/${objectname}/itm/${id}.json`,
data[id]
);
}
});
//check if it miss id in fresher update means conf.lastupdate will be now to indicate
Object.keys(localidx).forEach((id) => {
if (!data[id]) {
conflastupdate = dayjs().toISOString();
}
});
// update the object files
if (conflastupdate == 0) conflastupdate = lastupdate;
fs.outputJSONSync(`../nationchains/${objectname}/idx/${idxname}`, localidx);
const objconf = fs.readJsonSync(`../nationchains/${objectname}/conf.json`);
objconf.lastupdate = conflastupdate;
fs.outputJsonSync(`../nationchains/${objectname}/conf.json`, objconf);
return {
status: 200,
ref: "Odmdb.js",
info: "Successfullupdate",
data: { objectname, idxname, lastupdate },
};
};
const imgbase64test="iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAIAAADwf7zUAAAgAElEQVR4nOzBAQEAAACCIP+vbkhAAADAiWoAAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAAeFENAAD//+zDAQ0AAADCoPdPbRBhQwAA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DQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA///swwENAAAAwqD3T20QYUMAAHhRDQAA//8DAPN8JmZgsrlSAAAAAElFTkSuQmCC"
module.exports = Odmdb;