@zintrust/core 0.1.42 → 0.1.43

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 (365) hide show
  1. package/app/Controllers/AuthController.d.ts +10 -0
  2. package/app/Controllers/AuthController.d.ts.map +1 -0
  3. package/app/Controllers/AuthController.js +201 -0
  4. package/app/Controllers/UserController.d.ts +9 -0
  5. package/app/Controllers/UserController.d.ts.map +1 -0
  6. package/app/Controllers/UserController.js +8 -0
  7. package/app/Controllers/UserQueryBuilderController.d.ts +16 -0
  8. package/app/Controllers/UserQueryBuilderController.d.ts.map +1 -0
  9. package/app/Controllers/UserQueryBuilderController.js +404 -0
  10. package/app/Middleware/ProfilerMiddleware.d.ts +12 -0
  11. package/app/Middleware/ProfilerMiddleware.d.ts.map +1 -0
  12. package/app/Middleware/ProfilerMiddleware.js +47 -0
  13. package/app/Middleware/index.d.ts +59 -0
  14. package/app/Middleware/index.d.ts.map +1 -0
  15. package/app/Middleware/index.js +215 -0
  16. package/app/Models/Post.d.ts +14 -0
  17. package/app/Models/Post.d.ts.map +1 -0
  18. package/app/Models/Post.js +27 -0
  19. package/app/Models/User.d.ts +14 -0
  20. package/app/Models/User.d.ts.map +1 -0
  21. package/app/Models/User.js +44 -0
  22. package/app/Schedules/JobTracking.d.ts +3 -0
  23. package/app/Schedules/JobTracking.d.ts.map +1 -0
  24. package/app/Schedules/JobTracking.js +13 -0
  25. package/app/Schedules/index.d.ts +2 -0
  26. package/app/Schedules/index.d.ts.map +1 -0
  27. package/app/Schedules/index.js +1 -0
  28. package/app/Toolkit/Broadcast/sendBroadcast.d.ts +6 -0
  29. package/app/Toolkit/Broadcast/sendBroadcast.d.ts.map +1 -0
  30. package/app/Toolkit/Broadcast/sendBroadcast.js +5 -0
  31. package/app/Toolkit/Mail/sendWelcomeEmail.d.ts +6 -0
  32. package/app/Toolkit/Mail/sendWelcomeEmail.d.ts.map +1 -0
  33. package/app/Toolkit/Mail/sendWelcomeEmail.js +20 -0
  34. package/app/Toolkit/Notification/sendSlackNotification.d.ts +8 -0
  35. package/app/Toolkit/Notification/sendSlackNotification.d.ts.map +1 -0
  36. package/app/Toolkit/Notification/sendSlackNotification.js +5 -0
  37. package/app/Toolkit/Notification/sendSms.d.ts +6 -0
  38. package/app/Toolkit/Notification/sendSms.d.ts.map +1 -0
  39. package/app/Toolkit/Notification/sendSms.js +5 -0
  40. package/app/Types/controller.d.ts +42 -0
  41. package/app/Types/controller.d.ts.map +1 -0
  42. package/app/Types/controller.js +1 -0
  43. package/config/broadcast.d.ts +38 -0
  44. package/config/broadcast.d.ts.map +1 -0
  45. package/config/broadcast.js +37 -0
  46. package/config/cache.d.ts +40 -0
  47. package/config/cache.d.ts.map +1 -0
  48. package/config/cache.js +39 -0
  49. package/config/database.d.ts +58 -0
  50. package/config/database.d.ts.map +1 -0
  51. package/config/database.js +65 -0
  52. package/config/mail.d.ts +51 -0
  53. package/config/mail.d.ts.map +1 -0
  54. package/config/mail.js +69 -0
  55. package/config/middleware.d.ts +11 -0
  56. package/config/middleware.d.ts.map +1 -0
  57. package/config/middleware.js +30 -0
  58. package/config/notification.d.ts +33 -0
  59. package/config/notification.d.ts.map +1 -0
  60. package/config/notification.js +33 -0
  61. package/config/queue.d.ts +55 -0
  62. package/config/queue.d.ts.map +1 -0
  63. package/config/queue.js +87 -0
  64. package/config/storage.d.ts +59 -0
  65. package/config/storage.d.ts.map +1 -0
  66. package/config/storage.js +59 -0
  67. package/config/workers.d.ts +54 -0
  68. package/config/workers.d.ts.map +1 -0
  69. package/config/workers.js +83 -0
  70. package/package.json +11 -5
  71. package/packages/cloudflare-d1-proxy/src/index.d.ts +48 -0
  72. package/packages/cloudflare-d1-proxy/src/index.d.ts.map +1 -0
  73. package/packages/cloudflare-d1-proxy/src/index.js +387 -0
  74. package/packages/cloudflare-kv-proxy/src/index.d.ts +44 -0
  75. package/packages/cloudflare-kv-proxy/src/index.d.ts.map +1 -0
  76. package/packages/cloudflare-kv-proxy/src/index.js +325 -0
  77. package/packages/queue-monitor/src/QueueMonitoringService.d.ts +35 -0
  78. package/packages/queue-monitor/src/QueueMonitoringService.d.ts.map +1 -0
  79. package/packages/queue-monitor/src/QueueMonitoringService.js +194 -0
  80. package/packages/queue-monitor/src/connection.d.ts +3 -0
  81. package/packages/queue-monitor/src/connection.d.ts.map +1 -0
  82. package/packages/queue-monitor/src/connection.js +1 -0
  83. package/packages/queue-monitor/src/dashboard-ui.d.ts +7 -0
  84. package/packages/queue-monitor/src/dashboard-ui.d.ts.map +1 -0
  85. package/packages/queue-monitor/src/dashboard-ui.js +997 -0
  86. package/packages/queue-monitor/src/driver.d.ts +15 -0
  87. package/packages/queue-monitor/src/driver.d.ts.map +1 -0
  88. package/packages/queue-monitor/src/driver.js +115 -0
  89. package/packages/queue-monitor/src/index.d.ts +71 -0
  90. package/packages/queue-monitor/src/index.d.ts.map +1 -0
  91. package/packages/queue-monitor/src/index.js +296 -0
  92. package/packages/queue-monitor/src/metrics.d.ts +27 -0
  93. package/packages/queue-monitor/src/metrics.d.ts.map +1 -0
  94. package/packages/queue-monitor/src/metrics.js +92 -0
  95. package/packages/queue-monitor/src/worker.d.ts +8 -0
  96. package/packages/queue-monitor/src/worker.d.ts.map +1 -0
  97. package/packages/queue-monitor/src/worker.js +35 -0
  98. package/packages/queue-redis/src/BullMQRedisQueue.d.ts +26 -0
  99. package/packages/queue-redis/src/BullMQRedisQueue.d.ts.map +1 -0
  100. package/packages/queue-redis/src/BullMQRedisQueue.js +463 -0
  101. package/packages/queue-redis/src/HttpQueueDriver.d.ts +18 -0
  102. package/packages/queue-redis/src/HttpQueueDriver.d.ts.map +1 -0
  103. package/packages/queue-redis/src/HttpQueueDriver.js +249 -0
  104. package/packages/queue-redis/src/QueueHttpGateway.d.ts +16 -0
  105. package/packages/queue-redis/src/QueueHttpGateway.d.ts.map +1 -0
  106. package/packages/queue-redis/src/QueueHttpGateway.js +217 -0
  107. package/packages/queue-redis/src/RedisPublishClient.d.ts +14 -0
  108. package/packages/queue-redis/src/RedisPublishClient.d.ts.map +1 -0
  109. package/packages/queue-redis/src/RedisPublishClient.js +251 -0
  110. package/packages/queue-redis/src/index.d.ts +12 -0
  111. package/packages/queue-redis/src/index.d.ts.map +1 -0
  112. package/packages/queue-redis/src/index.js +10 -0
  113. package/packages/queue-redis/src/register.d.ts +6 -0
  114. package/packages/queue-redis/src/register.d.ts.map +1 -0
  115. package/packages/queue-redis/src/register.js +21 -0
  116. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts +11 -0
  117. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.d.ts.map +1 -0
  118. package/packages/workers/migrations/20260119100000_create_zintrust_workers_table.js +32 -0
  119. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts +11 -0
  120. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.d.ts.map +1 -0
  121. package/packages/workers/migrations/20260123180000_create_queue_jobs_table.js +46 -0
  122. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts +7 -0
  123. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.d.ts.map +1 -0
  124. package/packages/workers/migrations/20260213142000_create_zintrust_job_tracking_tables.js +44 -0
  125. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts +7 -0
  126. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.d.ts.map +1 -0
  127. package/packages/workers/migrations/20260213183000_expand_zintrust_job_tracking_reliability_tables.js +104 -0
  128. package/packages/workers/src/AnomalyDetection.d.ts +107 -0
  129. package/packages/workers/src/AnomalyDetection.d.ts.map +1 -0
  130. package/packages/workers/src/AnomalyDetection.js +329 -0
  131. package/packages/workers/src/AutoScaler.d.ts +128 -0
  132. package/packages/workers/src/AutoScaler.d.ts.map +1 -0
  133. package/packages/workers/src/AutoScaler.js +425 -0
  134. package/packages/workers/src/BroadcastWorker.d.ts +24 -0
  135. package/packages/workers/src/BroadcastWorker.d.ts.map +1 -0
  136. package/packages/workers/src/BroadcastWorker.js +24 -0
  137. package/packages/workers/src/CanaryController.d.ts +104 -0
  138. package/packages/workers/src/CanaryController.d.ts.map +1 -0
  139. package/packages/workers/src/CanaryController.js +424 -0
  140. package/packages/workers/src/ChaosEngineering.d.ts +80 -0
  141. package/packages/workers/src/ChaosEngineering.d.ts.map +1 -0
  142. package/packages/workers/src/ChaosEngineering.js +229 -0
  143. package/packages/workers/src/CircuitBreaker.d.ts +107 -0
  144. package/packages/workers/src/CircuitBreaker.d.ts.map +1 -0
  145. package/packages/workers/src/CircuitBreaker.js +374 -0
  146. package/packages/workers/src/ClusterLock.d.ts +91 -0
  147. package/packages/workers/src/ClusterLock.d.ts.map +1 -0
  148. package/packages/workers/src/ClusterLock.js +397 -0
  149. package/packages/workers/src/ComplianceManager.d.ts +178 -0
  150. package/packages/workers/src/ComplianceManager.d.ts.map +1 -0
  151. package/packages/workers/src/ComplianceManager.js +556 -0
  152. package/packages/workers/src/DatacenterOrchestrator.d.ts +134 -0
  153. package/packages/workers/src/DatacenterOrchestrator.d.ts.map +1 -0
  154. package/packages/workers/src/DatacenterOrchestrator.js +404 -0
  155. package/packages/workers/src/DeadLetterQueue.d.ts +123 -0
  156. package/packages/workers/src/DeadLetterQueue.d.ts.map +1 -0
  157. package/packages/workers/src/DeadLetterQueue.js +544 -0
  158. package/packages/workers/src/HealthMonitor.d.ts +43 -0
  159. package/packages/workers/src/HealthMonitor.d.ts.map +1 -0
  160. package/packages/workers/src/HealthMonitor.js +312 -0
  161. package/packages/workers/src/MultiQueueWorker.d.ts +90 -0
  162. package/packages/workers/src/MultiQueueWorker.d.ts.map +1 -0
  163. package/packages/workers/src/MultiQueueWorker.js +282 -0
  164. package/packages/workers/src/NotificationWorker.d.ts +24 -0
  165. package/packages/workers/src/NotificationWorker.d.ts.map +1 -0
  166. package/packages/workers/src/NotificationWorker.js +23 -0
  167. package/packages/workers/src/Observability.d.ts +154 -0
  168. package/packages/workers/src/Observability.d.ts.map +1 -0
  169. package/packages/workers/src/Observability.js +538 -0
  170. package/packages/workers/src/PluginManager.d.ts +124 -0
  171. package/packages/workers/src/PluginManager.d.ts.map +1 -0
  172. package/packages/workers/src/PluginManager.js +392 -0
  173. package/packages/workers/src/PriorityQueue.d.ts +118 -0
  174. package/packages/workers/src/PriorityQueue.d.ts.map +1 -0
  175. package/packages/workers/src/PriorityQueue.js +276 -0
  176. package/packages/workers/src/ResourceMonitor.d.ts +165 -0
  177. package/packages/workers/src/ResourceMonitor.d.ts.map +1 -0
  178. package/packages/workers/src/ResourceMonitor.js +632 -0
  179. package/packages/workers/src/SLAMonitor.d.ts +111 -0
  180. package/packages/workers/src/SLAMonitor.d.ts.map +1 -0
  181. package/packages/workers/src/SLAMonitor.js +274 -0
  182. package/packages/workers/src/WorkerFactory.d.ts +218 -0
  183. package/packages/workers/src/WorkerFactory.d.ts.map +1 -0
  184. package/packages/workers/src/WorkerFactory.js +2253 -0
  185. package/packages/workers/src/WorkerInit.d.ts +86 -0
  186. package/packages/workers/src/WorkerInit.d.ts.map +1 -0
  187. package/packages/workers/src/WorkerInit.js +307 -0
  188. package/packages/workers/src/WorkerMetrics.d.ts +116 -0
  189. package/packages/workers/src/WorkerMetrics.d.ts.map +1 -0
  190. package/packages/workers/src/WorkerMetrics.js +570 -0
  191. package/packages/workers/src/WorkerRegistry.d.ts +152 -0
  192. package/packages/workers/src/WorkerRegistry.d.ts.map +1 -0
  193. package/packages/workers/src/WorkerRegistry.js +396 -0
  194. package/packages/workers/src/WorkerShutdown.d.ts +70 -0
  195. package/packages/workers/src/WorkerShutdown.d.ts.map +1 -0
  196. package/packages/workers/src/WorkerShutdown.js +185 -0
  197. package/packages/workers/src/WorkerVersioning.d.ts +108 -0
  198. package/packages/workers/src/WorkerVersioning.d.ts.map +1 -0
  199. package/packages/workers/src/WorkerVersioning.js +300 -0
  200. package/packages/workers/src/config/workerConfig.d.ts +5 -0
  201. package/packages/workers/src/config/workerConfig.d.ts.map +1 -0
  202. package/packages/workers/src/config/workerConfig.js +25 -0
  203. package/packages/workers/src/createQueueWorker.d.ts +26 -0
  204. package/packages/workers/src/createQueueWorker.d.ts.map +1 -0
  205. package/packages/workers/src/createQueueWorker.js +367 -0
  206. package/packages/workers/src/dashboard/index.d.ts +2 -0
  207. package/packages/workers/src/dashboard/index.d.ts.map +1 -0
  208. package/packages/workers/src/dashboard/index.js +1 -0
  209. package/packages/workers/src/dashboard/types.d.ts +123 -0
  210. package/packages/workers/src/dashboard/types.d.ts.map +1 -0
  211. package/packages/workers/src/dashboard/types.js +1 -0
  212. package/packages/workers/src/dashboard/workers-api.d.ts +5 -0
  213. package/packages/workers/src/dashboard/workers-api.d.ts.map +1 -0
  214. package/packages/workers/src/dashboard/workers-api.js +738 -0
  215. package/packages/workers/src/helper/index.d.ts +6 -0
  216. package/packages/workers/src/helper/index.d.ts.map +1 -0
  217. package/packages/workers/src/helper/index.js +10 -0
  218. package/packages/workers/src/http/WorkerApiController.d.ts +39 -0
  219. package/packages/workers/src/http/WorkerApiController.d.ts.map +1 -0
  220. package/packages/workers/src/http/WorkerApiController.js +313 -0
  221. package/packages/workers/src/http/WorkerController.d.ts +375 -0
  222. package/packages/workers/src/http/WorkerController.d.ts.map +1 -0
  223. package/packages/workers/src/http/WorkerController.js +1454 -0
  224. package/packages/workers/src/http/WorkerMonitoringService.d.ts +12 -0
  225. package/packages/workers/src/http/WorkerMonitoringService.d.ts.map +1 -0
  226. package/packages/workers/src/http/WorkerMonitoringService.js +89 -0
  227. package/packages/workers/src/http/middleware/CustomValidation.d.ts +93 -0
  228. package/packages/workers/src/http/middleware/CustomValidation.d.ts.map +1 -0
  229. package/packages/workers/src/http/middleware/CustomValidation.js +270 -0
  230. package/packages/workers/src/http/middleware/DatacenterValidator.d.ts +4 -0
  231. package/packages/workers/src/http/middleware/DatacenterValidator.d.ts.map +1 -0
  232. package/packages/workers/src/http/middleware/DatacenterValidator.js +94 -0
  233. package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts +8 -0
  234. package/packages/workers/src/http/middleware/EditWorkerValidation.d.ts.map +1 -0
  235. package/packages/workers/src/http/middleware/EditWorkerValidation.js +56 -0
  236. package/packages/workers/src/http/middleware/FeaturesValidator.d.ts +4 -0
  237. package/packages/workers/src/http/middleware/FeaturesValidator.d.ts.map +1 -0
  238. package/packages/workers/src/http/middleware/FeaturesValidator.js +60 -0
  239. package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts +32 -0
  240. package/packages/workers/src/http/middleware/InfrastructureValidator.d.ts.map +1 -0
  241. package/packages/workers/src/http/middleware/InfrastructureValidator.js +226 -0
  242. package/packages/workers/src/http/middleware/OptionsValidator.d.ts +4 -0
  243. package/packages/workers/src/http/middleware/OptionsValidator.d.ts.map +1 -0
  244. package/packages/workers/src/http/middleware/OptionsValidator.js +112 -0
  245. package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts +8 -0
  246. package/packages/workers/src/http/middleware/PayloadSanitizer.d.ts.map +1 -0
  247. package/packages/workers/src/http/middleware/PayloadSanitizer.js +42 -0
  248. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts +4 -0
  249. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.d.ts.map +1 -0
  250. package/packages/workers/src/http/middleware/ProcessorPathSanitizer.js +140 -0
  251. package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts +4 -0
  252. package/packages/workers/src/http/middleware/QueueNameSanitizer.d.ts.map +1 -0
  253. package/packages/workers/src/http/middleware/QueueNameSanitizer.js +45 -0
  254. package/packages/workers/src/http/middleware/ValidateDriver.d.ts +8 -0
  255. package/packages/workers/src/http/middleware/ValidateDriver.d.ts.map +1 -0
  256. package/packages/workers/src/http/middleware/ValidateDriver.js +20 -0
  257. package/packages/workers/src/http/middleware/VersionSanitizer.d.ts +4 -0
  258. package/packages/workers/src/http/middleware/VersionSanitizer.d.ts.map +1 -0
  259. package/packages/workers/src/http/middleware/VersionSanitizer.js +25 -0
  260. package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts +4 -0
  261. package/packages/workers/src/http/middleware/WorkerNameSanitizer.d.ts.map +1 -0
  262. package/packages/workers/src/http/middleware/WorkerNameSanitizer.js +46 -0
  263. package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts +28 -0
  264. package/packages/workers/src/http/middleware/WorkerValidationChain.d.ts.map +1 -0
  265. package/packages/workers/src/http/middleware/WorkerValidationChain.js +186 -0
  266. package/packages/workers/src/index.d.ts +47 -0
  267. package/packages/workers/src/index.d.ts.map +1 -0
  268. package/packages/workers/src/index.js +48 -0
  269. package/packages/workers/src/routes/workers.d.ts +13 -0
  270. package/packages/workers/src/routes/workers.d.ts.map +1 -0
  271. package/packages/workers/src/routes/workers.js +126 -0
  272. package/packages/workers/src/storage/WorkerStore.d.ts +52 -0
  273. package/packages/workers/src/storage/WorkerStore.d.ts.map +1 -0
  274. package/packages/workers/src/storage/WorkerStore.js +259 -0
  275. package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts +47 -0
  276. package/packages/workers/src/telemetry/api/TelemetryAPI.d.ts.map +1 -0
  277. package/packages/workers/src/telemetry/api/TelemetryAPI.js +219 -0
  278. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts +18 -0
  279. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.d.ts.map +1 -0
  280. package/packages/workers/src/telemetry/api/TelemetryMonitoringService.js +140 -0
  281. package/packages/workers/src/telemetry/components/AlertPanel.d.ts +2 -0
  282. package/packages/workers/src/telemetry/components/AlertPanel.d.ts.map +1 -0
  283. package/packages/workers/src/telemetry/components/AlertPanel.js +13 -0
  284. package/packages/workers/src/telemetry/components/CostTracking.d.ts +2 -0
  285. package/packages/workers/src/telemetry/components/CostTracking.d.ts.map +1 -0
  286. package/packages/workers/src/telemetry/components/CostTracking.js +14 -0
  287. package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts +2 -0
  288. package/packages/workers/src/telemetry/components/ResourceUsageChart.d.ts.map +1 -0
  289. package/packages/workers/src/telemetry/components/ResourceUsageChart.js +11 -0
  290. package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts +2 -0
  291. package/packages/workers/src/telemetry/components/WorkerHealthChart.d.ts.map +1 -0
  292. package/packages/workers/src/telemetry/components/WorkerHealthChart.js +11 -0
  293. package/packages/workers/src/telemetry/index.d.ts +16 -0
  294. package/packages/workers/src/telemetry/index.d.ts.map +1 -0
  295. package/packages/workers/src/telemetry/index.js +60 -0
  296. package/packages/workers/src/telemetry/routes/dashboard.d.ts +7 -0
  297. package/packages/workers/src/telemetry/routes/dashboard.d.ts.map +1 -0
  298. package/packages/workers/src/telemetry/routes/dashboard.js +608 -0
  299. package/packages/workers/src/type.d.ts +77 -0
  300. package/packages/workers/src/type.d.ts.map +1 -0
  301. package/packages/workers/src/type.js +1 -0
  302. package/packages/workers/src/ui/router/EmbeddedAssets.d.ts +5 -0
  303. package/packages/workers/src/ui/router/EmbeddedAssets.d.ts.map +1 -0
  304. package/packages/workers/src/ui/router/EmbeddedAssets.js +13 -0
  305. package/packages/workers/src/ui/router/ui.d.ts +4 -0
  306. package/packages/workers/src/ui/router/ui.d.ts.map +1 -0
  307. package/packages/workers/src/ui/router/ui.js +208 -0
  308. package/packages/workers/src/ui/types/worker-ui.d.ts +230 -0
  309. package/packages/workers/src/ui/types/worker-ui.d.ts.map +1 -0
  310. package/packages/workers/src/ui/types/worker-ui.js +5 -0
  311. package/routes/api.d.ts +7 -0
  312. package/routes/api.d.ts.map +1 -0
  313. package/routes/api.js +129 -0
  314. package/routes/broadcast.d.ts +9 -0
  315. package/routes/broadcast.d.ts.map +1 -0
  316. package/routes/broadcast.js +27 -0
  317. package/routes/storage.d.ts +4 -0
  318. package/routes/storage.d.ts.map +1 -0
  319. package/routes/storage.js +35 -0
  320. package/src/cache/Cache.d.ts.map +1 -1
  321. package/src/cache/Cache.js +40 -8
  322. package/src/cache/drivers/KVRemoteDriver.d.ts +1 -1
  323. package/src/cache/drivers/KVRemoteDriver.d.ts.map +1 -1
  324. package/src/cache/drivers/KVRemoteDriver.js +259 -44
  325. package/src/cache/drivers/MemoryDriver.d.ts.map +1 -1
  326. package/src/cache/drivers/MemoryDriver.js +10 -2
  327. package/src/cache/drivers/RedisDriver.d.ts.map +1 -1
  328. package/src/cache/drivers/RedisDriver.js +256 -33
  329. package/src/cli/commands/InitContainerCommand.js +10 -10
  330. package/src/cli/commands/NewCommand.d.ts.map +1 -1
  331. package/src/cli/commands/NewCommand.js +33 -0
  332. package/src/cli/commands/StartCommand.d.ts.map +1 -1
  333. package/src/cli/commands/StartCommand.js +23 -1
  334. package/src/cli/scaffolding/ProjectScaffolder.d.ts.map +1 -1
  335. package/src/cli/scaffolding/ProjectScaffolder.js +65 -73
  336. package/src/cli/utils/DistPackager.d.ts.map +1 -1
  337. package/src/cli/utils/DistPackager.js +25 -0
  338. package/src/cli/utils/EnvFileLoader.d.ts +1 -0
  339. package/src/cli/utils/EnvFileLoader.d.ts.map +1 -1
  340. package/src/cli/utils/EnvFileLoader.js +14 -0
  341. package/src/common/RemoteSignedJson.d.ts.map +1 -1
  342. package/src/common/RemoteSignedJson.js +9 -2
  343. package/src/config/cache.js +1 -1
  344. package/src/config/env.d.ts +7 -0
  345. package/src/config/env.d.ts.map +1 -1
  346. package/src/config/env.js +8 -0
  347. package/src/config/queue.js +1 -1
  348. package/src/functions/cloudflare.d.ts.map +1 -1
  349. package/src/functions/cloudflare.js +4 -2
  350. package/src/index.js +3 -3
  351. package/src/middleware/JwtAuthMiddleware.d.ts.map +1 -1
  352. package/src/middleware/JwtAuthMiddleware.js +11 -5
  353. package/src/runtime/RuntimeAdapter.d.ts.map +1 -1
  354. package/src/runtime/RuntimeAdapter.js +30 -12
  355. package/src/runtime/adapters/CloudflareAdapter.d.ts.map +1 -1
  356. package/src/runtime/adapters/CloudflareAdapter.js +15 -4
  357. package/src/scheduler/Schedule.js +1 -1
  358. package/src/scheduler/leader/SchedulerLeader.js +1 -1
  359. package/src/schedules/job-tracking-cleanup.js +1 -1
  360. package/src/security/TokenRevocation.d.ts +19 -2
  361. package/src/security/TokenRevocation.d.ts.map +1 -1
  362. package/src/security/TokenRevocation.js +558 -30
  363. package/src/templates/project/basic/app/Controllers/AuthController.ts.tpl +11 -3
  364. package/src/templates/project/basic/config/middleware.ts.tpl +23 -22
  365. package/src/templates/project/basic/wrangler.jsonc.tpl +28 -0
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Auth Controller
3
+ * Minimal, real auth endpoints backing the example API routes.
4
+ */
5
+ import type { AuthControllerApi } from '../Types/controller';
6
+ export declare const AuthController: Readonly<{
7
+ create(): AuthControllerApi;
8
+ }>;
9
+ export default AuthController;
10
+ //# sourceMappingURL=AuthController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthController.d.ts","sourceRoot":"","sources":["../../../app/Controllers/AuthController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAuB,MAAM,uBAAuB,CAAC;AA+MpF,eAAO,MAAM,cAAc;cACf,iBAAiB;EAQ3B,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Auth Controller
3
+ * Minimal, real auth endpoints backing the example API routes.
4
+ */
5
+ import { Auth } from '../../src/auth/Auth.js';
6
+ import { User } from '../Models/User.js';
7
+ import { getString } from '../../src/common/utility.js';
8
+ import { Logger } from '../../src/config/logger.js';
9
+ import { getValidatedBody } from '../../src/http/ValidationHelper.js';
10
+ import { JwtManager } from '../../src/security/JwtManager.js';
11
+ import { TokenRevocation } from '../../src/security/TokenRevocation.js';
12
+ const pickPublicUser = (row) => {
13
+ return {
14
+ id: row.id,
15
+ name: getString(row.name),
16
+ email: getString(row.email),
17
+ };
18
+ };
19
+ /**
20
+ * Authenticates a user by email and password.
21
+ * Validates credentials against the database and returns a JWT access token on success.
22
+ * Logs all authentication attempts for security auditing.
23
+ * @param req - HTTP request containing email and password
24
+ * @param res - HTTP response to send authentication result
25
+ * @returns Promise that resolves after sending the response
26
+ */
27
+ async function login(req, res) {
28
+ const body = getValidatedBody(req);
29
+ if (!body) {
30
+ Logger.error('AuthController.login: validation middleware did not populate req.validated.body');
31
+ return res.setStatus(500).json({ error: 'Internal server error' });
32
+ }
33
+ const email = getString(body['email']);
34
+ const password = getString(body['password']);
35
+ const ipAddress = req.getRaw().socket.remoteAddress ?? 'unknown';
36
+ try {
37
+ const existing = await User.where('email', '=', email).limit(1).first();
38
+ if (existing === null) {
39
+ Logger.warn('AuthController.login: failed login attempt', {
40
+ email,
41
+ ip: ipAddress,
42
+ reason: 'user_not_found',
43
+ timestamp: new Date().toISOString(),
44
+ });
45
+ res.setStatus(401).json({ error: 'Invalid credentials' });
46
+ return;
47
+ }
48
+ const passwordHash = getString(existing.password);
49
+ const ok = await Auth.compare(password, passwordHash);
50
+ if (!ok) {
51
+ Logger.warn('AuthController.login: failed login attempt', {
52
+ email,
53
+ ip: ipAddress,
54
+ reason: 'invalid_password',
55
+ timestamp: new Date().toISOString(),
56
+ });
57
+ res.setStatus(401).json({ error: 'Invalid credentials' });
58
+ return;
59
+ }
60
+ const user = pickPublicUser(existing);
61
+ const subject = (() => {
62
+ const id = user.id;
63
+ if (typeof id === 'string' && id.length > 0)
64
+ return id;
65
+ if (typeof id === 'number' && Number.isFinite(id))
66
+ return String(id);
67
+ return undefined;
68
+ })();
69
+ const token = JwtManager.signAccessToken({
70
+ sub: subject,
71
+ email,
72
+ });
73
+ Logger.info('AuthController.login: successful login', {
74
+ userId: subject,
75
+ email,
76
+ ip: ipAddress,
77
+ timestamp: new Date().toISOString(),
78
+ });
79
+ res.json({
80
+ token,
81
+ token_type: 'Bearer',
82
+ user,
83
+ });
84
+ }
85
+ catch (error) {
86
+ Logger.error('AuthController.login: unexpected error', {
87
+ email,
88
+ ip: ipAddress,
89
+ error: error instanceof Error ? error.message : String(error),
90
+ timestamp: new Date().toISOString(),
91
+ });
92
+ res.setStatus(500).json({ error: 'Login failed' });
93
+ }
94
+ }
95
+ /**
96
+ * Registers a new user with name, email, and password.
97
+ * Validates email uniqueness, hashes password, and stores user in database.
98
+ * Returns 201 on success, 409 if email already exists.
99
+ * @param req - HTTP request containing name, email, and password
100
+ * @param res - HTTP response to send registration result
101
+ * @returns Promise that resolves after sending the response
102
+ */
103
+ async function register(req, res) {
104
+ const body = getValidatedBody(req);
105
+ if (!body) {
106
+ Logger.error('AuthController.register: validation middleware did not populate req.validated.body');
107
+ res.setStatus(500).json({ error: 'Internal server error' });
108
+ return;
109
+ }
110
+ const name = getString(body['name']);
111
+ const email = getString(body['email']);
112
+ const password = getString(body['password']);
113
+ const ipAddress = req.getRaw().socket.remoteAddress ?? 'unknown';
114
+ try {
115
+ const existing = await User.where('email', '=', email).limit(1).first();
116
+ if (existing !== null) {
117
+ Logger.warn('AuthController.register: duplicate email attempt', {
118
+ email,
119
+ ip: ipAddress,
120
+ timestamp: new Date().toISOString(),
121
+ });
122
+ res.setStatus(409).json({ error: 'Email already registered' });
123
+ return;
124
+ }
125
+ const passwordHash = await Auth.hash(password);
126
+ const result = await User.query().insert({
127
+ name,
128
+ email,
129
+ password: passwordHash,
130
+ });
131
+ let insertedUserId = result.id;
132
+ if (insertedUserId === null || insertedUserId === undefined) {
133
+ const inserted = await User.where('email', '=', email).limit(1).first();
134
+ if (inserted?.id !== null && inserted?.id !== undefined) {
135
+ insertedUserId = inserted.id;
136
+ }
137
+ }
138
+ if (insertedUserId !== null && insertedUserId !== undefined) {
139
+ Logger.info('AuthController.register: successful registration', {
140
+ user_id: insertedUserId,
141
+ email,
142
+ ip: ipAddress,
143
+ timestamp: new Date().toISOString(),
144
+ });
145
+ res.setStatus(201).json({ message: 'Registered' });
146
+ }
147
+ else {
148
+ Logger.error('Failed to retrieve inserted user ID', {
149
+ email,
150
+ ip: ipAddress,
151
+ });
152
+ res.setStatus(500).json({ error: 'Registration failed' });
153
+ }
154
+ return;
155
+ }
156
+ catch (error) {
157
+ Logger.error('AuthController.register failed', error);
158
+ res.setStatus(500).json({ error: 'Registration failed' });
159
+ }
160
+ }
161
+ /**
162
+ * Logs out the current user by revoking their JWT token.
163
+ * Extracts authorization header and marks token as revoked.
164
+ * Requires persistent token revocation store for stateless JWT validation.
165
+ * @param req - HTTP request containing authorization header with JWT token
166
+ * @param res - HTTP response to send logout confirmation
167
+ * @returns Promise that resolves after sending the response
168
+ */
169
+ async function logout(req, res) {
170
+ const authHeader = typeof req.getHeader === 'function' ? req.getHeader('authorization') : undefined;
171
+ await TokenRevocation.revoke(authHeader);
172
+ res.json({ message: 'Logged out' });
173
+ }
174
+ /**
175
+ * Refreshes the user's JWT access token.
176
+ * Generates a new token with the same claims as the current user.
177
+ * Returns 401 if user is not authenticated.
178
+ * @param req - HTTP request with user populated by authentication middleware
179
+ * @param res - HTTP response to send refreshed token
180
+ * @returns Promise that resolves after sending the response
181
+ */
182
+ async function refresh(req, res) {
183
+ const user = req.user;
184
+ if (user === undefined) {
185
+ res.setStatus(401).json({ error: 'Unauthorized' });
186
+ return;
187
+ }
188
+ const token = JwtManager.signAccessToken(user);
189
+ res.json({ token, token_type: 'Bearer' });
190
+ }
191
+ export const AuthController = Object.freeze({
192
+ create() {
193
+ return {
194
+ login,
195
+ register,
196
+ logout,
197
+ refresh,
198
+ };
199
+ },
200
+ });
201
+ export default AuthController;
@@ -0,0 +1,9 @@
1
+ /**
2
+ * User Controller (compat)
3
+ *
4
+ * This file remains for backwards-compatibility. The actual implementation is
5
+ * QueryBuilder-backed and lives in UserQueryBuilderController.
6
+ */
7
+ export { UserQueryBuilderController as UserController, UserQueryBuilderController, } from '../Controllers/UserQueryBuilderController';
8
+ export { UserQueryBuilderController as default } from '../Controllers/UserQueryBuilderController';
9
+ //# sourceMappingURL=UserController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserController.d.ts","sourceRoot":"","sources":["../../../app/Controllers/UserController.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,0BAA0B,IAAI,cAAc,EAC5C,0BAA0B,GAC3B,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,0BAA0B,IAAI,OAAO,EAAE,MAAM,6CAA6C,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * User Controller (compat)
3
+ *
4
+ * This file remains for backwards-compatibility. The actual implementation is
5
+ * QueryBuilder-backed and lives in UserQueryBuilderController.
6
+ */
7
+ export { UserQueryBuilderController as UserController, UserQueryBuilderController, } from '../Controllers/UserQueryBuilderController.js';
8
+ export { UserQueryBuilderController as default } from '../Controllers/UserQueryBuilderController.js';
@@ -0,0 +1,16 @@
1
+ /**
2
+ * User QueryBuilder Controller
3
+ * QueryBuilder-backed controller for the users resource.
4
+ */
5
+ import type { IUserController } from '../Types/controller';
6
+ /**
7
+ * User QueryBuilder Controller Factory
8
+ */
9
+ export declare const UserQueryBuilderController: {
10
+ /**
11
+ * Create a new user controller instance
12
+ */
13
+ create(): IUserController;
14
+ };
15
+ export default UserQueryBuilderController;
16
+ //# sourceMappingURL=UserQueryBuilderController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserQueryBuilderController.d.ts","sourceRoot":"","sources":["../../../app/Controllers/UserQueryBuilderController.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAmC,MAAM,uBAAuB,CAAC;AAkc9F;;GAEG;AACH,eAAO,MAAM,0BAA0B;IACrC;;OAEG;cACO,eAAe;CAG1B,CAAC;AAEF,eAAe,0BAA0B,CAAC"}
@@ -0,0 +1,404 @@
1
+ /**
2
+ * User QueryBuilder Controller
3
+ * QueryBuilder-backed controller for the users resource.
4
+ */
5
+ import { Logger, QueryBuilder, Sanitizer, Schema, Validator, getValidatedBody, nowIso, randomBytes, useDatabase, } from '../../src/index.js';
6
+ const isValidationError = (error) => {
7
+ if (typeof error !== 'object' || error === null)
8
+ return false;
9
+ const maybe = error;
10
+ return maybe.name === 'ValidationError' && typeof maybe.toObject === 'function';
11
+ };
12
+ const isSanitizerError = (error) => {
13
+ if (typeof error !== 'object' || error === null)
14
+ return false;
15
+ const maybe = error;
16
+ return maybe.name === 'SanitizerError';
17
+ };
18
+ const toJsonRecord = (value) => {
19
+ if (typeof value !== 'object' || value === null)
20
+ return {};
21
+ if (Array.isArray(value))
22
+ return {};
23
+ return value;
24
+ };
25
+ const resolveBody = (req) => {
26
+ return toJsonRecord(getValidatedBody(req) ?? req.body ?? {});
27
+ };
28
+ const getParamCompat = (req, name) => {
29
+ try {
30
+ const anyReq = req;
31
+ if (typeof anyReq.getParam === 'function')
32
+ return anyReq.getParam(name);
33
+ }
34
+ catch {
35
+ // ignore
36
+ }
37
+ const anyReq = req;
38
+ const params = anyReq.params;
39
+ if (typeof params === 'object' && params !== null)
40
+ return params[name];
41
+ return undefined;
42
+ };
43
+ const requireSelf = (req, res, userId) => {
44
+ if (typeof userId !== 'string' || userId.length === 0) {
45
+ res.status(400).json({ error: 'Missing user id' });
46
+ return false;
47
+ }
48
+ const subject = typeof req.user?.sub === 'string' ? req.user.sub : undefined;
49
+ if (subject === undefined || subject.length === 0) {
50
+ res.status(401).json({ error: 'Unauthorized' });
51
+ return false;
52
+ }
53
+ if (subject !== userId) {
54
+ res.status(403).json({ error: 'Forbidden' });
55
+ return false;
56
+ }
57
+ return true;
58
+ };
59
+ const randomInt = (min, max) => {
60
+ const lo = Math.ceil(min);
61
+ const hi = Math.floor(max);
62
+ return Math.floor(lo + Math.random() * (hi - lo + 1)); // NOSONAR is just a test utility
63
+ };
64
+ const randomName = () => {
65
+ const first = ['Alex', 'Jordan', 'Taylor', 'Sam', 'Casey', 'Riley', 'Morgan'];
66
+ const last = ['Lee', 'Kim', 'Patel', 'Garcia', 'Brown', 'Nguyen', 'Smith'];
67
+ return `${first[randomInt(0, first.length - 1)]} ${last[randomInt(0, last.length - 1)]}`;
68
+ };
69
+ const randomEmail = () => {
70
+ const n = randomInt(10000, 99999);
71
+ return `user${n}@example.com`;
72
+ };
73
+ const randomPassword = () => {
74
+ // Not cryptographically perfect UX-wise, but avoids hard-coded credentials.
75
+ // `base64url` keeps it URL-safe and reasonably short.
76
+ return randomBytes(12).toString('base64url');
77
+ };
78
+ const pickAllowed = (body, allowed) => {
79
+ const out = {};
80
+ for (const [k, v] of Object.entries(body)) {
81
+ if (allowed.has(k))
82
+ out[k] = v;
83
+ }
84
+ return out;
85
+ };
86
+ const hasUnknownKeys = (body, allowed) => {
87
+ for (const k of Object.keys(body)) {
88
+ if (!allowed.has(k))
89
+ return k;
90
+ }
91
+ return null;
92
+ };
93
+ const sanitizeUserUpdateBody = (updateBody) => {
94
+ const sanitizedUpdateBody = {};
95
+ if ('name' in updateBody) {
96
+ sanitizedUpdateBody['name'] = Sanitizer.nameText(updateBody['name']).trim();
97
+ }
98
+ if ('email' in updateBody) {
99
+ sanitizedUpdateBody['email'] = Sanitizer.email(updateBody['email']).trim().toLowerCase();
100
+ }
101
+ if ('password' in updateBody) {
102
+ sanitizedUpdateBody['password'] = Sanitizer.safePasswordChars(updateBody['password']);
103
+ }
104
+ return sanitizedUpdateBody;
105
+ };
106
+ const buildUserUpdateSchema = () => {
107
+ return Schema.create()
108
+ .custom('name', (v) => v === undefined || typeof v === 'string', 'name must be a string')
109
+ .minLength('name', 1)
110
+ .custom('email', (v) => v === undefined || typeof v === 'string', 'email must be a string')
111
+ .custom('password', (v) => v === undefined || typeof v === 'string', 'password must be a string')
112
+ .minLength('password', 8);
113
+ };
114
+ const buildUserStoreSchema = () => {
115
+ return Schema.create()
116
+ .custom('name', (v) => typeof v === 'string', 'name must be a string')
117
+ .minLength('name', 1)
118
+ .custom('email', (v) => typeof v === 'string', 'email must be a string')
119
+ .email('email')
120
+ .custom('password', (v) => typeof v === 'string', 'password must be a string')
121
+ .minLength('password', 8);
122
+ };
123
+ /**
124
+ * User Controller Methods
125
+ */
126
+ const userControllerMethods = {
127
+ /**
128
+ * List all users
129
+ * GET /users
130
+ */
131
+ async index(req, res) {
132
+ try {
133
+ const subject = typeof req.user?.sub === 'string' ? req.user.sub : undefined;
134
+ if (subject === undefined || subject.length === 0) {
135
+ res.status(401).json({ error: 'Unauthorized' });
136
+ return;
137
+ }
138
+ const db = useDatabase();
139
+ const users = await QueryBuilder.create('users', db)
140
+ .select('id', 'name', 'email', 'created_at', 'updated_at')
141
+ .where('id', '=', subject)
142
+ .limit(1)
143
+ .get();
144
+ res.json({ data: users });
145
+ }
146
+ catch (error) {
147
+ Logger.error('Error fetching users:', error);
148
+ res.status(500).json({ error: 'Failed to fetch users' });
149
+ }
150
+ },
151
+ /**
152
+ * Show a specific user
153
+ * GET /users/:id
154
+ */
155
+ async show(req, res) {
156
+ try {
157
+ const db = useDatabase();
158
+ const rawId = getParamCompat(req, 'id');
159
+ const id = Sanitizer.digitsOnly(rawId); // Zero trust protection for db id
160
+ if (typeof id !== 'string' || id.length === 0) {
161
+ // ✅ Good
162
+ res.status(400).json({ error: 'Missing user id' });
163
+ return;
164
+ }
165
+ if (!requireSelf(req, res, id))
166
+ return;
167
+ const user = await QueryBuilder.create('users', db)
168
+ .select('id', 'name', 'email', 'created_at', 'updated_at')
169
+ .where('id', '=', id)
170
+ .limit(1)
171
+ .first();
172
+ if (user === null) {
173
+ res.status(404).json({ error: 'User not found' });
174
+ return;
175
+ }
176
+ res.json({ data: user });
177
+ }
178
+ catch (error) {
179
+ if (isSanitizerError(error)) {
180
+ res.status(400).json({ error: error.message });
181
+ return;
182
+ }
183
+ Logger.error('Error fetching user:', error);
184
+ res.status(500).json({ error: 'Failed to fetch user' });
185
+ }
186
+ },
187
+ /**
188
+ * Show create form
189
+ * GET /users/create
190
+ */
191
+ async create(_req, res) {
192
+ res.json({ form: 'Create User Form' });
193
+ },
194
+ /**
195
+ * Store a new user
196
+ * POST /users
197
+ */
198
+ async store(req, res) {
199
+ try {
200
+ // Use validated body if available (already sanitized by middleware), otherwise fallback to raw
201
+ const body = resolveBody(req);
202
+ const required = ['name', 'email', 'password'];
203
+ const missing = {};
204
+ for (const key of required) {
205
+ const val = body[key];
206
+ if (typeof val !== 'string' || val.trim() === '') {
207
+ missing[key] = ['Required'];
208
+ }
209
+ }
210
+ if (Object.keys(missing).length > 0) {
211
+ res.status(422).json({ errors: missing });
212
+ return;
213
+ }
214
+ // Trust middleware for sanitization if validation passed.
215
+ // If we are here, validation ostensibly passed or we are in a context where we must self-validate.
216
+ // To satisfy defense-in-depth without double-sanitization bottleneck:
217
+ // We assume body is safe-ish if it came from resolved validated body.
218
+ // But to be explicit and type-safe, we cast or read fields directly.
219
+ const db = useDatabase();
220
+ const ts = nowIso();
221
+ // Apply bulletproof sanitization for defense-in-depth
222
+ const name = Sanitizer.nameText(body['name']);
223
+ const email = Sanitizer.email(body['email']);
224
+ const password = Sanitizer.safePasswordChars(body['password']);
225
+ Validator.validate({ name, email, password }, buildUserStoreSchema());
226
+ await QueryBuilder.create('users', db).insert({
227
+ name,
228
+ email,
229
+ password, // Hashing should be handled by model/service or here if raw
230
+ created_at: ts,
231
+ updated_at: ts,
232
+ });
233
+ res.status(201).json({ message: 'User created' });
234
+ }
235
+ catch (error) {
236
+ if (isSanitizerError(error)) {
237
+ res.status(400).json({ error: error.message });
238
+ return;
239
+ }
240
+ if (isValidationError(error)) {
241
+ res.status(422).json({ errors: error.toObject?.() ?? {} });
242
+ return;
243
+ }
244
+ Logger.error('Error creating user:', error);
245
+ res.status(500).json({ error: 'Failed to create user' });
246
+ }
247
+ },
248
+ /**
249
+ * Fill users table with random users
250
+ * POST /users/fill
251
+ */
252
+ async fill(req, res) {
253
+ try {
254
+ const body = resolveBody(req);
255
+ const countVal = body['count'];
256
+ // Ensure count is a number (middleware validation handles this, but we double check or default)
257
+ let count = typeof countVal === 'number' ? countVal : 10;
258
+ if (count < 1)
259
+ count = 1;
260
+ if (count > 100)
261
+ count = 100;
262
+ const db = useDatabase();
263
+ const ts = nowIso();
264
+ // Optimize: Bulk insert instead of N+1 inserts to reduce IO bottleneck and memory overhead
265
+ const users = Array.from({ length: count }, () => ({
266
+ name: randomName(),
267
+ email: randomEmail(),
268
+ password: randomPassword(),
269
+ created_at: ts,
270
+ updated_at: ts,
271
+ }));
272
+ await QueryBuilder.create('users', db).insert(users);
273
+ res.status(201).json({ message: 'Users filled', count });
274
+ }
275
+ catch (error) {
276
+ Logger.error('Error filling users:', error);
277
+ res.status(500).json({ error: 'Failed to fill users' });
278
+ }
279
+ },
280
+ /**
281
+ * Show edit form
282
+ * GET /users/:id/edit
283
+ */
284
+ async edit(_req, res) {
285
+ try {
286
+ res.json({ form: 'Edit User Form' });
287
+ }
288
+ catch (error) {
289
+ Logger.error('Error loading edit form:', error);
290
+ res.status(500).json({ error: 'Failed to load edit form' });
291
+ }
292
+ },
293
+ /**
294
+ * Update a user
295
+ * PUT /users/:id
296
+ */
297
+ async update(req, res) {
298
+ // NOSONAR bulletproof sanitization requires explicit validation steps
299
+ try {
300
+ const db = useDatabase();
301
+ const rawId = getParamCompat(req, 'id');
302
+ const id = Sanitizer.digitsOnly(rawId);
303
+ if (typeof id !== 'string' || id.length === 0) {
304
+ res.status(400).json({ error: 'Missing user id' });
305
+ return;
306
+ }
307
+ if (!requireSelf(req, res, id))
308
+ return;
309
+ const allowed = new Set(['name', 'email', 'password']);
310
+ const body = resolveBody(req);
311
+ const unknown = hasUnknownKeys(body, allowed);
312
+ if (unknown !== null) {
313
+ res.status(422).json({ errors: { [unknown]: ['Unknown field'] } });
314
+ return;
315
+ }
316
+ const updateBody = pickAllowed(body, allowed);
317
+ if (Object.keys(updateBody).length === 0) {
318
+ res.status(422).json({ errors: { body: ['No fields to update'] } });
319
+ return;
320
+ }
321
+ const sanitizedUpdateBody = sanitizeUserUpdateBody(updateBody);
322
+ Validator.validate(sanitizedUpdateBody, buildUserUpdateSchema());
323
+ const existing = await QueryBuilder.create('users', db)
324
+ .select('id')
325
+ .where('id', '=', id)
326
+ .limit(1)
327
+ .first();
328
+ if (existing === null) {
329
+ res.status(404).json({ error: 'User not found' });
330
+ return;
331
+ }
332
+ const ts = nowIso();
333
+ await QueryBuilder.create('users', db)
334
+ .where('id', '=', id)
335
+ .update({ ...sanitizedUpdateBody, updated_at: ts });
336
+ const user = await QueryBuilder.create('users', db)
337
+ .select('id', 'name', 'email', 'created_at', 'updated_at')
338
+ .where('id', '=', id)
339
+ .limit(1)
340
+ .first();
341
+ res.json({ message: 'User updated', user });
342
+ }
343
+ catch (error) {
344
+ if (isSanitizerError(error)) {
345
+ res.status(400).json({ error: error.message });
346
+ return;
347
+ }
348
+ if (isValidationError(error)) {
349
+ res.status(422).json({ errors: error.toObject?.() ?? {} });
350
+ return;
351
+ }
352
+ Logger.error('Error updating user:', error);
353
+ res.status(500).json({ error: 'Failed to update user' });
354
+ }
355
+ },
356
+ /**
357
+ * Delete a user
358
+ * DELETE /users/:id
359
+ */
360
+ async destroy(req, res) {
361
+ try {
362
+ const db = useDatabase();
363
+ const rawId = getParamCompat(req, 'id');
364
+ const id = Sanitizer.digitsOnly(rawId);
365
+ if (typeof id !== 'string' || id.length === 0) {
366
+ res.status(400).json({ error: 'Missing user id' });
367
+ return;
368
+ }
369
+ if (!requireSelf(req, res, id))
370
+ return;
371
+ const existing = await QueryBuilder.create('users', db)
372
+ .select('id')
373
+ .where('id', '=', id)
374
+ .limit(1)
375
+ .first();
376
+ if (existing === null) {
377
+ res.status(404).json({ error: 'User not found' });
378
+ return;
379
+ }
380
+ await QueryBuilder.create('users', db).where('id', '=', id).delete();
381
+ res.json({ message: 'User deleted' });
382
+ }
383
+ catch (error) {
384
+ if (isSanitizerError(error)) {
385
+ res.status(400).json({ error: error.message });
386
+ return;
387
+ }
388
+ Logger.error('Error deleting user:', error);
389
+ res.status(500).json({ error: 'Failed to delete user' });
390
+ }
391
+ },
392
+ };
393
+ /**
394
+ * User QueryBuilder Controller Factory
395
+ */
396
+ export const UserQueryBuilderController = {
397
+ /**
398
+ * Create a new user controller instance
399
+ */
400
+ create() {
401
+ return userControllerMethods;
402
+ },
403
+ };
404
+ export default UserQueryBuilderController;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Profiler Middleware
3
+ * Enables request profiling when ENABLE_PROFILER environment variable is set
4
+ */
5
+ import type { Middleware } from '../../src/middleware/MiddlewareStack';
6
+ /**
7
+ * ProfilerMiddleware wraps request execution with performance profiling
8
+ * Enabled via ENABLE_PROFILER=true environment variable
9
+ * Attaches profiling report to response headers
10
+ */
11
+ export declare const ProfilerMiddleware: Middleware;
12
+ //# sourceMappingURL=ProfilerMiddleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfilerMiddleware.d.ts","sourceRoot":"","sources":["../../../app/Middleware/ProfilerMiddleware.ts"],"names":[],"mappings":"AACA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,UAwChC,CAAC"}