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,6 @@
1
+ import { Router } from "express";
2
+ import { create, getAll } from "../controllers/productController.js";
3
+ const router = Router();
4
+ router.post("/", create);
5
+ router.get("/", getAll);
6
+ 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/transactionController.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/warehouseController.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 productRoutes from "./routes/productRoutes.js";
9
+ import warehouseRoutes from "./routes/warehouseRoutes.js";
10
+ import transactionRoutes from "./routes/transactionRoutes.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/products", auth, productRoutes);
26
+ app.use("/api/warehouses", auth, warehouseRoutes);
27
+ app.use("/api/transactions", auth, transactionRoutes);
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=SMS
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=SMS
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 || "SMS",
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,30 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
6
+ if (!req.body.productName) return res.status(400).json({ message: "Product Name is required." });
7
+ if (!req.body.category) return res.status(400).json({ message: "Category is required." });
8
+ if (req.body.quantityInStock === undefined || req.body.quantityInStock === "") return res.status(400).json({ message: "Quantity In Stock is required." });
9
+ if (req.body.unitPrice === undefined || req.body.unitPrice === "") return res.status(400).json({ message: "Unit Price is required." });
10
+ if (!req.body.supplierName) return res.status(400).json({ message: "Supplier Name is required." });
11
+ if (!req.body.dateReceived) return res.status(400).json({ message: "Date Received is required." });
12
+ const values = [req.body.productCode, req.body.productName, req.body.category, req.body.quantityInStock, req.body.unitPrice, req.body.supplierName, req.body.dateReceived];
13
+ await query("INSERT INTO products (product_code, product_name, category, quantity_in_stock, unit_price, supplier_name, date_received) VALUES (?, ?, ?, ?, ?, ?, ?)", values);
14
+ return res.status(201).json({ message: "Product added successfully." });
15
+ } catch (error) {
16
+ if (error.code === "ER_DUP_ENTRY") {
17
+ return res.status(409).json({ message: "Product already exists." });
18
+ }
19
+ return res.status(500).json({ message: "Failed to add product." });
20
+ }
21
+ };
22
+
23
+ export const getAll = async (_req, res) => {
24
+ try {
25
+ const rows = await query("SELECT * FROM products ORDER BY product_code DESC");
26
+ return res.json(rows);
27
+ } catch {
28
+ return res.status(500).json({ message: "Failed to fetch product records." });
29
+ }
30
+ };
@@ -0,0 +1,53 @@
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 products = await query("SELECT * FROM products");
12
+ const warehouses = await query("SELECT * FROM warehouses");
13
+
14
+ let stockIn;
15
+ let stockOut;
16
+
17
+ if (period === "daily") {
18
+ stockIn = await query(
19
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'IN' AND DATE(transaction_date) = ?",
20
+ [date]
21
+ );
22
+ stockOut = await query(
23
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'OUT' AND DATE(transaction_date) = ?",
24
+ [date]
25
+ );
26
+ } else if (period === "weekly") {
27
+ if (!startDate || !endDate) {
28
+ return res.status(400).json({ message: "Start date and end date are required for weekly reports." });
29
+ }
30
+ stockIn = await query(
31
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'IN' AND DATE(transaction_date) BETWEEN ? AND ?",
32
+ [startDate, endDate]
33
+ );
34
+ stockOut = await query(
35
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'OUT' AND DATE(transaction_date) BETWEEN ? AND ?",
36
+ [startDate, endDate]
37
+ );
38
+ } else {
39
+ stockIn = await query(
40
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'IN' AND DATE_FORMAT(transaction_date, '%Y-%m') = ?",
41
+ [month]
42
+ );
43
+ stockOut = await query(
44
+ "SELECT * FROM stock_transactions WHERE transaction_type = 'OUT' AND DATE_FORMAT(transaction_date, '%Y-%m') = ?",
45
+ [month]
46
+ );
47
+ }
48
+
49
+ return res.json({ period, reports: { products, warehouses, stockIn, stockOut } });
50
+ } catch {
51
+ return res.status(500).json({ message: "Failed to generate reports." });
52
+ }
53
+ };
@@ -0,0 +1,70 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ const validateRefs = async (productCode, warehouseCode) => {
4
+ const product = await query("SELECT product_code FROM products WHERE product_code = ?", [productCode]);
5
+ if (!product.length) return "Selected product does not exist.";
6
+ const warehouse = await query("SELECT warehouse_code FROM warehouses WHERE warehouse_code = ?", [warehouseCode]);
7
+ if (!warehouse.length) return "Selected warehouse does not exist.";
8
+ return null;
9
+ };
10
+
11
+ export const create = async (req, res) => {
12
+ try {
13
+ if (!req.body.transactionDate) return res.status(400).json({ message: "Transaction Date is required." });
14
+ if (req.body.quantityMoved === undefined || req.body.quantityMoved === "") return res.status(400).json({ message: "Quantity Moved is required." });
15
+ if (!req.body.transactionType) return res.status(400).json({ message: "Type (IN/OUT) is required." });
16
+ if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
17
+ if (!req.body.warehouseCode) return res.status(400).json({ message: "Warehouse Code is required." });
18
+ const refError = await validateRefs(req.body.productCode, req.body.warehouseCode);
19
+ if (refError) return res.status(400).json({ message: refError });
20
+ const values = [req.body.transactionDate, req.body.quantityMoved, req.body.transactionType, req.body.productCode, req.body.warehouseCode];
21
+ await query("INSERT INTO stock_transactions (transaction_date, quantity_moved, transaction_type, product_code, warehouse_code) VALUES (?, ?, ?, ?, ?)", values);
22
+ return res.status(201).json({ message: "Transaction added successfully." });
23
+ } catch (error) {
24
+ if (error.code === "ER_DUP_ENTRY") {
25
+ return res.status(409).json({ message: "Transaction already exists." });
26
+ }
27
+ return res.status(500).json({ message: "Failed to add transaction." });
28
+ }
29
+ };
30
+
31
+ export const getAll = async (_req, res) => {
32
+ try {
33
+ const rows = await query("SELECT * FROM stock_transactions ORDER BY transaction_id DESC");
34
+ return res.json(rows);
35
+ } catch {
36
+ return res.status(500).json({ message: "Failed to fetch transaction records." });
37
+ }
38
+ };
39
+
40
+ export const update = async (req, res) => {
41
+ try {
42
+ if (!req.body.transactionDate) return res.status(400).json({ message: "Transaction Date is required." });
43
+ if (req.body.quantityMoved === undefined || req.body.quantityMoved === "") return res.status(400).json({ message: "Quantity Moved is required." });
44
+ if (!req.body.transactionType) return res.status(400).json({ message: "Type (IN/OUT) is required." });
45
+ if (!req.body.productCode) return res.status(400).json({ message: "Product Code is required." });
46
+ if (!req.body.warehouseCode) return res.status(400).json({ message: "Warehouse Code is required." });
47
+ const refError = await validateRefs(req.body.productCode, req.body.warehouseCode);
48
+ if (refError) return res.status(400).json({ message: refError });
49
+ const values = [req.body.transactionDate, req.body.quantityMoved, req.body.transactionType, req.body.productCode, req.body.warehouseCode, req.params.id];
50
+ const result = await query("UPDATE stock_transactions SET transaction_date = ?, quantity_moved = ?, transaction_type = ?, product_code = ?, warehouse_code = ? WHERE transaction_id = ?", values);
51
+ if (!result.affectedRows) {
52
+ return res.status(404).json({ message: "Transaction not found." });
53
+ }
54
+ return res.json({ message: "Transaction updated successfully." });
55
+ } catch {
56
+ return res.status(500).json({ message: "Failed to update transaction." });
57
+ }
58
+ };
59
+
60
+ export const remove = async (req, res) => {
61
+ try {
62
+ const result = await query("DELETE FROM stock_transactions WHERE transaction_id = ?", [req.params.id]);
63
+ if (!result.affectedRows) {
64
+ return res.status(404).json({ message: "Transaction not found." });
65
+ }
66
+ return res.json({ message: "Transaction deleted successfully." });
67
+ } catch {
68
+ return res.status(500).json({ message: "Failed to delete transaction." });
69
+ }
70
+ };
@@ -0,0 +1,26 @@
1
+ import { query } from "../config/db.js";
2
+
3
+ export const create = async (req, res) => {
4
+ try {
5
+ if (!req.body.warehouseCode) return res.status(400).json({ message: "Warehouse Code is required." });
6
+ if (!req.body.warehouseName) return res.status(400).json({ message: "Warehouse Name is required." });
7
+ if (!req.body.warehouseLocation) return res.status(400).json({ message: "Location is required." });
8
+ const values = [req.body.warehouseCode, req.body.warehouseName, req.body.warehouseLocation];
9
+ await query("INSERT INTO warehouses (warehouse_code, warehouse_name, warehouse_location) VALUES (?, ?, ?)", values);
10
+ return res.status(201).json({ message: "Warehouse added successfully." });
11
+ } catch (error) {
12
+ if (error.code === "ER_DUP_ENTRY") {
13
+ return res.status(409).json({ message: "Warehouse already exists." });
14
+ }
15
+ return res.status(500).json({ message: "Failed to add warehouse." });
16
+ }
17
+ };
18
+
19
+ export const getAll = async (_req, res) => {
20
+ try {
21
+ const rows = await query("SELECT * FROM warehouses ORDER BY warehouse_code DESC");
22
+ return res.json(rows);
23
+ } catch {
24
+ return res.status(500).json({ message: "Failed to fetch warehouse records." });
25
+ }
26
+ };
@@ -0,0 +1,40 @@
1
+ CREATE DATABASE IF NOT EXISTS SMS;
2
+ USE SMS;
3
+
4
+ CREATE TABLE IF NOT EXISTS users (
5
+ id INT AUTO_INCREMENT PRIMARY KEY,
6
+ username VARCHAR(50) NOT NULL UNIQUE,
7
+ email VARCHAR(120) NOT NULL UNIQUE,
8
+ password VARCHAR(255) NOT NULL
9
+ );
10
+
11
+ CREATE TABLE IF NOT EXISTS products (
12
+ product_code VARCHAR(30) PRIMARY KEY,
13
+ product_name VARCHAR(100) NOT NULL,
14
+ category VARCHAR(80) NOT NULL,
15
+ quantity_in_stock INT NOT NULL DEFAULT 0,
16
+ unit_price DECIMAL(12,2) NOT NULL,
17
+ supplier_name VARCHAR(100) NOT NULL,
18
+ date_received DATE NOT NULL
19
+ );
20
+
21
+ CREATE TABLE IF NOT EXISTS warehouses (
22
+ warehouse_code VARCHAR(30) PRIMARY KEY,
23
+ warehouse_name VARCHAR(100) NOT NULL,
24
+ warehouse_location VARCHAR(255) NOT NULL
25
+ );
26
+
27
+ CREATE TABLE IF NOT EXISTS stock_transactions (
28
+ transaction_id INT AUTO_INCREMENT PRIMARY KEY,
29
+ transaction_date DATETIME NOT NULL,
30
+ quantity_moved INT NOT NULL,
31
+ transaction_type ENUM('IN','OUT') NOT NULL,
32
+ product_code VARCHAR(30) NOT NULL,
33
+ warehouse_code VARCHAR(30) NOT NULL,
34
+ FOREIGN KEY (product_code) REFERENCES products(product_code),
35
+ FOREIGN KEY (warehouse_code) REFERENCES warehouses(warehouse_code)
36
+ );
37
+
38
+ INSERT INTO users (username, email, password)
39
+ VALUES ('admin', 'admin@exam.local', '$2b$10$aULsUjp9bb9lf5CZZyY.7./KhwsocVO0duyPlqu0Qnte75xHBdG5C')
40
+ 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;