diff --git a/functions/src/config/firebase.ts b/functions/src/config/firebase.ts index c4b779a..3220171 100644 --- a/functions/src/config/firebase.ts +++ b/functions/src/config/firebase.ts @@ -11,6 +11,7 @@ admin.initializeApp({ }); const db = admin.firestore(); +db.settings({ ignoreUndefinedProperties: true }); const auth = admin.auth(); /** diff --git a/functions/src/controllers/application_controller.ts b/functions/src/controllers/application_controller.ts index da9d151..4c27663 100644 --- a/functions/src/controllers/application_controller.ts +++ b/functions/src/controllers/application_controller.ts @@ -162,7 +162,8 @@ async function constructDataToSave( for (const question of questions) { if (question.id === undefined || question.id === null) continue; const fieldValue = req.body[question.id]; - if (question.type === QUESTION_TYPE.FILE) { + // rewrite file path + if (question.type === QUESTION_TYPE.FILE && !(fieldValue === undefined || fieldValue === "" || fieldValue === null)) { dataToSave[ question.id ] = `${STORAGE_BASE_LINK}${USER_UPLOAD_PATH}${UID}_${ @@ -274,10 +275,19 @@ async function validateFileUploaded( question: Question, uid: string ) { - const errors = []; + const errors: { field_id: string; message: string; }[] = []; const validation = question.validation as FileValidation; + + // skip validation if not required and value is empty + if ( + validation.required !== true && + (fieldValue === undefined || fieldValue === "" || fieldValue === null) + ) { + return errors; + } + // required if ( validation.required === true && @@ -324,10 +334,18 @@ async function validateFileUploaded( // eslint-disable-next-line require-jsdoc function validateDropdownValue(fieldValue: string | any, question: Question) { - const errors = []; + const errors: { field_id: string; message: string; }[] = []; const validation = question.validation as DropdownValidation; + // skip validation if not required and value is empty + if ( + validation.required !== true && + (fieldValue === undefined || fieldValue === "" || fieldValue === null) + ) { + return errors; + } + // required if ( validation.required === true && @@ -353,10 +371,18 @@ function validateDropdownValue(fieldValue: string | any, question: Question) { // eslint-disable-next-line require-jsdoc function validateDatetimeValue(fieldValue: string, question: Question) { - const errors = []; + const errors: { field_id: string; message: string; }[] = []; const validation = question.validation as DatetimeValidation; + // skip validation if not required and value is empty + if ( + validation.required !== true && + (fieldValue === undefined || fieldValue === "" || fieldValue === null) + ) { + return errors; + } + // required if ( validation.required === true && @@ -381,10 +407,18 @@ function validateDatetimeValue(fieldValue: string, question: Question) { // eslint-disable-next-line require-jsdoc function validateNumberValue(fieldValue: number | any, question: Question) { - const errors = []; + const errors: { field_id: string; message: string; }[] = []; const validation = question.validation as NumberValidation; + // skip validation if not required and value is empty + if ( + validation.required !== true && + (fieldValue === undefined || fieldValue === "" || fieldValue === null) + ) { + return errors; + } + // required if ( validation.required === true && @@ -410,14 +444,16 @@ function validateNumberValue(fieldValue: number | any, question: Question) { if (validation.minValue && fieldValue < validation.minValue) { errors.push({ field_id: `${question.id}`, - message: `Must be more than equals ${validation.minValue}`, + message: `Must be more than or equal to ${validation.minValue}`, }); - } else if (validation.maxValue && fieldValue > validation.maxValue) { + } + if (validation.maxValue && fieldValue > validation.maxValue) { errors.push({ field_id: `${question.id}`, - message: `Must be less than equals ${validation.maxValue}`, + message: `Must be less than or equal to ${validation.maxValue}`, }); } + return errors; } @@ -425,10 +461,18 @@ function validateNumberValue(fieldValue: number | any, question: Question) { * Validate string value. Also works for textarea. */ function validateStringValue(fieldValue: string | any, question: Question) { - const errors = []; + const errors: { field_id: string; message: string; }[] = []; const validation = question.validation as StringValidation; + // skip validation if not required and value is empty + if ( + validation.required !== true && + (fieldValue === undefined || fieldValue === "" || fieldValue === null) + ) { + return errors; + } + // required if ( validation.required === true && diff --git a/functions/src/controllers/auth_controller.ts b/functions/src/controllers/auth_controller.ts index 8ba6210..dfa2a55 100644 --- a/functions/src/controllers/auth_controller.ts +++ b/functions/src/controllers/auth_controller.ts @@ -282,7 +282,7 @@ export const sessionLogin = async ( user = await auth.getUserByEmail(decodedIdToken.email); // update user record for first time - const docRef = await db.collection("questions").doc(user.uid).get(); + const docRef = await db.collection("users").doc(user.uid).get(); if (!docRef.exists) { const userData: User = formatUser({ email: user.email ?? "",