forked from apxtri/apxtri
fix cud in case of empty value, it removes it
This commit is contained in:
parent
84200b70b0
commit
7b5df014be
@ -12,7 +12,8 @@ Checkjson.schema.properties = {};
|
|||||||
Checkjson.schema.properties.type = {};
|
Checkjson.schema.properties.type = {};
|
||||||
Checkjson.schema.properties.type.string = (str) => typeof str === "string";
|
Checkjson.schema.properties.type.string = (str) => typeof str === "string";
|
||||||
Checkjson.schema.properties.type.array = (val) => Array.isArray(val);
|
Checkjson.schema.properties.type.array = (val) => Array.isArray(val);
|
||||||
Checkjson.schema.properties.type.object = (val) => typeof val === 'object' && val !== null && !Array.isArray(val);
|
Checkjson.schema.properties.type.object = (val) =>
|
||||||
|
typeof val === "object" && val !== null && !Array.isArray(val);
|
||||||
Checkjson.schema.properties.type.number = (n) => typeof n === "number";
|
Checkjson.schema.properties.type.number = (n) => typeof n === "number";
|
||||||
Checkjson.schema.properties.type.boolean = (n) => typeof n === "boolean";
|
Checkjson.schema.properties.type.boolean = (n) => typeof n === "boolean";
|
||||||
Checkjson.schema.properties.type.integer = (n) =>
|
Checkjson.schema.properties.type.integer = (n) =>
|
||||||
@ -61,9 +62,7 @@ Checkjson.schema.properties.enum = (str, enumvalues) => {
|
|||||||
} else if (tribeId) {
|
} else if (tribeId) {
|
||||||
//enumvalues is a reference of objectname.key
|
//enumvalues is a reference of objectname.key
|
||||||
const { tribeId, obj, keyid } = enumvalues.split(".");
|
const { tribeId, obj, keyid } = enumvalues.split(".");
|
||||||
return fs.existsSync(
|
return fs.existsSync(`../../../${tribeId}/schema/${obj}/itm/${keyid}.json`);
|
||||||
`../../../${tribeId}/schema/${obj}/itm/${keyid}.json`
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -76,18 +75,22 @@ Checkjson.schema.properties.enum = (str, enumvalues) => {
|
|||||||
* @param {string} format keyworkd existing in Checkjson.schema.properties.format
|
* @param {string} format keyworkd existing in Checkjson.schema.properties.format
|
||||||
* @return null if format does not exist, true or false
|
* @return null if format does not exist, true or false
|
||||||
*/
|
*/
|
||||||
Checkjson.testformat=(str, format)=>{
|
Checkjson.testformat = (str, format) => {
|
||||||
if (!Checkjson.schema.properties.format[format]) { return null}
|
if (!Checkjson.schema.properties.format[format]) {
|
||||||
return Checkjson.schema.properties.pattern(str, Checkjson.schema.properties.format[format])
|
return null;
|
||||||
|
}
|
||||||
}
|
return Checkjson.schema.properties.pattern(
|
||||||
|
str,
|
||||||
|
Checkjson.schema.properties.format[format]
|
||||||
|
);
|
||||||
|
};
|
||||||
// see format https://json-schema.org/understanding-json-schema/reference/string.html#format
|
// see format https://json-schema.org/understanding-json-schema/reference/string.html#format
|
||||||
// to check a just value with a format use Checkjson.testformat=(value, format)
|
// to check a just value with a format use Checkjson.testformat=(value, format)
|
||||||
Checkjson.schema.properties.format = {
|
Checkjson.schema.properties.format = {
|
||||||
"date-time": /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d{1,3}/,
|
"date-time": /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d{1,3}/,
|
||||||
stringalphaonly: /^[A-Za-z0-9]{3,}$/,
|
stringalphaonly: /^[A-Za-z0-9]{3,}$/,
|
||||||
time: /[0-2]\d:[0-5]\d:[0-5]\d\.\d{1,3}/,
|
time: /[0-2]\d:[0-5]\d:[0-5]\d\.\d{1,3}/,
|
||||||
timehhmm:/^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/,
|
timehhmm: /^(0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$/,
|
||||||
date: /\d{4}-[01]\d-[0-3]\d/,
|
date: /\d{4}-[01]\d-[0-3]\d/,
|
||||||
duration: / /,
|
duration: / /,
|
||||||
email:
|
email:
|
||||||
@ -103,7 +106,7 @@ Checkjson.schema.properties.format = {
|
|||||||
ipv4: /^([0–9]{1,3}.){3}.([0–9]{1,3})$/,
|
ipv4: /^([0–9]{1,3}.){3}.([0–9]{1,3})$/,
|
||||||
ipv6: /^((([0–9A-Fa-f]{1,4}:){7}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}:[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){5}:([0–9A-Fa-f]{1,4}:)?[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){4}:([0–9A-Fa-f]{1,4}:){0,2}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){3}:([0–9A-Fa-f]{1,4}:){0,3}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){2}:([0–9A-Fa-f]{1,4}:){0,4}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(([0–9A-Fa-f]{1,4}:){0,5}:((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(::([0–9A-Fa-f]{1,4}:){0,5}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|([0–9A-Fa-f]{1,4}::([0–9A-Fa-f]{1,4}:){0,5}[0–9A-Fa-f]{1,4})|(::([0–9A-Fa-f]{1,4}:){0,6}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){1,7}:))$/,
|
ipv6: /^((([0–9A-Fa-f]{1,4}:){7}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}:[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){5}:([0–9A-Fa-f]{1,4}:)?[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){4}:([0–9A-Fa-f]{1,4}:){0,2}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){3}:([0–9A-Fa-f]{1,4}:){0,3}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){2}:([0–9A-Fa-f]{1,4}:){0,4}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){6}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(([0–9A-Fa-f]{1,4}:){0,5}:((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|(::([0–9A-Fa-f]{1,4}:){0,5}((b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b).){3}(b((25[0–5])|(1d{2})|(2[0–4]d)|(d{1,2}))b))|([0–9A-Fa-f]{1,4}::([0–9A-Fa-f]{1,4}:){0,5}[0–9A-Fa-f]{1,4})|(::([0–9A-Fa-f]{1,4}:){0,6}[0–9A-Fa-f]{1,4})|(([0–9A-Fa-f]{1,4}:){1,7}:))$/,
|
||||||
telephonefr: /^0[1-9][0-9]{8}$/,
|
telephonefr: /^0[1-9][0-9]{8}$/,
|
||||||
imgbase64:/data:image\/(png|jpg|jpeg|svg);base64,(?:[A-Za-z0-9+\/]+)/,
|
imgbase64: /data:image\/(png|jpg|jpeg|svg);base64,(?:[A-Za-z0-9+\/]+)/,
|
||||||
telephoneinter: /^\+*(\d{3})*[0-9,\-]{8,}/,
|
telephoneinter: /^\+*(\d{3})*[0-9,\-]{8,}/,
|
||||||
password:
|
password:
|
||||||
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&.])[A-Za-z\d$@$!%*?&.{}:|\s]{8,}/,
|
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&.])[A-Za-z\d$@$!%*?&.{}:|\s]{8,}/,
|
||||||
@ -132,22 +135,20 @@ Checkjson.schema.validation = (schema) => {
|
|||||||
data: { propertie: p, type: properties[p].type },
|
data: { propertie: p, type: properties[p].type },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (
|
if (properties[p].type && typeof properties[p].type === "object") {
|
||||||
properties[p].type &&
|
if (properties[p]["$ref"]) {
|
||||||
typeof properties[p].type === "object"){
|
|
||||||
if (properties[p]['$ref']){
|
|
||||||
//This is manage by Odmdb.schema to load recursively complex schema
|
//This is manage by Odmdb.schema to load recursively complex schema
|
||||||
multimsg.push({
|
multimsg.push({
|
||||||
ref: "Checkjson",
|
ref: "Checkjson",
|
||||||
msg: "externalrefnotload",
|
msg: "externalrefnotload",
|
||||||
data: { propertie: p, ref: properties[p]["$ref"]},
|
data: { propertie: p, ref: properties[p]["$ref"] },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//case type=="object" with properties
|
//case type=="object" with properties
|
||||||
if (properties[p].properties){
|
if (properties[p].properties) {
|
||||||
const checksub = Checkjson.schema.validation(properties[p])
|
const checksub = Checkjson.schema.validation(properties[p]);
|
||||||
if (checksub.status!=200){
|
if (checksub.status != 200) {
|
||||||
multimsg = multimsg.concat(checksub.multimsg)
|
multimsg = multimsg.concat(checksub.multimsg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if not $ref or no properties then any object is accepted
|
// if not $ref or no properties then any object is accepted
|
||||||
@ -200,26 +201,28 @@ Checkjson.schema.data = (schema, data, withschemacheck) => {
|
|||||||
console.log('---------')
|
console.log('---------')
|
||||||
console.log(data)
|
console.log(data)
|
||||||
*/
|
*/
|
||||||
const propertiescheck=(properties,subdata)=>{
|
const propertiescheck = (properties, subdata) => {
|
||||||
// properties ={prop1:{type,format},prop2:{type:object,...}}
|
// properties ={prop1:{type,format},prop2:{type:object,...}}
|
||||||
// subdata={prop1,prop2}
|
// subdata={prop1,prop2}
|
||||||
// Return [] => no error, else 1 item per error {msg,ref:checkjson,data}
|
// Return [] => no error, else 1 item per error {msg,ref:checkjson,data}
|
||||||
const propertielist=Object.keys(properties);
|
const propertielist = Object.keys(properties);
|
||||||
Object.keys(subdata).forEach(kdata=>{
|
Object.keys(subdata).forEach((kdata) => {
|
||||||
if (!propertielist.includes(kdata)){
|
if (!propertielist.includes(kdata)) {
|
||||||
delete subdata[kdata];
|
delete subdata[kdata];
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
let multimsg=[]
|
let multimsg = [];
|
||||||
propertielist.forEach((p) => {
|
propertielist.forEach((p) => {
|
||||||
//type is mandatory in a propertie
|
//type is mandatory in a propertie
|
||||||
if (subdata[p]) {
|
if (subdata[p]) {
|
||||||
if (properties[p].properties){
|
if (properties[p].properties) {
|
||||||
//means it is a subobject
|
//means it is a subobject
|
||||||
multimsg=multimsg.concat(propertiescheck(properties[p].properties,subdata[p]))
|
multimsg = multimsg.concat(
|
||||||
|
propertiescheck(properties[p].properties, subdata[p])
|
||||||
|
);
|
||||||
}
|
}
|
||||||
//type can be a list of string; number, array, boolean, object, null
|
//type can be a list of string; number, array, boolean, object, null
|
||||||
console.log(p,properties[p].type )
|
//console.log(p,properties[p].type )
|
||||||
const typlist =
|
const typlist =
|
||||||
properties[p].type && typeof properties[p].type === "string"
|
properties[p].type && typeof properties[p].type === "string"
|
||||||
? [properties[p].type]
|
? [properties[p].type]
|
||||||
@ -332,7 +335,10 @@ Checkjson.schema.data = (schema, data, withschemacheck) => {
|
|||||||
}
|
}
|
||||||
if (
|
if (
|
||||||
properties[p].pattern &&
|
properties[p].pattern &&
|
||||||
!Checkjson.schema.properties.pattern(subdata[p], properties[p].pattern)
|
!Checkjson.schema.properties.pattern(
|
||||||
|
subdata[p],
|
||||||
|
properties[p].pattern
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
multimsg.push({
|
multimsg.push({
|
||||||
ref: "Checkjson",
|
ref: "Checkjson",
|
||||||
@ -348,14 +354,14 @@ Checkjson.schema.data = (schema, data, withschemacheck) => {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return multimsg
|
return multimsg;
|
||||||
};//end propertiescheck()
|
}; //end propertiescheck()
|
||||||
|
|
||||||
if (withschemacheck) {
|
if (withschemacheck) {
|
||||||
const validschema = Checkjson.schema.validation(schema);
|
const validschema = Checkjson.schema.validation(schema);
|
||||||
if (validschema.status != 200) return validschema;
|
if (validschema.status != 200) return validschema;
|
||||||
}
|
}
|
||||||
let multi=propertiescheck(schema.properties,data)
|
let multi = propertiescheck(schema.properties, data);
|
||||||
const res = {};
|
const res = {};
|
||||||
|
|
||||||
if (multi.length > 0) {
|
if (multi.length > 0) {
|
||||||
@ -367,7 +373,7 @@ Checkjson.schema.data = (schema, data, withschemacheck) => {
|
|||||||
res.msg = "validcheck";
|
res.msg = "validcheck";
|
||||||
}
|
}
|
||||||
if (schema.apxid) {
|
if (schema.apxid) {
|
||||||
res.data={apxid : data[schema.apxid],itm:data};
|
res.data = { apxid: data[schema.apxid], itm: data };
|
||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
};
|
};
|
||||||
|
@ -663,16 +663,23 @@ Odmdb.cud = (objectPathname, crud, itm, role, runindex = true) => {
|
|||||||
if (keynotallow.length > 0) {
|
if (keynotallow.length > 0) {
|
||||||
feedbackinfo.keynotallow = keynotallow;
|
feedbackinfo.keynotallow = keynotallow;
|
||||||
}
|
}
|
||||||
|
//console.log('itmstore',itmtostore)
|
||||||
|
//console.log("itm",itm)
|
||||||
|
//console.log(accessright)
|
||||||
accessright.U.forEach(async (p) => {
|
accessright.U.forEach(async (p) => {
|
||||||
itmtostore[p] = itm[p];
|
itmtostore[p] = itm[p];
|
||||||
});
|
});
|
||||||
itmtostore.dt_update = dayjs().toISOString();
|
itmtostore.dt_update = dayjs().toISOString();
|
||||||
}
|
}
|
||||||
|
Object.keys(itmtostore).forEach((k) => {
|
||||||
|
// remove undefined itmtostore because empty =>
|
||||||
|
if (!itmtostore[k]) delete itmtostore[k];
|
||||||
|
});
|
||||||
Object.keys(itmtostore).forEach((k) => {
|
Object.keys(itmtostore).forEach((k) => {
|
||||||
//Manage base64 case image to convert ans store in webp
|
//Manage base64 case image to convert ans store in webp
|
||||||
if (k.includes("imgbase64_") && itmtostore[k] != "") {
|
if (k.includes("imgbase64_") && itmtostore[k] != "") {
|
||||||
fs.ensureDirSync(`${objectPathname}/img/`);
|
fs.ensureDirSync(`${objectPathname}/img/`);
|
||||||
console.log("check this for k:",k," itmtostore[k]:",itmtostore[k])
|
//console.log("check this for k:", k, " itmtostore[k]:", itmtostore[k]);
|
||||||
const imgb64 = itmtostore[k].replace(
|
const imgb64 = itmtostore[k].replace(
|
||||||
/^data:image\/(png|png|gif|bmp|jpg|jpeg);base64,/,
|
/^data:image\/(png|png|gif|bmp|jpg|jpeg);base64,/,
|
||||||
""
|
""
|
||||||
|
Loading…
x
Reference in New Issue
Block a user