fix cud in case of empty value, it removes it
This commit is contained in:
		@@ -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,/,
 | 
				
			||||||
          ""
 | 
					          ""
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user