| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- 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};
|