utils.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import Joi from "joi";
  2. import moment from "moment";
  3. import validator from "validator";
  4. const appointmentTimeSchema = Joi.object().keys({
  5. date: Joi.date().required(),
  6. available: Joi.boolean().required()
  7. });
  8. const customInputSchema = Joi.object().keys({
  9. name: Joi.string().required(),
  10. type: Joi.string().required()
  11. }).unknown(true);
  12. function isValidEmail(email) {
  13. const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
  14. return emailRegex.test(email);
  15. }
  16. function isDueDatePassed(dueDate) {
  17. return moment(dueDate, 'YYYY-MM-DD', true).isBefore();
  18. }
  19. function isDatePassed(dateA, dateB) {
  20. const dueDateA = new Date(dateA);
  21. const dueDateB = new Date(dateB);
  22. return dueDateA < dueDateB;
  23. }
  24. function isInputValid(data, inputs) {
  25. if (!isValidCustomInput(inputs)) {
  26. return false;
  27. }
  28. // check for duplicates
  29. const seenNames = new Set();
  30. for (const element of data) {
  31. if (seenNames.has(element.name)) {
  32. return false; // Duplicate found
  33. }
  34. seenNames.add(element.name);
  35. }
  36. // validate each input dynamically based on its type
  37. return data.every(element => {
  38. const inputDefinition = inputs.find(input => input.name === element.name);
  39. if (!inputDefinition) {
  40. return false; // If the input is not in the expected schema, fail validation
  41. }
  42. switch (inputDefinition.type) {
  43. case "email":
  44. return validator.isEmail(element.value);
  45. case "text":
  46. return !validator.isEmpty(element.value.trim()); // Trim to prevent spaces from being valid
  47. case "tel":
  48. return validator.isMobilePhone(element.value, "any", { strictMode: false });
  49. default:
  50. return false; // Reject unknown input types
  51. }
  52. });
  53. }
  54. function isValidCustomInput(data) {
  55. return !data.some(element => {
  56. const { error } = customInputSchema.validate(element);
  57. if (error) {
  58. console.log("Validation failed:", error.details);
  59. return true; // `some()` stops when this is true
  60. }
  61. return false;
  62. });
  63. }
  64. function isValidAppointmentTimes(data) {
  65. return data.every(item => {
  66. // Validate date format strictly using Moment.js
  67. const isDateValid = moment(item.date, 'YYYY-MM-DDTHH:mm', true).isValid();
  68. // Validate item against the schema
  69. const { error } = appointmentTimeSchema.validate(item);
  70. return isDateValid && !error;
  71. });
  72. }
  73. function validateDates(res, startDate, endDate, dueDate) {
  74. if (isDatePassed(startDate, dueDate)) {
  75. res.status(400).json({ 'message': 'Due date is after start date' });
  76. return false;
  77. }
  78. if (isDueDatePassed(dueDate)) {
  79. res.status(400).json({ 'message': 'Due date is in the past' });
  80. return false;
  81. }
  82. if (isDatePassed(endDate, startDate)) {
  83. res.status(400).json({ 'message': 'End date is before start date' });
  84. return false;
  85. }
  86. return true;
  87. }
  88. export {isValidEmail, isDueDatePassed, isDatePassed, validateDates, isValidAppointmentTimes, appointmentTimeSchema, isValidCustomInput, isInputValid};