import Joi from "joi"; import moment from "moment"; import validator from "validator"; const appointmentTimeSchema = Joi.object().keys({ date: Joi.date().required(), available: Joi.boolean().required() }); const customInputSchema = Joi.object().keys({ name: Joi.string().required(), type: Joi.string().required() }).unknown(true); function isValidEmail(email) { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(email); } function isDueDatePassed(dueDate) { return moment(dueDate, 'YYYY-MM-DD', true).isBefore(); } function isDatePassed(dateA, dateB) { const dueDateA = new Date(dateA); const dueDateB = new Date(dateB); return dueDateA < dueDateB; } function isInputValid(data, inputs) { if (!isValidCustomInput(inputs)) { return false; } // check for duplicates const seenNames = new Set(); for (const element of data) { if (seenNames.has(element.name)) { return false; // Duplicate found } seenNames.add(element.name); } // validate each input dynamically based on its type return data.every(element => { const inputDefinition = inputs.find(input => input.name === element.name); if (!inputDefinition) { return false; // If the input is not in the expected schema, fail validation } switch (inputDefinition.type) { case "email": return validator.isEmail(element.value); case "text": return !validator.isEmpty(element.value.trim()); // Trim to prevent spaces from being valid case "tel": return validator.isMobilePhone(element.value, "any", { strictMode: false }); default: return false; // Reject unknown input types } }); } function isValidCustomInput(data) { return !data.some(element => { const { error } = customInputSchema.validate(element); if (error) { console.log("Validation failed:", error.details); return true; // `some()` stops when this is true } return false; }); } function isValidAppointmentTimes(data) { return data.every(item => { // Validate date format strictly using Moment.js const isDateValid = moment(item.date, 'YYYY-MM-DDTHH:mm', true).isValid(); // Validate item against the schema const { error } = appointmentTimeSchema.validate(item); return isDateValid && !error; }); } function validateDates(res, startDate, endDate, dueDate) { if (isDatePassed(startDate, dueDate)) { res.status(400).json({ 'message': 'Due date is after start date' }); return false; } if (isDueDatePassed(dueDate)) { res.status(400).json({ 'message': 'Due date is in the past' }); return false; } if (isDatePassed(endDate, startDate)) { res.status(400).json({ 'message': 'End date is before start date' }); return false; } return true; } export {isValidEmail, isDueDatePassed, isDatePassed, validateDates, isValidAppointmentTimes, appointmentTimeSchema, isValidCustomInput, isInputValid};