You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

238 lines
9.3 KiB

const checkCondition = ({ data, condition}, conditionArray = new Set()) => {
let ands = true;
for (const key in condition) {
const conditionValue = condition[key];
if (key == 'or') {
let ors = false;
for (const cond of conditionValue) {
// const orConditionChecking = checkCondition({ data, condition: cond }, conditionArray);
// ors = ors || orConditionChecking.ok;
ors = ors || checkCondition({data,condition: cond});
// conditionArray = new Set([...conditionArray, ...orConditionChecking.conditionArray])
if (ors) break;
}
ands = ands && ors;
} else {
if (data[key] == 'true') data[key] = true;
if (data[key] == 'false') data[key] = false;
switch (key) {
case [Op.gt]:
ands = ands && data[key] > conditionValue;
// if (!conditionArray.has(key)) conditionArray.add(key);
break;
default:
ands = ands && data[key] == conditionValue;
// if (!conditionArray.has(key)) conditionArray.add(key);
}
}
if (!ands) {
// return { ok: false, conditionArray };
return false;
}
}
// return { ok: true, conditionArray };
return true;
};
function checkingOptions({ question, answer }) {
let options = convertStringToJson(question?.options) || [],
inputType = +question?.inputType || -1;
// console.log("options", options)
if (!Array.isArray(options)) options = [options];
const OptionsValidValue = options.map((option) => {
return parseValue(option?.value);
})
const questionAnswer = answer[question.id];
if (questionAnswer === null || questionAnswer === undefined) return {
ok: false
}
let min = question?.min,
max = question?.max,
length = question?.length,
validation = question?.validation;
switch (inputType) {
case 1: //TEXT
case 3:
if (typeof questionAnswer !== "string") {
return {
statusCode:400,
message:ErrorMessages.InvalidData
}
}
if(length && isNumber(length) && questionAnswer.length>+length){
return {
statusCode:400,
message:ErrorMessages.InvalidTextLength(question.id,length)
}
}
if(validation && isValidRegex(validation)){
let validationRegex = new RegExp(validation);
if(!validationRegex.test(questionAnswer)) return {
statusCode:400,
message:ErrorMessages.InvalidTextPattern
}
}
break;
case 2: //NUMBER
if (!isNumber(questionAnswer)) {
return {
statusCode:400,
message:ErrorMessages.InvalidNumber(question.id)
}
}
if(min && isNumber(min) && +min>+questionAnswer) return {
statusCode:400,
message:ErrorMessages.InvalidMinNumber(question.id,min)
}
if(max && isNumber(max) && +max<+questionAnswer) return {
statusCode:400,
message:ErrorMessages.InvalidMaxNumber(question.id,max)
}
break;
case 4: // tak entekhab
case 6:
if (!OptionsValidValue.includes(questionAnswer)) {
return {
statusCode:400,
message:ErrorMessages.InvalidSelectedOption(question.id)
}
}
break;
case 5: // chand entekhab
case 7:
if (Array.isArray(questionAnswer)) {
for (let ans of questionAnswer) {
if (!OptionsValidValue.includes(ans)) return { statusCode: 400, message:ErrorMessages.InvalidAdditionalData(question.id) };
}
} else if (typeof questionAnswer === "string") {
for (let ans of questionAnswer.split(",")) {
if (!OptionsValidValue.includes(ans)) return { statusCode: 400, message:ErrorMessages.InvalidAdditionalData(question.id) };
}
} else {
return { statusCode: 400, message:ErrorMessages.InvalidData(question.id) };
}
break;
case 8:
if (!isValidDateStrict(questionAnswer)) return { statusCode:400, message:ErrorMessages.InvalidDate(question.id)};
const questionDate = new Date(questionAnswer);
if(min){
if(isValidDateStrict(min)){
if(new Date(min) > questionDate) return {
statusCode: 400,
message: ErrorMessages.InvalidMinDate(question.id)
}
}else if(min==="now()"){
if(new Date() > questionDate) return {
statusCode: 400,
message: ErrorMessages.InvalidMinDate(question.id)
}
}else if(min.includes("day")){
let days = min.match(/day(s)?\(([0-9]{1,2})\)/)[2];
if(
!isNaN(+days)
// &&
// Date.now() < questionDate
&&
Math.abs(Date.now() - questionDate.getTime()) > convertDaysToSeconds(days)
){
return {
statusCode: 400,
message:ErrorMessages.InvalidDayMinDate(question.id,days)
}
}
}
}
if(max){
if(isValidDateStrict(max)){
if(new Date(max) < questionDate) return {
statusCode: 400,
message: ErrorMessages.InvalidMaxDate(question.id)
}
}else if(max==="now()"){
if(new Date() < questionDate) return {
statusCode: 400,
message: ErrorMessages.InvalidMaxDate(question.id)
}
}else if(max.includes("day")){
let days = max.match(/day(s)?\(([0-9]{1,2})\)/)[2];
if(
!isNaN(+days)
// &&
// Date.now() < questionDate
&&
Math.abs(Date.now() - questionDate.getTime()) < convertDaysToSeconds(days)
){
return {
statusCode: 400,
message:ErrorMessages.InvalidDayMaxDate(question.id,days)
}
}
}
}
break;
case 10:
if (!isBoolean(questionAnswer)) return { statusCode:400, message: ErrorMessages.InvalidBooleanData(question.id) }
break;
default:
return {
statusCode:400,
message:ErrorMessages.InvalidInputType(question.id)
}
}
return true;
}
async function checkingConditionTypes({ fQ, question, mojazData = [], answer }) {
let check = false, checkOption = false, inputType = 10;
let condition = {}, isRequired = null;
let requiredCondition = {}, validation = null;
requiredCondition = question?.requiredCondition || {};
validation = question?.validation || null;
condition = convertStringToJson(fQ?.condition) || convertStringToJson(question?.condition) || null;
isRequired = returnBooleanOfArguments([fQ?.isRequired, question?.required]);
inputType = question?.inputType || 10;
console.log("question id:", question.id)
console.log("requiredCondition", requiredCondition);
// console.log("validation",validation);
console.log("condition", condition);
console.log("isRequired", isRequired);
// console.log("options",options);
console.log("inputType", inputType);
//1.check requiredConditions
//2.check Conditions and check they required or not
//3.check Options and check they required or not
//4.check validation
//5.remove extra data
//1.check requiredConditions
check = checkCondition({ data: answer, condition: requiredCondition })
if (check.ok === false) throw `${defects[question.id]}`;
mojazData = [...new Set([...mojazData, ...check.conditionArray])];
console.log("DONE SOLVE requiredConditions")
//2.check Conditions and check they required or not
check = checkCondition({ data: answer, condition: condition })
checkOption = checkingOptions({ question, answer });
if ((check.ok === false || checkOption.ok === false) && isRequired === true) throw `${defects[question.id]}`;
if (checkOption.ok === true) mojazData.push(`${question.id}`);
mojazData = [...new Set([...mojazData, ...check.conditionArray])];
console.log("DONE SOLVE condition")
//3.check Validation (ro bayad beporsam az aghaye sadeghi)
console.log("mojazDataAfter-requiredCondition-condition", mojazData);
return {
mojazData
}
}