create-ishvexa-app 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. package/index.js +62 -0
  2. package/package.json +14 -0
  3. package/templates/epms-app/.env +7 -0
  4. package/templates/epms-app/README.md +113 -0
  5. package/templates/epms-app/backend-mongodb/.env +3 -0
  6. package/templates/epms-app/backend-mongodb/.env.example +3 -0
  7. package/templates/epms-app/backend-mongodb/config/db.js +29 -0
  8. package/templates/epms-app/backend-mongodb/controllers/authController.js +93 -0
  9. package/templates/epms-app/backend-mongodb/controllers/departmentController.js +24 -0
  10. package/templates/epms-app/backend-mongodb/controllers/employeeController.js +39 -0
  11. package/templates/epms-app/backend-mongodb/controllers/reportController.js +57 -0
  12. package/templates/epms-app/backend-mongodb/controllers/salaryController.js +101 -0
  13. package/templates/epms-app/backend-mongodb/middleware/auth.js +16 -0
  14. package/templates/epms-app/backend-mongodb/models/Counter.js +13 -0
  15. package/templates/epms-app/backend-mongodb/models/Department.js +11 -0
  16. package/templates/epms-app/backend-mongodb/models/Employee.js +18 -0
  17. package/templates/epms-app/backend-mongodb/models/Salary.js +19 -0
  18. package/templates/epms-app/backend-mongodb/models/User.js +9 -0
  19. package/templates/epms-app/backend-mongodb/package-lock.json +1571 -0
  20. package/templates/epms-app/backend-mongodb/package.json +22 -0
  21. package/templates/epms-app/backend-mongodb/routes/authRoutes.js +8 -0
  22. package/templates/epms-app/backend-mongodb/routes/departmentRoutes.js +6 -0
  23. package/templates/epms-app/backend-mongodb/routes/employeeRoutes.js +6 -0
  24. package/templates/epms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  25. package/templates/epms-app/backend-mongodb/routes/salaryRoutes.js +8 -0
  26. package/templates/epms-app/backend-mongodb/server.js +39 -0
  27. package/templates/epms-app/backend-mysql/.env +7 -0
  28. package/templates/epms-app/backend-mysql/.env.example +7 -0
  29. package/templates/epms-app/backend-mysql/config/db.js +33 -0
  30. package/templates/epms-app/backend-mysql/controllers/authController.js +98 -0
  31. package/templates/epms-app/backend-mysql/controllers/departmentController.js +25 -0
  32. package/templates/epms-app/backend-mysql/controllers/employeeController.js +39 -0
  33. package/templates/epms-app/backend-mysql/controllers/reportController.js +41 -0
  34. package/templates/epms-app/backend-mysql/controllers/salaryController.js +93 -0
  35. package/templates/epms-app/backend-mysql/database/schema.sql +7 -0
  36. package/templates/epms-app/backend-mysql/middleware/auth.js +16 -0
  37. package/templates/epms-app/backend-mysql/package-lock.json +1486 -0
  38. package/templates/epms-app/backend-mysql/package.json +23 -0
  39. package/templates/epms-app/backend-mysql/routes/authRoutes.js +8 -0
  40. package/templates/epms-app/backend-mysql/routes/departmentRoutes.js +6 -0
  41. package/templates/epms-app/backend-mysql/routes/employeeRoutes.js +6 -0
  42. package/templates/epms-app/backend-mysql/routes/reportRoutes.js +5 -0
  43. package/templates/epms-app/backend-mysql/routes/salaryRoutes.js +8 -0
  44. package/templates/epms-app/backend-mysql/server.js +39 -0
  45. package/templates/epms-app/frontend/README.md +16 -0
  46. package/templates/epms-app/frontend/eslint.config.js +21 -0
  47. package/templates/epms-app/frontend/index.html +12 -0
  48. package/templates/epms-app/frontend/package-lock.json +3033 -0
  49. package/templates/epms-app/frontend/package.json +23 -0
  50. package/templates/epms-app/frontend/public/favicon.svg +1 -0
  51. package/templates/epms-app/frontend/public/icons.svg +24 -0
  52. package/templates/epms-app/frontend/src/App.css +184 -0
  53. package/templates/epms-app/frontend/src/App.jsx +31 -0
  54. package/templates/epms-app/frontend/src/api/authApi.js +7 -0
  55. package/templates/epms-app/frontend/src/api/client.js +11 -0
  56. package/templates/epms-app/frontend/src/api/departmentApi.js +5 -0
  57. package/templates/epms-app/frontend/src/api/employeeApi.js +4 -0
  58. package/templates/epms-app/frontend/src/api/reportApi.js +4 -0
  59. package/templates/epms-app/frontend/src/api/salaryApi.js +6 -0
  60. package/templates/epms-app/frontend/src/api/sparePartsApi.js +3 -0
  61. package/templates/epms-app/frontend/src/api/usersApi.js +4 -0
  62. package/templates/epms-app/frontend/src/assets/hero.png +0 -0
  63. package/templates/epms-app/frontend/src/assets/react.svg +1 -0
  64. package/templates/epms-app/frontend/src/assets/vite.svg +1 -0
  65. package/templates/epms-app/frontend/src/components/AppLayout.jsx +49 -0
  66. package/templates/epms-app/frontend/src/context/AuthContext.jsx +41 -0
  67. package/templates/epms-app/frontend/src/hooks/.gitkeep +0 -0
  68. package/templates/epms-app/frontend/src/index.css +2 -0
  69. package/templates/epms-app/frontend/src/main.jsx +16 -0
  70. package/templates/epms-app/frontend/src/pages/DepartmentPage.jsx +165 -0
  71. package/templates/epms-app/frontend/src/pages/DepartmentsPage.jsx +119 -0
  72. package/templates/epms-app/frontend/src/pages/EmployeePage.jsx +212 -0
  73. package/templates/epms-app/frontend/src/pages/EmployeesPage.jsx +217 -0
  74. package/templates/epms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  75. package/templates/epms-app/frontend/src/pages/LoginPage.jsx +105 -0
  76. package/templates/epms-app/frontend/src/pages/RegisterPage.jsx +84 -0
  77. package/templates/epms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  78. package/templates/epms-app/frontend/src/pages/ResetPasswordPage.jsx +83 -0
  79. package/templates/epms-app/frontend/src/pages/SalariesPage.jsx +274 -0
  80. package/templates/epms-app/frontend/src/pages/SalaryPage.jsx +254 -0
  81. package/templates/epms-app/frontend/vite.config.js +8 -0
  82. package/templates/lms-app/.env +9 -0
  83. package/templates/lms-app/README.md +89 -0
  84. package/templates/lms-app/backend-mongodb/.env +5 -0
  85. package/templates/lms-app/backend-mongodb/.env.example +5 -0
  86. package/templates/lms-app/backend-mongodb/package-lock.json +1583 -0
  87. package/templates/lms-app/backend-mongodb/package.json +26 -0
  88. package/templates/lms-app/backend-mongodb/src/config/db.js +10 -0
  89. package/templates/lms-app/backend-mongodb/src/config/env.js +28 -0
  90. package/templates/lms-app/backend-mongodb/src/controllers/authController.js +86 -0
  91. package/templates/lms-app/backend-mongodb/src/controllers/bookController.js +101 -0
  92. package/templates/lms-app/backend-mongodb/src/controllers/borrowController.js +106 -0
  93. package/templates/lms-app/backend-mongodb/src/controllers/dashboardController.js +40 -0
  94. package/templates/lms-app/backend-mongodb/src/controllers/reportController.js +47 -0
  95. package/templates/lms-app/backend-mongodb/src/controllers/studentController.js +92 -0
  96. package/templates/lms-app/backend-mongodb/src/ensureSeedData.js +72 -0
  97. package/templates/lms-app/backend-mongodb/src/middleware/auth.js +29 -0
  98. package/templates/lms-app/backend-mongodb/src/models/Book.js +14 -0
  99. package/templates/lms-app/backend-mongodb/src/models/Borrow.js +16 -0
  100. package/templates/lms-app/backend-mongodb/src/models/Student.js +14 -0
  101. package/templates/lms-app/backend-mongodb/src/models/User.js +13 -0
  102. package/templates/lms-app/backend-mongodb/src/routes/authRoutes.js +12 -0
  103. package/templates/lms-app/backend-mongodb/src/routes/bookRoutes.js +13 -0
  104. package/templates/lms-app/backend-mongodb/src/routes/borrowRoutes.js +11 -0
  105. package/templates/lms-app/backend-mongodb/src/routes/dashboardRoutes.js +9 -0
  106. package/templates/lms-app/backend-mongodb/src/routes/reportRoutes.js +12 -0
  107. package/templates/lms-app/backend-mongodb/src/routes/studentRoutes.js +13 -0
  108. package/templates/lms-app/backend-mongodb/src/seed.js +16 -0
  109. package/templates/lms-app/backend-mongodb/src/server.js +66 -0
  110. package/templates/lms-app/backend-mysql/.env +9 -0
  111. package/templates/lms-app/backend-mysql/.env.example +9 -0
  112. package/templates/lms-app/backend-mysql/database/schema.sql +45 -0
  113. package/templates/lms-app/backend-mysql/package-lock.json +1462 -0
  114. package/templates/lms-app/backend-mysql/package.json +23 -0
  115. package/templates/lms-app/backend-mysql/src/config/db.js +33 -0
  116. package/templates/lms-app/backend-mysql/src/config/env.js +21 -0
  117. package/templates/lms-app/backend-mysql/src/controllers/authController.js +87 -0
  118. package/templates/lms-app/backend-mysql/src/controllers/bookController.js +106 -0
  119. package/templates/lms-app/backend-mysql/src/controllers/borrowController.js +113 -0
  120. package/templates/lms-app/backend-mysql/src/controllers/dashboardController.js +33 -0
  121. package/templates/lms-app/backend-mysql/src/controllers/reportController.js +40 -0
  122. package/templates/lms-app/backend-mysql/src/controllers/studentController.js +95 -0
  123. package/templates/lms-app/backend-mysql/src/ensureSeedData.js +54 -0
  124. package/templates/lms-app/backend-mysql/src/middleware/auth.js +28 -0
  125. package/templates/lms-app/backend-mysql/src/routes/authRoutes.js +12 -0
  126. package/templates/lms-app/backend-mysql/src/routes/bookRoutes.js +13 -0
  127. package/templates/lms-app/backend-mysql/src/routes/borrowRoutes.js +11 -0
  128. package/templates/lms-app/backend-mysql/src/routes/dashboardRoutes.js +9 -0
  129. package/templates/lms-app/backend-mysql/src/routes/reportRoutes.js +12 -0
  130. package/templates/lms-app/backend-mysql/src/routes/studentRoutes.js +13 -0
  131. package/templates/lms-app/backend-mysql/src/server.js +69 -0
  132. package/templates/lms-app/backend-mysql/src/utils/mappers.js +73 -0
  133. package/templates/lms-app/frontend/.env.example +5 -0
  134. package/templates/lms-app/frontend/index.html +13 -0
  135. package/templates/lms-app/frontend/package-lock.json +1592 -0
  136. package/templates/lms-app/frontend/package.json +23 -0
  137. package/templates/lms-app/frontend/public/favicon.svg +4 -0
  138. package/templates/lms-app/frontend/src/App.jsx +107 -0
  139. package/templates/lms-app/frontend/src/api/authApi.js +5 -0
  140. package/templates/lms-app/frontend/src/api/booksApi.js +6 -0
  141. package/templates/lms-app/frontend/src/api/borrowsApi.js +5 -0
  142. package/templates/lms-app/frontend/src/api/client.js +8 -0
  143. package/templates/lms-app/frontend/src/api/dashboardApi.js +3 -0
  144. package/templates/lms-app/frontend/src/api/reportsApi.js +6 -0
  145. package/templates/lms-app/frontend/src/api/studentsApi.js +6 -0
  146. package/templates/lms-app/frontend/src/components/AppLayout.jsx +63 -0
  147. package/templates/lms-app/frontend/src/index.css +34 -0
  148. package/templates/lms-app/frontend/src/main.jsx +13 -0
  149. package/templates/lms-app/frontend/src/pages/BooksPage.jsx +206 -0
  150. package/templates/lms-app/frontend/src/pages/BorrowPage.jsx +134 -0
  151. package/templates/lms-app/frontend/src/pages/DashboardPage.jsx +42 -0
  152. package/templates/lms-app/frontend/src/pages/ForgotPassword.jsx +112 -0
  153. package/templates/lms-app/frontend/src/pages/LoginPage.jsx +71 -0
  154. package/templates/lms-app/frontend/src/pages/ReportsPage.jsx +176 -0
  155. package/templates/lms-app/frontend/src/pages/ReturnPage.jsx +75 -0
  156. package/templates/lms-app/frontend/src/pages/SearchPage.jsx +156 -0
  157. package/templates/lms-app/frontend/src/pages/StudentsPage.jsx +204 -0
  158. package/templates/lms-app/frontend/vite.config.js +26 -0
  159. package/templates/scms-app/.env +7 -0
  160. package/templates/scms-app/README.md +80 -0
  161. package/templates/scms-app/backend-mongodb/.env +3 -0
  162. package/templates/scms-app/backend-mongodb/.env.example +3 -0
  163. package/templates/scms-app/backend-mongodb/config/db.js +29 -0
  164. package/templates/scms-app/backend-mongodb/controllers/authController.js +93 -0
  165. package/templates/scms-app/backend-mongodb/controllers/deliveryController.js +65 -0
  166. package/templates/scms-app/backend-mongodb/controllers/reportController.js +51 -0
  167. package/templates/scms-app/backend-mongodb/controllers/shipmentController.js +65 -0
  168. package/templates/scms-app/backend-mongodb/controllers/supplierController.js +27 -0
  169. package/templates/scms-app/backend-mongodb/middleware/auth.js +16 -0
  170. package/templates/scms-app/backend-mongodb/models/Delivery.js +14 -0
  171. package/templates/scms-app/backend-mongodb/models/Shipment.js +14 -0
  172. package/templates/scms-app/backend-mongodb/models/Supplier.js +14 -0
  173. package/templates/scms-app/backend-mongodb/models/User.js +9 -0
  174. package/templates/scms-app/backend-mongodb/package-lock.json +1571 -0
  175. package/templates/scms-app/backend-mongodb/package.json +22 -0
  176. package/templates/scms-app/backend-mongodb/routes/authRoutes.js +8 -0
  177. package/templates/scms-app/backend-mongodb/routes/deliveryRoutes.js +8 -0
  178. package/templates/scms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  179. package/templates/scms-app/backend-mongodb/routes/shipmentRoutes.js +8 -0
  180. package/templates/scms-app/backend-mongodb/routes/supplierRoutes.js +6 -0
  181. package/templates/scms-app/backend-mongodb/server.js +39 -0
  182. package/templates/scms-app/backend-mysql/.env +7 -0
  183. package/templates/scms-app/backend-mysql/.env.example +7 -0
  184. package/templates/scms-app/backend-mysql/config/db.js +33 -0
  185. package/templates/scms-app/backend-mysql/controllers/authController.js +98 -0
  186. package/templates/scms-app/backend-mysql/controllers/deliveryController.js +62 -0
  187. package/templates/scms-app/backend-mysql/controllers/reportController.js +39 -0
  188. package/templates/scms-app/backend-mysql/controllers/shipmentController.js +62 -0
  189. package/templates/scms-app/backend-mysql/controllers/supplierController.js +28 -0
  190. package/templates/scms-app/backend-mysql/database/schema.sql +7 -0
  191. package/templates/scms-app/backend-mysql/middleware/auth.js +16 -0
  192. package/templates/scms-app/backend-mysql/package-lock.json +1486 -0
  193. package/templates/scms-app/backend-mysql/package.json +23 -0
  194. package/templates/scms-app/backend-mysql/routes/authRoutes.js +8 -0
  195. package/templates/scms-app/backend-mysql/routes/deliveryRoutes.js +8 -0
  196. package/templates/scms-app/backend-mysql/routes/reportRoutes.js +5 -0
  197. package/templates/scms-app/backend-mysql/routes/shipmentRoutes.js +8 -0
  198. package/templates/scms-app/backend-mysql/routes/supplierRoutes.js +6 -0
  199. package/templates/scms-app/backend-mysql/server.js +39 -0
  200. package/templates/scms-app/frontend/index.html +12 -0
  201. package/templates/scms-app/frontend/package-lock.json +1634 -0
  202. package/templates/scms-app/frontend/package.json +23 -0
  203. package/templates/scms-app/frontend/src/App.jsx +31 -0
  204. package/templates/scms-app/frontend/src/api/client.js +11 -0
  205. package/templates/scms-app/frontend/src/components/AppLayout.jsx +49 -0
  206. package/templates/scms-app/frontend/src/context/AuthContext.jsx +41 -0
  207. package/templates/scms-app/frontend/src/hooks/.gitkeep +0 -0
  208. package/templates/scms-app/frontend/src/index.css +2 -0
  209. package/templates/scms-app/frontend/src/main.jsx +16 -0
  210. package/templates/scms-app/frontend/src/pages/DeliveriesPage.jsx +265 -0
  211. package/templates/scms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  212. package/templates/scms-app/frontend/src/pages/LoginPage.jsx +105 -0
  213. package/templates/scms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  214. package/templates/scms-app/frontend/src/pages/ShipmentsPage.jsx +259 -0
  215. package/templates/scms-app/frontend/src/pages/SuppliersPage.jsx +168 -0
  216. package/templates/scms-app/frontend/vite.config.js +8 -0
  217. package/templates/sfms-app/.env +7 -0
  218. package/templates/sfms-app/README.md +72 -0
  219. package/templates/sfms-app/backend-mongodb/.env +3 -0
  220. package/templates/sfms-app/backend-mongodb/.env.example +3 -0
  221. package/templates/sfms-app/backend-mongodb/package-lock.json +1580 -0
  222. package/templates/sfms-app/backend-mongodb/package.json +23 -0
  223. package/templates/sfms-app/backend-mongodb/src/config/database.js +7 -0
  224. package/templates/sfms-app/backend-mongodb/src/config/env.js +35 -0
  225. package/templates/sfms-app/backend-mongodb/src/middleware/authMiddleware.js +32 -0
  226. package/templates/sfms-app/backend-mongodb/src/models/Payment.js +12 -0
  227. package/templates/sfms-app/backend-mongodb/src/models/Student.js +12 -0
  228. package/templates/sfms-app/backend-mongodb/src/models/User.js +14 -0
  229. package/templates/sfms-app/backend-mongodb/src/routes/authRoutes.js +140 -0
  230. package/templates/sfms-app/backend-mongodb/src/routes/paymentRoutes.js +117 -0
  231. package/templates/sfms-app/backend-mongodb/src/routes/reportRoutes.js +59 -0
  232. package/templates/sfms-app/backend-mongodb/src/routes/studentRoutes.js +79 -0
  233. package/templates/sfms-app/backend-mongodb/src/server.js +34 -0
  234. package/templates/sfms-app/backend-mysql/.env +7 -0
  235. package/templates/sfms-app/backend-mysql/.env.example +7 -0
  236. package/templates/sfms-app/backend-mysql/database/schema.sql +29 -0
  237. package/templates/sfms-app/backend-mysql/package-lock.json +1467 -0
  238. package/templates/sfms-app/backend-mysql/package.json +24 -0
  239. package/templates/sfms-app/backend-mysql/src/config/.gitkeep +0 -0
  240. package/templates/sfms-app/backend-mysql/src/config/db.js +31 -0
  241. package/templates/sfms-app/backend-mysql/src/config/env.js +20 -0
  242. package/templates/sfms-app/backend-mysql/src/middleware/.gitkeep +0 -0
  243. package/templates/sfms-app/backend-mysql/src/middleware/authMiddleware.js +26 -0
  244. package/templates/sfms-app/backend-mysql/src/models/.gitkeep +0 -0
  245. package/templates/sfms-app/backend-mysql/src/routes/.gitkeep +0 -0
  246. package/templates/sfms-app/backend-mysql/src/routes/authRoutes.js +131 -0
  247. package/templates/sfms-app/backend-mysql/src/routes/paymentRoutes.js +92 -0
  248. package/templates/sfms-app/backend-mysql/src/routes/reportRoutes.js +41 -0
  249. package/templates/sfms-app/backend-mysql/src/routes/studentRoutes.js +75 -0
  250. package/templates/sfms-app/backend-mysql/src/server.js +39 -0
  251. package/templates/sfms-app/backend-mysql/src/utils/mappers.js +43 -0
  252. package/templates/sfms-app/frontend/.env.example +9 -0
  253. package/templates/sfms-app/frontend/index.html +19 -0
  254. package/templates/sfms-app/frontend/package-lock.json +2667 -0
  255. package/templates/sfms-app/frontend/package.json +23 -0
  256. package/templates/sfms-app/frontend/postcss.config.js +6 -0
  257. package/templates/sfms-app/frontend/public/favicon.svg +4 -0
  258. package/templates/sfms-app/frontend/src/App.jsx +38 -0
  259. package/templates/sfms-app/frontend/src/api/apiClient.js +54 -0
  260. package/templates/sfms-app/frontend/src/components/AppLayout.jsx +61 -0
  261. package/templates/sfms-app/frontend/src/context/AuthContext.jsx +87 -0
  262. package/templates/sfms-app/frontend/src/index.css +7 -0
  263. package/templates/sfms-app/frontend/src/main.jsx +16 -0
  264. package/templates/sfms-app/frontend/src/pages/DashboardPage.jsx +78 -0
  265. package/templates/sfms-app/frontend/src/pages/ForgotPassword.jsx +114 -0
  266. package/templates/sfms-app/frontend/src/pages/LoginPage.jsx +141 -0
  267. package/templates/sfms-app/frontend/src/pages/PaymentsPage.jsx +309 -0
  268. package/templates/sfms-app/frontend/src/pages/ReportsPage.jsx +123 -0
  269. package/templates/sfms-app/frontend/src/pages/StudentsPage.jsx +281 -0
  270. package/templates/sfms-app/frontend/tailwind.config.js +21 -0
  271. package/templates/sfms-app/frontend/vite.config.js +61 -0
  272. package/templates/sims-app/README.md +138 -0
  273. package/templates/sims-app/backend/.env +4 -0
  274. package/templates/sims-app/backend/.env.example +4 -0
  275. package/templates/sims-app/backend/package.json +22 -0
  276. package/templates/sims-app/backend/src/config/db.js +9 -0
  277. package/templates/sims-app/backend/src/controllers/authController.js +115 -0
  278. package/templates/sims-app/backend/src/controllers/simsReportController.js +94 -0
  279. package/templates/sims-app/backend/src/controllers/sparePartController.js +41 -0
  280. package/templates/sims-app/backend/src/controllers/stockInController.js +45 -0
  281. package/templates/sims-app/backend/src/controllers/stockOutController.js +123 -0
  282. package/templates/sims-app/backend/src/middleware/auth.js +8 -0
  283. package/templates/sims-app/backend/src/models/SparePart.js +17 -0
  284. package/templates/sims-app/backend/src/models/StockIn.js +16 -0
  285. package/templates/sims-app/backend/src/models/StockOut.js +18 -0
  286. package/templates/sims-app/backend/src/models/User.js +12 -0
  287. package/templates/sims-app/backend/src/routes/authRoutes.js +12 -0
  288. package/templates/sims-app/backend/src/routes/simsReportRoutes.js +8 -0
  289. package/templates/sims-app/backend/src/routes/sparePartRoutes.js +8 -0
  290. package/templates/sims-app/backend/src/routes/stockInRoutes.js +8 -0
  291. package/templates/sims-app/backend/src/routes/stockOutRoutes.js +10 -0
  292. package/templates/sims-app/backend/src/server.js +62 -0
  293. package/templates/sims-app/backend/src/utils/passwordPolicy.js +10 -0
  294. package/templates/sims-app/backend/src/utils/sparePartHelpers.js +5 -0
  295. package/templates/sims-app/frontend/index.html +13 -0
  296. package/templates/sims-app/frontend/package.json +31 -0
  297. package/templates/sims-app/frontend/src/App.jsx +110 -0
  298. package/templates/sims-app/frontend/src/api/authApi.js +7 -0
  299. package/templates/sims-app/frontend/src/api/client.js +8 -0
  300. package/templates/sims-app/frontend/src/api/simsReportApi.js +5 -0
  301. package/templates/sims-app/frontend/src/api/sparePartsApi.js +4 -0
  302. package/templates/sims-app/frontend/src/api/stockInApi.js +4 -0
  303. package/templates/sims-app/frontend/src/api/stockOutApi.js +6 -0
  304. package/templates/sims-app/frontend/src/api/usersApi.js +3 -0
  305. package/templates/sims-app/frontend/src/components/AppLayout.jsx +47 -0
  306. package/templates/sims-app/frontend/src/index.css +7 -0
  307. package/templates/sims-app/frontend/src/main.jsx +13 -0
  308. package/templates/sims-app/frontend/src/pages/ForgotPassword.jsx +111 -0
  309. package/templates/sims-app/frontend/src/pages/LoginPage.jsx +71 -0
  310. package/templates/sims-app/frontend/src/pages/RegisterPage.jsx +99 -0
  311. package/templates/sims-app/frontend/src/pages/ReportsPage.jsx +120 -0
  312. package/templates/sims-app/frontend/src/pages/SparePartPage.jsx +148 -0
  313. package/templates/sims-app/frontend/src/pages/StockInPage.jsx +122 -0
  314. package/templates/sims-app/frontend/src/pages/StockOutPage.jsx +252 -0
  315. package/templates/sims-app/frontend/src/utils/passwordPolicy.js +8 -0
  316. package/templates/sims-app/frontend/vite.config.js +8 -0
  317. package/templates/smartshop-app/README.md +61 -0
  318. package/templates/smartshop-app/backend/.env +7 -0
  319. package/templates/smartshop-app/backend/.env.example +7 -0
  320. package/templates/smartshop-app/backend/database/schema.sql +46 -0
  321. package/templates/smartshop-app/backend/package-lock.json +1487 -0
  322. package/templates/smartshop-app/backend/package.json +26 -0
  323. package/templates/smartshop-app/backend/src/app.js +57 -0
  324. package/templates/smartshop-app/backend/src/config/db.js +52 -0
  325. package/templates/smartshop-app/backend/src/controllers/authController.js +98 -0
  326. package/templates/smartshop-app/backend/src/controllers/customerController.js +26 -0
  327. package/templates/smartshop-app/backend/src/controllers/productController.js +21 -0
  328. package/templates/smartshop-app/backend/src/controllers/reportController.js +29 -0
  329. package/templates/smartshop-app/backend/src/controllers/saleController.js +11 -0
  330. package/templates/smartshop-app/backend/src/middleware/authMiddleware.js +22 -0
  331. package/templates/smartshop-app/backend/src/models/authModel.js +24 -0
  332. package/templates/smartshop-app/backend/src/models/customerModel.js +43 -0
  333. package/templates/smartshop-app/backend/src/models/productModel.js +37 -0
  334. package/templates/smartshop-app/backend/src/models/reportModel.js +56 -0
  335. package/templates/smartshop-app/backend/src/models/saleModel.js +54 -0
  336. package/templates/smartshop-app/backend/src/routes/authRoutes.js +10 -0
  337. package/templates/smartshop-app/backend/src/routes/customerRoutes.js +16 -0
  338. package/templates/smartshop-app/backend/src/routes/productRoutes.js +16 -0
  339. package/templates/smartshop-app/backend/src/routes/reportRoutes.js +18 -0
  340. package/templates/smartshop-app/backend/src/routes/saleRoutes.js +9 -0
  341. package/templates/smartshop-app/backend/src/server.js +19 -0
  342. package/templates/smartshop-app/frontend/README.md +18 -0
  343. package/templates/smartshop-app/frontend/eslint.config.js +21 -0
  344. package/templates/smartshop-app/frontend/index.html +13 -0
  345. package/templates/smartshop-app/frontend/package-lock.json +3415 -0
  346. package/templates/smartshop-app/frontend/package.json +34 -0
  347. package/templates/smartshop-app/frontend/public/favicon.svg +1 -0
  348. package/templates/smartshop-app/frontend/public/icons.svg +24 -0
  349. package/templates/smartshop-app/frontend/src/App.css +184 -0
  350. package/templates/smartshop-app/frontend/src/App.jsx +41 -0
  351. package/templates/smartshop-app/frontend/src/assets/hero.png +0 -0
  352. package/templates/smartshop-app/frontend/src/assets/react.svg +1 -0
  353. package/templates/smartshop-app/frontend/src/assets/vite.svg +1 -0
  354. package/templates/smartshop-app/frontend/src/components/AppLayout.jsx +71 -0
  355. package/templates/smartshop-app/frontend/src/components/FormCard.jsx +12 -0
  356. package/templates/smartshop-app/frontend/src/components/StatCard.jsx +10 -0
  357. package/templates/smartshop-app/frontend/src/index.css +28 -0
  358. package/templates/smartshop-app/frontend/src/main.jsx +13 -0
  359. package/templates/smartshop-app/frontend/src/pages/CustomersPage.jsx +175 -0
  360. package/templates/smartshop-app/frontend/src/pages/DashboardPage.jsx +30 -0
  361. package/templates/smartshop-app/frontend/src/pages/ForgotPassword.jsx +102 -0
  362. package/templates/smartshop-app/frontend/src/pages/LoginPage.jsx +142 -0
  363. package/templates/smartshop-app/frontend/src/pages/ProductsPage.jsx +165 -0
  364. package/templates/smartshop-app/frontend/src/pages/ReportsPage.jsx +204 -0
  365. package/templates/smartshop-app/frontend/src/pages/SalesPage.jsx +153 -0
  366. package/templates/smartshop-app/frontend/src/services/api.js +15 -0
  367. package/templates/smartshop-app/frontend/vite.config.js +13 -0
  368. package/templates/srms-app/.env +7 -0
  369. package/templates/srms-app/README.md +82 -0
  370. package/templates/srms-app/backend-mongodb/.env +3 -0
  371. package/templates/srms-app/backend-mongodb/.env.example +3 -0
  372. package/templates/srms-app/backend-mongodb/config/db.js +29 -0
  373. package/templates/srms-app/backend-mongodb/controllers/authController.js +93 -0
  374. package/templates/srms-app/backend-mongodb/controllers/customerController.js +27 -0
  375. package/templates/srms-app/backend-mongodb/controllers/productController.js +26 -0
  376. package/templates/srms-app/backend-mongodb/controllers/reportController.js +44 -0
  377. package/templates/srms-app/backend-mongodb/controllers/saleController.js +72 -0
  378. package/templates/srms-app/backend-mongodb/middleware/auth.js +16 -0
  379. package/templates/srms-app/backend-mongodb/models/Customer.js +14 -0
  380. package/templates/srms-app/backend-mongodb/models/Product.js +13 -0
  381. package/templates/srms-app/backend-mongodb/models/Sale.js +15 -0
  382. package/templates/srms-app/backend-mongodb/models/User.js +9 -0
  383. package/templates/srms-app/backend-mongodb/package-lock.json +1571 -0
  384. package/templates/srms-app/backend-mongodb/package.json +22 -0
  385. package/templates/srms-app/backend-mongodb/routes/authRoutes.js +8 -0
  386. package/templates/srms-app/backend-mongodb/routes/customerRoutes.js +6 -0
  387. package/templates/srms-app/backend-mongodb/routes/productRoutes.js +6 -0
  388. package/templates/srms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  389. package/templates/srms-app/backend-mongodb/routes/saleRoutes.js +8 -0
  390. package/templates/srms-app/backend-mongodb/server.js +39 -0
  391. package/templates/srms-app/backend-mysql/.env +7 -0
  392. package/templates/srms-app/backend-mysql/.env.example +7 -0
  393. package/templates/srms-app/backend-mysql/config/db.js +33 -0
  394. package/templates/srms-app/backend-mysql/controllers/authController.js +98 -0
  395. package/templates/srms-app/backend-mysql/controllers/customerController.js +28 -0
  396. package/templates/srms-app/backend-mysql/controllers/productController.js +27 -0
  397. package/templates/srms-app/backend-mysql/controllers/reportController.js +29 -0
  398. package/templates/srms-app/backend-mysql/controllers/saleController.js +68 -0
  399. package/templates/srms-app/backend-mysql/database/schema.sql +7 -0
  400. package/templates/srms-app/backend-mysql/middleware/auth.js +16 -0
  401. package/templates/srms-app/backend-mysql/package-lock.json +1486 -0
  402. package/templates/srms-app/backend-mysql/package.json +23 -0
  403. package/templates/srms-app/backend-mysql/routes/authRoutes.js +8 -0
  404. package/templates/srms-app/backend-mysql/routes/customerRoutes.js +6 -0
  405. package/templates/srms-app/backend-mysql/routes/productRoutes.js +6 -0
  406. package/templates/srms-app/backend-mysql/routes/reportRoutes.js +5 -0
  407. package/templates/srms-app/backend-mysql/routes/saleRoutes.js +8 -0
  408. package/templates/srms-app/backend-mysql/server.js +39 -0
  409. package/templates/srms-app/frontend/index.html +12 -0
  410. package/templates/srms-app/frontend/package-lock.json +1634 -0
  411. package/templates/srms-app/frontend/package.json +23 -0
  412. package/templates/srms-app/frontend/src/App.jsx +31 -0
  413. package/templates/srms-app/frontend/src/api/client.js +11 -0
  414. package/templates/srms-app/frontend/src/components/AppLayout.jsx +40 -0
  415. package/templates/srms-app/frontend/src/context/AuthContext.jsx +41 -0
  416. package/templates/srms-app/frontend/src/hooks/.gitkeep +0 -0
  417. package/templates/srms-app/frontend/src/index.css +2 -0
  418. package/templates/srms-app/frontend/src/main.jsx +16 -0
  419. package/templates/srms-app/frontend/src/pages/CustomersPage.jsx +160 -0
  420. package/templates/srms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  421. package/templates/srms-app/frontend/src/pages/LoginPage.jsx +105 -0
  422. package/templates/srms-app/frontend/src/pages/ProductsPage.jsx +158 -0
  423. package/templates/srms-app/frontend/src/pages/ReportsPage.jsx +192 -0
  424. package/templates/srms-app/frontend/src/pages/SalesPage.jsx +310 -0
  425. package/templates/srms-app/frontend/vite.config.js +8 -0
  426. package/templates/stockhub-sms-app/.env +7 -0
  427. package/templates/stockhub-sms-app/README.md +82 -0
  428. package/templates/stockhub-sms-app/backend-mongodb/.env +3 -0
  429. package/templates/stockhub-sms-app/backend-mongodb/.env.example +3 -0
  430. package/templates/stockhub-sms-app/backend-mongodb/config/db.js +29 -0
  431. package/templates/stockhub-sms-app/backend-mongodb/controllers/authController.js +93 -0
  432. package/templates/stockhub-sms-app/backend-mongodb/controllers/productController.js +29 -0
  433. package/templates/stockhub-sms-app/backend-mongodb/controllers/reportController.js +53 -0
  434. package/templates/stockhub-sms-app/backend-mongodb/controllers/transactionController.js +74 -0
  435. package/templates/stockhub-sms-app/backend-mongodb/controllers/warehouseController.js +25 -0
  436. package/templates/stockhub-sms-app/backend-mongodb/middleware/auth.js +16 -0
  437. package/templates/stockhub-sms-app/backend-mongodb/models/Counter.js +13 -0
  438. package/templates/stockhub-sms-app/backend-mongodb/models/Product.js +16 -0
  439. package/templates/stockhub-sms-app/backend-mongodb/models/StockTransaction.js +19 -0
  440. package/templates/stockhub-sms-app/backend-mongodb/models/User.js +9 -0
  441. package/templates/stockhub-sms-app/backend-mongodb/models/Warehouse.js +12 -0
  442. package/templates/stockhub-sms-app/backend-mongodb/package-lock.json +1571 -0
  443. package/templates/stockhub-sms-app/backend-mongodb/package.json +22 -0
  444. package/templates/stockhub-sms-app/backend-mongodb/routes/authRoutes.js +8 -0
  445. package/templates/stockhub-sms-app/backend-mongodb/routes/productRoutes.js +6 -0
  446. package/templates/stockhub-sms-app/backend-mongodb/routes/reportRoutes.js +5 -0
  447. package/templates/stockhub-sms-app/backend-mongodb/routes/transactionRoutes.js +8 -0
  448. package/templates/stockhub-sms-app/backend-mongodb/routes/warehouseRoutes.js +6 -0
  449. package/templates/stockhub-sms-app/backend-mongodb/server.js +39 -0
  450. package/templates/stockhub-sms-app/backend-mysql/.env +7 -0
  451. package/templates/stockhub-sms-app/backend-mysql/.env.example +7 -0
  452. package/templates/stockhub-sms-app/backend-mysql/config/db.js +33 -0
  453. package/templates/stockhub-sms-app/backend-mysql/controllers/authController.js +98 -0
  454. package/templates/stockhub-sms-app/backend-mysql/controllers/productController.js +30 -0
  455. package/templates/stockhub-sms-app/backend-mysql/controllers/reportController.js +53 -0
  456. package/templates/stockhub-sms-app/backend-mysql/controllers/transactionController.js +70 -0
  457. package/templates/stockhub-sms-app/backend-mysql/controllers/warehouseController.js +26 -0
  458. package/templates/stockhub-sms-app/backend-mysql/database/schema.sql +40 -0
  459. package/templates/stockhub-sms-app/backend-mysql/middleware/auth.js +16 -0
  460. package/templates/stockhub-sms-app/backend-mysql/package-lock.json +1486 -0
  461. package/templates/stockhub-sms-app/backend-mysql/package.json +23 -0
  462. package/templates/stockhub-sms-app/backend-mysql/routes/authRoutes.js +8 -0
  463. package/templates/stockhub-sms-app/backend-mysql/routes/productRoutes.js +6 -0
  464. package/templates/stockhub-sms-app/backend-mysql/routes/reportRoutes.js +5 -0
  465. package/templates/stockhub-sms-app/backend-mysql/routes/transactionRoutes.js +8 -0
  466. package/templates/stockhub-sms-app/backend-mysql/routes/warehouseRoutes.js +6 -0
  467. package/templates/stockhub-sms-app/backend-mysql/server.js +39 -0
  468. package/templates/stockhub-sms-app/frontend/index.html +12 -0
  469. package/templates/stockhub-sms-app/frontend/package-lock.json +1634 -0
  470. package/templates/stockhub-sms-app/frontend/package.json +23 -0
  471. package/templates/stockhub-sms-app/frontend/src/App.jsx +31 -0
  472. package/templates/stockhub-sms-app/frontend/src/api/client.js +11 -0
  473. package/templates/stockhub-sms-app/frontend/src/components/AppLayout.jsx +40 -0
  474. package/templates/stockhub-sms-app/frontend/src/context/AuthContext.jsx +41 -0
  475. package/templates/stockhub-sms-app/frontend/src/hooks/.gitkeep +0 -0
  476. package/templates/stockhub-sms-app/frontend/src/index.css +13 -0
  477. package/templates/stockhub-sms-app/frontend/src/main.jsx +16 -0
  478. package/templates/stockhub-sms-app/frontend/src/pages/ForgotPassword.jsx +103 -0
  479. package/templates/stockhub-sms-app/frontend/src/pages/LoginPage.jsx +105 -0
  480. package/templates/stockhub-sms-app/frontend/src/pages/ProductsPage.jsx +132 -0
  481. package/templates/stockhub-sms-app/frontend/src/pages/ReportsPage.jsx +177 -0
  482. package/templates/stockhub-sms-app/frontend/src/pages/TransactionsPage.jsx +270 -0
  483. package/templates/stockhub-sms-app/frontend/src/pages/WarehousesPage.jsx +116 -0
  484. package/templates/stockhub-sms-app/frontend/vite.config.js +8 -0
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "backend-mongodb",
3
+ "version": "1.0.0",
4
+ "description": "MongoDB backend",
5
+ "type": "module",
6
+ "main": "server.js",
7
+ "scripts": {
8
+ "dev": "nodemon server.js",
9
+ "start": "node server.js"
10
+ },
11
+ "dependencies": {
12
+ "bcryptjs": "^3.0.3",
13
+ "cors": "^2.8.6",
14
+ "dotenv": "^17.4.2",
15
+ "express": "^5.2.1",
16
+ "jsonwebtoken": "^9.0.3",
17
+ "mongoose": "^8.19.1"
18
+ },
19
+ "devDependencies": {
20
+ "nodemon": "^3.1.14"
21
+ }
22
+ }
@@ -0,0 +1,8 @@
1
+ import { Router } from "express";
2
+ import { login, register, forgotPassword } from "../controllers/authController.js";
3
+
4
+ const router = Router();
5
+ router.post("/register", register);
6
+ router.post("/login", login);
7
+ router.post("/forgot-password", forgotPassword);
8
+ export default router;
@@ -0,0 +1,8 @@
1
+ import { Router } from "express";
2
+ import { create, getAll, update, remove } from "../controllers/deliveryController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ router.put("/:id", update);
7
+ router.delete("/:id", remove);
8
+ export default router;
@@ -0,0 +1,5 @@
1
+ import { Router } from "express";
2
+ import { getReports } from "../controllers/reportController.js";
3
+ const router = Router();
4
+ router.get("/", getReports);
5
+ export default router;
@@ -0,0 +1,8 @@
1
+ import { Router } from "express";
2
+ import { create, getAll, update, remove } from "../controllers/shipmentController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ router.put("/:id", update);
7
+ router.delete("/:id", remove);
8
+ export default router;
@@ -0,0 +1,6 @@
1
+ import { Router } from "express";
2
+ import { create, getAll } from "../controllers/supplierController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ export default router;
@@ -0,0 +1,39 @@
1
+ import express from "express";
2
+ import cors from "cors";
3
+ import dotenv from "dotenv";
4
+ import { connectDatabase } from "./config/db.js";
5
+ import auth from "./middleware/auth.js";
6
+ import authRoutes from "./routes/authRoutes.js";
7
+ import reportRoutes from "./routes/reportRoutes.js";
8
+ import supplierRoutes from "./routes/supplierRoutes.js";
9
+ import shipmentRoutes from "./routes/shipmentRoutes.js";
10
+ import deliveryRoutes from "./routes/deliveryRoutes.js";
11
+
12
+ dotenv.config();
13
+
14
+ const app = express();
15
+ const PORT = process.env.PORT || 5555;
16
+
17
+ app.use(cors());
18
+ app.use(express.json());
19
+
20
+ app.get("/api/health", (_req, res) => {
21
+ res.json({ message: "API is running" });
22
+ });
23
+
24
+ app.use("/api/auth", authRoutes);
25
+ app.use("/api/suppliers", auth, supplierRoutes);
26
+ app.use("/api/shipments", auth, shipmentRoutes);
27
+ app.use("/api/deliveries", auth, deliveryRoutes);
28
+ app.use("/api/reports", auth, reportRoutes);
29
+
30
+ app.use((err, _req, res, _next) => {
31
+ res.status(500).json({ message: err.message || "Server error" });
32
+ });
33
+
34
+ connectDatabase().then((ok) => {
35
+ app.listen(PORT, () => {
36
+ console.log(`Server running on port ${PORT}`);
37
+ if (!ok) console.log("Database Connection Failed");
38
+ });
39
+ });
@@ -0,0 +1,7 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ DB_HOST=localhost
4
+ DB_USER=student
5
+ DB_PASSWORD=
6
+ DB_NAME=SCMS
7
+ DB_PORT=3306
@@ -0,0 +1,7 @@
1
+ PORT=5555
2
+ JWT_SECRET=exam_jwt_secret_change_in_production
3
+ DB_HOST=localhost
4
+ DB_USER=student
5
+ DB_PASSWORD=
6
+ DB_NAME=SCMS
7
+ DB_PORT=3306
@@ -0,0 +1,33 @@
1
+ import mysql from "mysql2/promise";
2
+ import dotenv from "dotenv";
3
+
4
+ dotenv.config();
5
+
6
+ const pool = mysql.createPool({
7
+ host: process.env.DB_HOST || "localhost",
8
+ user: process.env.DB_USER || "root",
9
+ password: process.env.DB_PASSWORD || "",
10
+ database: process.env.DB_NAME || "SCMS",
11
+ port: Number(process.env.DB_PORT || 3306),
12
+ waitForConnections: true,
13
+ connectionLimit: 10,
14
+ });
15
+
16
+ export const query = async (sql, params = []) => {
17
+ const [rows] = await pool.execute(sql, params);
18
+ return rows;
19
+ };
20
+
21
+ export const connectDatabase = async () => {
22
+ try {
23
+ await query("SELECT 1");
24
+ console.log("Database Connected Successfully");
25
+ return true;
26
+ } catch (error) {
27
+ console.log("Database Connection Failed");
28
+ console.error(error.message);
29
+ return false;
30
+ }
31
+ };
32
+
33
+ export default pool;
@@ -0,0 +1,98 @@
1
+ import bcrypt from "bcryptjs";
2
+ import jwt from "jsonwebtoken";
3
+ import { query } from "../config/db.js";
4
+
5
+ const signToken = (user) =>
6
+ jwt.sign(
7
+ { id: user.id, username: user.username },
8
+ process.env.JWT_SECRET || "exam_secret",
9
+ { expiresIn: "8h" }
10
+ );
11
+
12
+ const normalizeEmail = (email) => String(email || "").trim().toLowerCase();
13
+
14
+ export const register = async (req, res) => {
15
+ try {
16
+ const { username, email, password } = req.body;
17
+ if (!username || !email || !password) {
18
+ return res.status(400).json({ message: "Username, email and password are required." });
19
+ }
20
+ const emailNorm = normalizeEmail(email);
21
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(emailNorm)) {
22
+ return res.status(400).json({ message: "Enter a valid email address." });
23
+ }
24
+ const existingUser = await query("SELECT id FROM users WHERE username = ?", [username.trim()]);
25
+ if (existingUser.length) {
26
+ return res.status(409).json({ message: "Username already exists." });
27
+ }
28
+ const existingEmail = await query("SELECT id FROM users WHERE email = ?", [emailNorm]);
29
+ if (existingEmail.length) {
30
+ return res.status(409).json({ message: "Email already registered." });
31
+ }
32
+ const hash = await bcrypt.hash(password, 10);
33
+ await query("INSERT INTO users (username, email, password) VALUES (?, ?, ?)", [
34
+ username.trim(),
35
+ emailNorm,
36
+ hash,
37
+ ]);
38
+ return res.status(201).json({ message: "Account created successfully." });
39
+ } catch {
40
+ return res.status(500).json({ message: "Server error during registration." });
41
+ }
42
+ };
43
+
44
+ export const login = async (req, res) => {
45
+ try {
46
+ const { username, password } = req.body;
47
+ if (!username || !password) {
48
+ return res.status(400).json({ message: "Username and password are required." });
49
+ }
50
+ const rows = await query("SELECT * FROM users WHERE username = ?", [username.trim()]);
51
+ if (!rows.length) {
52
+ return res.status(401).json({ message: "Invalid credentials." });
53
+ }
54
+ const user = rows[0];
55
+ const match = await bcrypt.compare(password, user.password);
56
+ if (!match) {
57
+ return res.status(401).json({ message: "Invalid credentials." });
58
+ }
59
+ return res.json({
60
+ message: "Login successful.",
61
+ token: signToken(user),
62
+ user: { id: user.id, username: user.username, email: user.email },
63
+ });
64
+ } catch {
65
+ return res.status(500).json({ message: "Server error during login." });
66
+ }
67
+ };
68
+
69
+ export const forgotPassword = async (req, res) => {
70
+ try {
71
+ const { email, newPassword, confirmPassword } = req.body;
72
+ if (!email) {
73
+ return res.status(400).json({ success: false, message: "Email is required." });
74
+ }
75
+ if (!newPassword) {
76
+ return res.status(400).json({ success: false, message: "New password is required." });
77
+ }
78
+ if (!confirmPassword) {
79
+ return res.status(400).json({ success: false, message: "Confirm password is required." });
80
+ }
81
+ if (newPassword !== confirmPassword) {
82
+ return res.status(400).json({
83
+ success: false,
84
+ message: "New password and confirm password must match.",
85
+ });
86
+ }
87
+ const emailNorm = normalizeEmail(email);
88
+ const rows = await query("SELECT id FROM users WHERE email = ?", [emailNorm]);
89
+ if (!rows.length) {
90
+ return res.status(404).json({ success: false, message: "User not found" });
91
+ }
92
+ const hash = await bcrypt.hash(newPassword, 10);
93
+ await query("UPDATE users SET password = ? WHERE email = ?", [hash, emailNorm]);
94
+ return res.json({ success: true, message: "Password reset successfully" });
95
+ } catch {
96
+ return res.status(500).json({ success: false, message: "Server error." });
97
+ }
98
+ };
@@ -0,0 +1,62 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.deliveryCode) return res.status(400).json({ message: "Delivery Code is required." });
6
+ if (!req.body.deliveryDate) return res.status(400).json({ message: "Delivery Date is required." });
7
+ if (req.body.quantityDelivered === undefined || req.body.quantityDelivered === "") return res.status(400).json({ message: "Quantity Delivered is required." });
8
+ if (!req.body.deliveryStatus) return res.status(400).json({ message: "Delivery Status is required." });
9
+ if (!req.body.shipmentNumber) return res.status(400).json({ message: "Shipment Number is required." });
10
+ const shipment = await query("SELECT shipment_number FROM shipments WHERE shipment_number = ?", [req.body.shipmentNumber]);
11
+ if (!shipment.length) return res.status(400).json({ message: "Selected shipment does not exist." });
12
+ const values = [req.body.deliveryCode, req.body.deliveryDate, req.body.quantityDelivered, req.body.deliveryStatus, req.body.shipmentNumber];
13
+ await query("INSERT INTO deliveries (delivery_code, delivery_date, quantity_delivered, delivery_status, shipment_number) VALUES (?, ?, ?, ?, ?)", values);
14
+ return res.status(201).json({ message: "Delivery added successfully." });
15
+ } catch (error) {
16
+ if (error.code === "ER_DUP_ENTRY") {
17
+ return res.status(409).json({ message: "Delivery already exists." });
18
+ }
19
+ return res.status(500).json({ message: "Failed to add delivery." });
20
+ }
21
+ };
22
+
23
+ export const getAll = async (_req, res) => {
24
+ try {
25
+ const rows = await query("SELECT * FROM deliveries ORDER BY delivery_code DESC");
26
+ return res.json(rows);
27
+ } catch {
28
+ return res.status(500).json({ message: "Failed to fetch delivery records." });
29
+ }
30
+ };
31
+
32
+ export const update = async (req, res) => {
33
+ try {
34
+ if (!req.body.deliveryCode) return res.status(400).json({ message: "Delivery Code is required." });
35
+ if (!req.body.deliveryDate) return res.status(400).json({ message: "Delivery Date is required." });
36
+ if (req.body.quantityDelivered === undefined || req.body.quantityDelivered === "") return res.status(400).json({ message: "Quantity Delivered is required." });
37
+ if (!req.body.deliveryStatus) return res.status(400).json({ message: "Delivery Status is required." });
38
+ if (!req.body.shipmentNumber) return res.status(400).json({ message: "Shipment Number is required." });
39
+ const shipment = await query("SELECT shipment_number FROM shipments WHERE shipment_number = ?", [req.body.shipmentNumber]);
40
+ if (!shipment.length) return res.status(400).json({ message: "Selected shipment does not exist." });
41
+ const values = [req.body.deliveryCode, req.body.deliveryDate, req.body.quantityDelivered, req.body.deliveryStatus, req.body.shipmentNumber, req.params.id];
42
+ const result = await query("UPDATE deliveries SET delivery_code = ?, delivery_date = ?, quantity_delivered = ?, delivery_status = ?, shipment_number = ? WHERE delivery_code = ?", values);
43
+ if (!result.affectedRows) {
44
+ return res.status(404).json({ message: "Delivery not found." });
45
+ }
46
+ return res.json({ message: "Delivery updated successfully." });
47
+ } catch {
48
+ return res.status(500).json({ message: "Failed to update delivery." });
49
+ }
50
+ };
51
+
52
+ export const remove = async (req, res) => {
53
+ try {
54
+ const result = await query("DELETE FROM deliveries WHERE delivery_code = ?", [req.params.id]);
55
+ if (!result.affectedRows) {
56
+ return res.status(404).json({ message: "Delivery not found." });
57
+ }
58
+ return res.json({ message: "Delivery deleted successfully." });
59
+ } catch {
60
+ return res.status(500).json({ message: "Failed to delete delivery." });
61
+ }
62
+ };
@@ -0,0 +1,39 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const getReports = async (req, res) => {
4
+ try {
5
+ const period = req.query.period || "daily";
6
+ const date = req.query.date || new Date().toISOString().slice(0, 10);
7
+ const startDate = req.query.startDate;
8
+ const endDate = req.query.endDate;
9
+ const month = req.query.month || date.slice(0, 7);
10
+
11
+ const suppliers = await query("SELECT * FROM suppliers");
12
+ let shipments;
13
+ let deliveries;
14
+
15
+ if (period === "daily") {
16
+ shipments = await query("SELECT * FROM shipments WHERE DATE(shipment_date) = ?", [date]);
17
+ deliveries = await query("SELECT * FROM deliveries WHERE DATE(delivery_date) = ?", [date]);
18
+ } else if (period === "weekly") {
19
+ if (!startDate || !endDate) {
20
+ return res.status(400).json({ message: "Start date and end date are required for weekly reports." });
21
+ }
22
+ shipments = await query("SELECT * FROM shipments WHERE DATE(shipment_date) BETWEEN ? AND ?", [startDate, endDate]);
23
+ deliveries = await query("SELECT * FROM deliveries WHERE DATE(delivery_date) BETWEEN ? AND ?", [startDate, endDate]);
24
+ } else {
25
+ shipments = await query(
26
+ "SELECT * FROM shipments WHERE DATE_FORMAT(shipment_date, '%Y-%m') = ?",
27
+ [month]
28
+ );
29
+ deliveries = await query(
30
+ "SELECT * FROM deliveries WHERE DATE_FORMAT(delivery_date, '%Y-%m') = ?",
31
+ [month]
32
+ );
33
+ }
34
+
35
+ return res.json({ period, reports: { suppliers, shipments, deliveries } });
36
+ } catch {
37
+ return res.status(500).json({ message: "Failed to generate reports." });
38
+ }
39
+ };
@@ -0,0 +1,62 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.shipmentNumber) return res.status(400).json({ message: "Shipment Number is required." });
6
+ if (!req.body.shipmentDate) return res.status(400).json({ message: "Shipment Date is required." });
7
+ if (!req.body.shipmentStatus) return res.status(400).json({ message: "Status is required." });
8
+ if (!req.body.destination) return res.status(400).json({ message: "Destination is required." });
9
+ if (!req.body.supplierCode) return res.status(400).json({ message: "Supplier Code is required." });
10
+ const supplier = await query("SELECT supplier_code FROM suppliers WHERE supplier_code = ?", [req.body.supplierCode]);
11
+ if (!supplier.length) return res.status(400).json({ message: "Selected supplier does not exist." });
12
+ const values = [req.body.shipmentNumber, req.body.shipmentDate, req.body.shipmentStatus, req.body.destination, req.body.supplierCode];
13
+ await query("INSERT INTO shipments (shipment_number, shipment_date, shipment_status, destination, supplier_code) VALUES (?, ?, ?, ?, ?)", values);
14
+ return res.status(201).json({ message: "Shipment added successfully." });
15
+ } catch (error) {
16
+ if (error.code === "ER_DUP_ENTRY") {
17
+ return res.status(409).json({ message: "Shipment already exists." });
18
+ }
19
+ return res.status(500).json({ message: "Failed to add shipment." });
20
+ }
21
+ };
22
+
23
+ export const getAll = async (_req, res) => {
24
+ try {
25
+ const rows = await query("SELECT * FROM shipments ORDER BY shipment_number DESC");
26
+ return res.json(rows);
27
+ } catch {
28
+ return res.status(500).json({ message: "Failed to fetch shipment records." });
29
+ }
30
+ };
31
+
32
+ export const update = async (req, res) => {
33
+ try {
34
+ if (!req.body.shipmentNumber) return res.status(400).json({ message: "Shipment Number is required." });
35
+ if (!req.body.shipmentDate) return res.status(400).json({ message: "Shipment Date is required." });
36
+ if (!req.body.shipmentStatus) return res.status(400).json({ message: "Status is required." });
37
+ if (!req.body.destination) return res.status(400).json({ message: "Destination is required." });
38
+ if (!req.body.supplierCode) return res.status(400).json({ message: "Supplier Code is required." });
39
+ const supplier = await query("SELECT supplier_code FROM suppliers WHERE supplier_code = ?", [req.body.supplierCode]);
40
+ if (!supplier.length) return res.status(400).json({ message: "Selected supplier does not exist." });
41
+ const values = [req.body.shipmentNumber, req.body.shipmentDate, req.body.shipmentStatus, req.body.destination, req.body.supplierCode, req.params.id];
42
+ const result = await query("UPDATE shipments SET shipment_number = ?, shipment_date = ?, shipment_status = ?, destination = ?, supplier_code = ? WHERE shipment_number = ?", values);
43
+ if (!result.affectedRows) {
44
+ return res.status(404).json({ message: "Shipment not found." });
45
+ }
46
+ return res.json({ message: "Shipment updated successfully." });
47
+ } catch {
48
+ return res.status(500).json({ message: "Failed to update shipment." });
49
+ }
50
+ };
51
+
52
+ export const remove = async (req, res) => {
53
+ try {
54
+ const result = await query("DELETE FROM shipments WHERE shipment_number = ?", [req.params.id]);
55
+ if (!result.affectedRows) {
56
+ return res.status(404).json({ message: "Shipment not found." });
57
+ }
58
+ return res.json({ message: "Shipment deleted successfully." });
59
+ } catch {
60
+ return res.status(500).json({ message: "Failed to delete shipment." });
61
+ }
62
+ };
@@ -0,0 +1,28 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.supplierCode) return res.status(400).json({ message: "Supplier Code is required." });
6
+ if (!req.body.supplierName) return res.status(400).json({ message: "Supplier Name is required." });
7
+ if (!req.body.telephone) return res.status(400).json({ message: "Telephone is required." });
8
+ if (!req.body.address) return res.status(400).json({ message: "Address is required." });
9
+ if (!req.body.email) return res.status(400).json({ message: "Email is required." });
10
+ const values = [req.body.supplierCode, req.body.supplierName, req.body.telephone, req.body.address, req.body.email];
11
+ await query("INSERT INTO suppliers (supplier_code, supplier_name, telephone, address, email) VALUES (?, ?, ?, ?, ?)", values);
12
+ return res.status(201).json({ message: "Supplier added successfully." });
13
+ } catch (error) {
14
+ if (error.code === "ER_DUP_ENTRY") {
15
+ return res.status(409).json({ message: "Supplier already exists." });
16
+ }
17
+ return res.status(500).json({ message: "Failed to add supplier." });
18
+ }
19
+ };
20
+
21
+ export const getAll = async (_req, res) => {
22
+ try {
23
+ const rows = await query("SELECT * FROM suppliers ORDER BY supplier_code DESC");
24
+ return res.json(rows);
25
+ } catch {
26
+ return res.status(500).json({ message: "Failed to fetch supplier records." });
27
+ }
28
+ };
@@ -0,0 +1,7 @@
1
+ CREATE DATABASE IF NOT EXISTS SCMS;
2
+ USE SCMS;
3
+ CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(120) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL);
4
+ CREATE TABLE IF NOT EXISTS suppliers (supplier_code VARCHAR(30) PRIMARY KEY, supplier_name VARCHAR(100) NOT NULL, telephone VARCHAR(20) NOT NULL, address VARCHAR(255) NOT NULL, email VARCHAR(100) NOT NULL);
5
+ CREATE TABLE IF NOT EXISTS shipments (shipment_number VARCHAR(30) PRIMARY KEY, shipment_date DATETIME NOT NULL, shipment_status VARCHAR(40) NOT NULL, destination VARCHAR(255) NOT NULL, supplier_code VARCHAR(30) NOT NULL, FOREIGN KEY (supplier_code) REFERENCES suppliers(supplier_code));
6
+ CREATE TABLE IF NOT EXISTS deliveries (delivery_code VARCHAR(30) PRIMARY KEY, delivery_date DATETIME NOT NULL, quantity_delivered INT NOT NULL, delivery_status VARCHAR(40) NOT NULL, shipment_number VARCHAR(30) NOT NULL, FOREIGN KEY (shipment_number) REFERENCES shipments(shipment_number));
7
+ INSERT INTO users (username, email, password) VALUES ('admin', 'admin@exam.local', '$2b$10$aULsUjp9bb9lf5CZZyY.7./KhwsocVO0duyPlqu0Qnte75xHBdG5C') ON DUPLICATE KEY UPDATE username = username;
@@ -0,0 +1,16 @@
1
+ import jwt from "jsonwebtoken";
2
+
3
+ const auth = (req, res, next) => {
4
+ const header = req.headers.authorization;
5
+ if (!header || !header.startsWith("Bearer ")) {
6
+ return res.status(401).json({ message: "Authentication required." });
7
+ }
8
+ try {
9
+ req.user = jwt.verify(header.split(" ")[1], process.env.JWT_SECRET || "exam_secret");
10
+ next();
11
+ } catch {
12
+ return res.status(401).json({ message: "Invalid or expired token." });
13
+ }
14
+ };
15
+
16
+ export default auth;