validation.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. let validator = {
  2. ingredient: {
  3. name: function(ingName, createBanner = true){
  4. //Check for special chars
  5. if(!validator.isSanitary(ingName)){
  6. if(createBanner){
  7. banner.createError("Your inputs contain illegal characters");
  8. }
  9. return false;
  10. }
  11. //Check for length
  12. if(ingName.length < 2){
  13. if(createBanner){
  14. banner.createError("Ingredient name must contain at least 2 characters");
  15. }
  16. return false;
  17. }
  18. return true;
  19. },
  20. category: function(ingCategory, createBanner = true){
  21. //Check for special chars
  22. if(!validator.isSanitary(ingCategory)){
  23. if(createBanner){
  24. banner.createError("Your inputs contain illegal characters");
  25. }
  26. return false;
  27. }
  28. //Check for length
  29. if(ingCategory.length < 3){
  30. if(createBanner){
  31. banner.createError("Category name must contain at least 3 characters");
  32. }
  33. return false;
  34. }
  35. return true;
  36. },
  37. quantity: function(num, createBanner = true){
  38. if(isNaN(num) || num === ""){
  39. if(createBanner){
  40. banner.createError("Must enter a valid number");
  41. }
  42. return false;
  43. }
  44. if(num < 0){
  45. if(createBanner){
  46. banner.createError("Quantity cannot be a negative number");
  47. }
  48. return false;
  49. }
  50. return true;
  51. },
  52. unit: function(ingUnit, createBanner = true){
  53. //Check for special chars
  54. if(!validator.isSanitary(ingUnit)){
  55. if(createBanner){
  56. banner.createError("Your inputs contain illegal characters");
  57. }
  58. return false;
  59. }
  60. return true;
  61. },
  62. //Check all parts of ingredient, return true if all pass
  63. //Quantity passed seperately and optional
  64. all: function(ingObject, quantity = 0, createBanner = true){
  65. let nameCheck = this.name(ingObject.name, createBanner);
  66. let categoryCheck = this.category(ingObject.category, createBanner);
  67. let unitCheck = this.unit(ingObject.unit, createBanner);
  68. let quantityCheck = this.quantity(quantity, createBanner);
  69. if(!nameCheck || !categoryCheck || !quantityCheck || !unitCheck){
  70. return false;
  71. }
  72. return true;
  73. }
  74. },
  75. merchant: {
  76. password: function(pass, confirmPass, createBanner = true){
  77. if(pass !== confirmPass){
  78. if(createBanner){
  79. banner.createError("Your passwords do not match");
  80. }
  81. return false;
  82. }
  83. if(pass.length < 15){
  84. if(createBanner){
  85. banner.createError("Your password must contain at least 15 characters");
  86. }
  87. return false;
  88. }
  89. return true;
  90. }
  91. },
  92. transaction: {
  93. date: function(from, to = new Date(), createBanner = true){
  94. let errors = [];
  95. let today = new Date();
  96. if(from > to){
  97. errors.push("Starting date must be before ending date");
  98. }
  99. if(from > today || to > today.setDate(today.getDate() + 1)){
  100. errors.push("Cannot choose a date in the future");
  101. }
  102. if(errors.length > 0){
  103. if(createBanner){
  104. for(let error of errors){
  105. banner.createError(error);
  106. }
  107. return false;
  108. }
  109. }
  110. return true;
  111. }
  112. },
  113. recipe: function(newRecipe, createBanner = true){
  114. let errors = [];
  115. if(!validator.isSanitary(newRecipe.name)){
  116. errors.push("Name contains invalid characters");
  117. }
  118. if(newRecipe.price < 0){
  119. errors.push("Price must contain a non-negative number");
  120. }
  121. if(newRecipe.ingredients.length === 0){
  122. errors.push("Must include at least one ingredient");
  123. }
  124. let checkSet = new Set();
  125. for(let ingredient of newRecipe.ingredients){
  126. if(ingredient.quantity < 0){
  127. errors.push("Quantity must contain a non-negative number");
  128. break;
  129. }
  130. checkSet.add(ingredient.ingredient);
  131. }
  132. if(checkSet.size !== newRecipe.ingredients.length){
  133. errors.push("Recipe contains duplicate ingredients");
  134. }
  135. if(isNaN(newRecipe.price) || newRecipe.price === "" || newRecipe.price< 0){
  136. errors.push("Must enter a valid price");
  137. }
  138. if(errors.length > 0){
  139. if(createBanner){
  140. for(let error of errors){
  141. banner.createError(error);
  142. }
  143. return false;
  144. }
  145. }
  146. return true;
  147. },
  148. isSanitary: function(str){
  149. let disallowed = ["\\", "<", ">", "$", "{", "}", "(", ")"];
  150. for(let char of disallowed){
  151. if(str.includes(char)){
  152. banner.createError("Your string contains illegal characters");
  153. return false;
  154. }
  155. }
  156. return true;
  157. }
  158. }