jcc-express-mvc 1.8.7 → 1.8.21

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 (296) hide show
  1. package/Core/index.d.ts +4 -0
  2. package/Core/index.d.ts.map +1 -1
  3. package/Core/index.js +5 -0
  4. package/__tests__/Job.test.d.ts +2 -0
  5. package/__tests__/Job.test.d.ts.map +1 -0
  6. package/__tests__/Job.test.js +205 -0
  7. package/__tests__/MySqlSchemaBlueprint.test.d.ts +2 -0
  8. package/__tests__/MySqlSchemaBlueprint.test.d.ts.map +1 -0
  9. package/__tests__/MySqlSchemaBlueprint.test.js +55 -0
  10. package/__tests__/PostgresTranslator.test.d.ts +2 -0
  11. package/__tests__/PostgresTranslator.test.d.ts.map +1 -0
  12. package/__tests__/PostgresTranslator.test.js +82 -0
  13. package/__tests__/SQLiteTranslator.test.d.ts +2 -0
  14. package/__tests__/SQLiteTranslator.test.d.ts.map +1 -0
  15. package/__tests__/SQLiteTranslator.test.js +125 -0
  16. package/__tests__/SchemaAlterBlueprint.test.d.ts +2 -0
  17. package/__tests__/SchemaAlterBlueprint.test.d.ts.map +1 -0
  18. package/__tests__/SchemaAlterBlueprint.test.js +35 -0
  19. package/global.d.ts +3 -1
  20. package/index.d.ts +28 -3
  21. package/index.d.ts.map +1 -1
  22. package/index.js +33 -75
  23. package/lib/Application/Application.d.ts.map +1 -1
  24. package/lib/Application/Application.js +2 -2
  25. package/lib/Application/ApplicationBuilder.d.ts.map +1 -1
  26. package/lib/Application/ApplicationBuilder.js +22 -11
  27. package/lib/Auth/AuthMiddleware.d.ts.map +1 -1
  28. package/lib/Auth/AuthMiddleware.js +29 -12
  29. package/lib/Auth/index.d.ts +17 -3
  30. package/lib/Auth/index.d.ts.map +1 -1
  31. package/lib/Auth/index.js +128 -26
  32. package/lib/Auth/loginRateLimit.d.ts +6 -0
  33. package/lib/Auth/loginRateLimit.d.ts.map +1 -0
  34. package/lib/Auth/loginRateLimit.js +25 -0
  35. package/lib/Auth/refreshTokenStore.d.ts +24 -0
  36. package/lib/Auth/refreshTokenStore.d.ts.map +1 -0
  37. package/lib/Auth/refreshTokenStore.js +46 -0
  38. package/lib/Command-Line/DBCommand.d.ts.map +1 -1
  39. package/lib/Command-Line/DBCommand.js +9 -3
  40. package/lib/Command-Line/KeyGenerateCommand.d.ts +6 -0
  41. package/lib/Command-Line/KeyGenerateCommand.d.ts.map +1 -0
  42. package/lib/Command-Line/KeyGenerateCommand.js +47 -0
  43. package/lib/Command-Line/MakeCommand.d.ts +1 -0
  44. package/lib/Command-Line/MakeCommand.d.ts.map +1 -1
  45. package/lib/Command-Line/MakeCommand.js +36 -32
  46. package/lib/Command-Line/NodeArtisanCommand.d.ts +2 -0
  47. package/lib/Command-Line/NodeArtisanCommand.d.ts.map +1 -1
  48. package/lib/Command-Line/NodeArtisanCommand.js +24 -6
  49. package/lib/Command-Line/NodeTinker/Tinker.d.ts +5 -2
  50. package/lib/Command-Line/NodeTinker/Tinker.d.ts.map +1 -1
  51. package/lib/Command-Line/NodeTinker/Tinker.js +13 -3
  52. package/lib/Command-Line/WatchCommand.d.ts +29 -0
  53. package/lib/Command-Line/WatchCommand.d.ts.map +1 -0
  54. package/lib/Command-Line/WatchCommand.js +234 -0
  55. package/lib/Command-Line/files/Models.d.ts.map +1 -1
  56. package/lib/Command-Line/files/Models.js +67 -0
  57. package/lib/Console/Command.d.ts +18 -0
  58. package/lib/Console/Command.d.ts.map +1 -1
  59. package/lib/Console/Command.js +29 -0
  60. package/lib/Container/index.d.ts.map +1 -1
  61. package/lib/Container/index.js +22 -8
  62. package/lib/Database/Database.d.ts +21 -0
  63. package/lib/Database/Database.d.ts.map +1 -0
  64. package/lib/Database/Database.js +55 -0
  65. package/lib/Database/DatabaseServiceProvider.d.ts +22 -0
  66. package/lib/Database/DatabaseServiceProvider.d.ts.map +1 -0
  67. package/lib/Database/DatabaseServiceProvider.js +50 -0
  68. package/lib/Database/Drivers/KnexDriver.d.ts +13 -0
  69. package/lib/Database/Drivers/KnexDriver.d.ts.map +1 -0
  70. package/lib/Database/Drivers/KnexDriver.js +29 -0
  71. package/lib/Database/Drivers/MongooseDriver.d.ts +20 -0
  72. package/lib/Database/Drivers/MongooseDriver.d.ts.map +1 -0
  73. package/lib/Database/Drivers/MongooseDriver.js +57 -0
  74. package/lib/Database/Drivers/SequelizeDriver.d.ts +24 -0
  75. package/lib/Database/Drivers/SequelizeDriver.d.ts.map +1 -0
  76. package/lib/Database/Drivers/SequelizeDriver.js +82 -0
  77. package/lib/Database/index.d.ts +7 -0
  78. package/lib/Database/index.d.ts.map +1 -0
  79. package/lib/Database/index.js +11 -0
  80. package/lib/Database/interface.d.ts +14 -0
  81. package/lib/Database/interface.d.ts.map +1 -0
  82. package/lib/Database/interface.js +2 -0
  83. package/lib/Database/type.d.ts +18 -0
  84. package/lib/Database/type.d.ts.map +1 -0
  85. package/lib/Database/type.js +2 -0
  86. package/lib/Error/DisplayErrorCode.d.ts.map +1 -1
  87. package/lib/Error/DisplayErrorCode.js +27 -17
  88. package/lib/Error/MissMatchTokenException/index.d.ts +4 -0
  89. package/lib/Error/MissMatchTokenException/index.d.ts.map +1 -0
  90. package/lib/Error/MissMatchTokenException/index.js +9 -0
  91. package/lib/Error/SocialiteAuthError/SocialiteAuthError.d.ts +9 -0
  92. package/lib/Error/SocialiteAuthError/SocialiteAuthError.d.ts.map +1 -0
  93. package/lib/Error/SocialiteAuthError/SocialiteAuthError.js +17 -0
  94. package/lib/Global/helpers.d.ts.map +1 -1
  95. package/lib/Global/helpers.js +7 -6
  96. package/lib/Http/index.d.ts +3 -1
  97. package/lib/Http/index.d.ts.map +1 -1
  98. package/lib/Http/index.js +26 -5
  99. package/lib/Interface/index.d.ts +17 -3
  100. package/lib/Interface/index.d.ts.map +1 -1
  101. package/lib/Jcc-eloquent/lib/Builder.d.ts +12 -1
  102. package/lib/Jcc-eloquent/lib/Builder.d.ts.map +1 -1
  103. package/lib/Jcc-eloquent/lib/Builder.js +119 -5
  104. package/lib/Jcc-eloquent/lib/Database/index.d.ts.map +1 -1
  105. package/lib/Jcc-eloquent/lib/Database/index.js +2 -1
  106. package/lib/Jcc-eloquent/lib/Interfaces/index.d.ts +37 -2
  107. package/lib/Jcc-eloquent/lib/Interfaces/index.d.ts.map +1 -1
  108. package/lib/Jcc-eloquent/lib/Migration.d.ts +6 -0
  109. package/lib/Jcc-eloquent/lib/Migration.d.ts.map +1 -1
  110. package/lib/Jcc-eloquent/lib/Migration.js +24 -2
  111. package/lib/Jcc-eloquent/lib/Model.d.ts +24 -7
  112. package/lib/Jcc-eloquent/lib/Model.d.ts.map +1 -1
  113. package/lib/Jcc-eloquent/lib/Model.js +35 -2
  114. package/lib/Jcc-eloquent/lib/QueryBuilder.d.ts +2 -1
  115. package/lib/Jcc-eloquent/lib/QueryBuilder.d.ts.map +1 -1
  116. package/lib/Jcc-eloquent/lib/QueryBuilder.js +10 -1
  117. package/lib/Jcc-eloquent/lib/Rollback.d.ts.map +1 -1
  118. package/lib/Jcc-eloquent/lib/Rollback.js +9 -2
  119. package/lib/Jcc-eloquent/lib/Schema/BaseSchemaEntity/index.d.ts.map +1 -1
  120. package/lib/Jcc-eloquent/lib/Schema/BaseSchemaEntity/index.js +3 -3
  121. package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.d.ts +6 -2
  122. package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.d.ts.map +1 -1
  123. package/lib/Jcc-eloquent/lib/Schema/BluePrint/index.js +41 -12
  124. package/lib/Jcc-eloquent/lib/Schema/Translator/Sqlite.d.ts.map +1 -1
  125. package/lib/Jcc-eloquent/lib/Schema/Translator/Sqlite.js +21 -3
  126. package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.d.ts +1 -0
  127. package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.d.ts.map +1 -1
  128. package/lib/Jcc-eloquent/lib/Schema/Translator/postgres.js +70 -14
  129. package/lib/Jcc-eloquent/lib/Schema/index.d.ts +12 -0
  130. package/lib/Jcc-eloquent/lib/Schema/index.d.ts.map +1 -1
  131. package/lib/Jcc-eloquent/lib/Schema/index.js +27 -6
  132. package/lib/Jcc-eloquent/lib/utils/index.d.ts +13 -0
  133. package/lib/Jcc-eloquent/lib/utils/index.d.ts.map +1 -1
  134. package/lib/Jcc-eloquent/lib/utils/index.js +62 -0
  135. package/lib/Middleware/index.d.ts +1 -0
  136. package/lib/Middleware/index.d.ts.map +1 -1
  137. package/lib/Middleware/index.js +20 -8
  138. package/lib/Model/Sequelize.d.ts +3 -0
  139. package/lib/Model/Sequelize.d.ts.map +1 -0
  140. package/lib/Model/Sequelize.js +6 -0
  141. package/lib/Providers/RouteServiceProvider.d.ts.map +1 -1
  142. package/lib/Providers/RouteServiceProvider.js +3 -0
  143. package/lib/Providers/SessionServiceProvider.d.ts +12 -0
  144. package/lib/Providers/SessionServiceProvider.d.ts.map +1 -0
  145. package/lib/Providers/SessionServiceProvider.js +47 -0
  146. package/lib/Queue/Controllers/QueueControllers.d.ts +31 -0
  147. package/lib/Queue/Controllers/QueueControllers.d.ts.map +1 -0
  148. package/lib/Queue/Controllers/QueueControllers.js +126 -0
  149. package/lib/Queue/Drivers/DatabaseDriver.d.ts +6 -1
  150. package/lib/Queue/Drivers/DatabaseDriver.d.ts.map +1 -1
  151. package/lib/Queue/Drivers/DatabaseDriver.js +76 -21
  152. package/lib/Queue/Drivers/MemoryDriver.d.ts +17 -6
  153. package/lib/Queue/Drivers/MemoryDriver.d.ts.map +1 -1
  154. package/lib/Queue/Drivers/MemoryDriver.js +323 -14
  155. package/lib/Queue/Drivers/RedisDriver.d.ts +48 -0
  156. package/lib/Queue/Drivers/RedisDriver.d.ts.map +1 -0
  157. package/lib/Queue/Drivers/RedisDriver.js +533 -0
  158. package/lib/Queue/Job.d.ts +8 -0
  159. package/lib/Queue/Job.d.ts.map +1 -1
  160. package/lib/Queue/Job.js +25 -1
  161. package/lib/Queue/JobsLogger.d.ts.map +1 -1
  162. package/lib/Queue/JobsLogger.js +6 -3
  163. package/lib/Queue/Queue.d.ts +17 -0
  164. package/lib/Queue/Queue.d.ts.map +1 -1
  165. package/lib/Queue/Queue.js +146 -11
  166. package/lib/Queue/QueueServiceProvider.d.ts +6 -0
  167. package/lib/Queue/QueueServiceProvider.d.ts.map +1 -0
  168. package/lib/Queue/QueueServiceProvider.js +18 -0
  169. package/lib/Queue/Route/web.d.ts +2 -0
  170. package/lib/Queue/Route/web.d.ts.map +1 -0
  171. package/lib/Queue/Route/web.js +16 -0
  172. package/lib/Queue/index.d.ts +1 -0
  173. package/lib/Queue/index.d.ts.map +1 -1
  174. package/lib/Queue/index.js +3 -0
  175. package/lib/Queue/interface.d.ts +25 -0
  176. package/lib/Queue/interface.d.ts.map +1 -1
  177. package/lib/Queue/middleware/queueDashboardGuard.d.ts +7 -0
  178. package/lib/Queue/middleware/queueDashboardGuard.d.ts.map +1 -0
  179. package/lib/Queue/middleware/queueDashboardGuard.js +43 -0
  180. package/lib/Queue/type.d.ts +12 -1
  181. package/lib/Queue/type.d.ts.map +1 -1
  182. package/lib/Response/index.d.ts.map +1 -1
  183. package/lib/Response/index.js +6 -1
  184. package/lib/Routes/Route.d.ts +2 -2
  185. package/lib/Routes/Route.d.ts.map +1 -1
  186. package/lib/Routes/RouteBuilder.d.ts +2 -2
  187. package/lib/Routes/RouteBuilder.d.ts.map +1 -1
  188. package/lib/Security/CsrfMiddleware.d.ts +37 -0
  189. package/lib/Security/CsrfMiddleware.d.ts.map +1 -0
  190. package/lib/Security/CsrfMiddleware.js +85 -0
  191. package/lib/Security/MethodSpoofingMiddleware.d.ts +36 -0
  192. package/lib/Security/MethodSpoofingMiddleware.d.ts.map +1 -0
  193. package/lib/Security/MethodSpoofingMiddleware.js +51 -0
  194. package/lib/Security/index.d.ts +5 -0
  195. package/lib/Security/index.d.ts.map +1 -0
  196. package/lib/Security/index.js +7 -0
  197. package/lib/Session/DatabaseSession.d.ts +9 -3
  198. package/lib/Session/DatabaseSession.d.ts.map +1 -1
  199. package/lib/Session/DatabaseSession.js +38 -36
  200. package/lib/Session/ExpressJccSession.d.ts +23 -0
  201. package/lib/Session/ExpressJccSession.d.ts.map +1 -0
  202. package/lib/Session/ExpressJccSession.js +110 -0
  203. package/lib/Session/RedisSession.d.ts +2 -2
  204. package/lib/Session/RedisSession.d.ts.map +1 -1
  205. package/lib/Session/RedisSession.js +19 -5
  206. package/lib/Session/SessionManager.d.ts +18 -4
  207. package/lib/Session/SessionManager.d.ts.map +1 -1
  208. package/lib/Session/SessionManager.js +53 -17
  209. package/lib/Socialite/AbstractProvider.d.ts +60 -0
  210. package/lib/Socialite/AbstractProvider.d.ts.map +1 -0
  211. package/lib/Socialite/AbstractProvider.js +136 -0
  212. package/lib/Socialite/Drivers/facebook/FacebookDriver.d.ts +9 -0
  213. package/lib/Socialite/Drivers/facebook/FacebookDriver.d.ts.map +1 -0
  214. package/lib/Socialite/Drivers/facebook/FacebookDriver.js +40 -0
  215. package/lib/Socialite/Drivers/facebook/FacebookProvider.d.ts +15 -0
  216. package/lib/Socialite/Drivers/facebook/FacebookProvider.d.ts.map +1 -0
  217. package/lib/Socialite/Drivers/facebook/FacebookProvider.js +28 -0
  218. package/lib/Socialite/Drivers/github/GitHubDriver.d.ts +9 -0
  219. package/lib/Socialite/Drivers/github/GitHubDriver.d.ts.map +1 -0
  220. package/lib/Socialite/Drivers/github/GitHubDriver.js +54 -0
  221. package/lib/Socialite/Drivers/github/GitHubProvider.d.ts +15 -0
  222. package/lib/Socialite/Drivers/github/GitHubProvider.d.ts.map +1 -0
  223. package/lib/Socialite/Drivers/github/GitHubProvider.js +28 -0
  224. package/lib/Socialite/Drivers/gitlab/GitLabDriver.d.ts +10 -0
  225. package/lib/Socialite/Drivers/gitlab/GitLabDriver.d.ts.map +1 -0
  226. package/lib/Socialite/Drivers/gitlab/GitLabDriver.js +37 -0
  227. package/lib/Socialite/Drivers/gitlab/GitLabProvider.d.ts +15 -0
  228. package/lib/Socialite/Drivers/gitlab/GitLabProvider.d.ts.map +1 -0
  229. package/lib/Socialite/Drivers/gitlab/GitLabProvider.js +28 -0
  230. package/lib/Socialite/Drivers/google/GoogleDriver.d.ts +9 -0
  231. package/lib/Socialite/Drivers/google/GoogleDriver.d.ts.map +1 -0
  232. package/lib/Socialite/Drivers/google/GoogleDriver.js +39 -0
  233. package/lib/Socialite/Drivers/google/GoogleProvider.d.ts +15 -0
  234. package/lib/Socialite/Drivers/google/GoogleProvider.d.ts.map +1 -0
  235. package/lib/Socialite/Drivers/google/GoogleProvider.js +28 -0
  236. package/lib/Socialite/Drivers/slack/SlackDriver.d.ts +9 -0
  237. package/lib/Socialite/Drivers/slack/SlackDriver.d.ts.map +1 -0
  238. package/lib/Socialite/Drivers/slack/SlackDriver.js +41 -0
  239. package/lib/Socialite/Drivers/slack/SlackProvider.d.ts +16 -0
  240. package/lib/Socialite/Drivers/slack/SlackProvider.d.ts.map +1 -0
  241. package/lib/Socialite/Drivers/slack/SlackProvider.js +37 -0
  242. package/lib/Socialite/Drivers/twitter/TwitterDriver.d.ts +9 -0
  243. package/lib/Socialite/Drivers/twitter/TwitterDriver.d.ts.map +1 -0
  244. package/lib/Socialite/Drivers/twitter/TwitterDriver.js +57 -0
  245. package/lib/Socialite/Drivers/twitter/TwitterProvider.d.ts +16 -0
  246. package/lib/Socialite/Drivers/twitter/TwitterProvider.d.ts.map +1 -0
  247. package/lib/Socialite/Drivers/twitter/TwitterProvider.js +38 -0
  248. package/lib/Socialite/SocialUser.d.ts +42 -0
  249. package/lib/Socialite/SocialUser.d.ts.map +1 -0
  250. package/lib/Socialite/SocialUser.js +116 -0
  251. package/lib/Socialite/Socialite.d.ts +13 -0
  252. package/lib/Socialite/Socialite.d.ts.map +1 -0
  253. package/lib/Socialite/Socialite.js +41 -0
  254. package/lib/Socialite/SocialiteProvider.d.ts +9 -0
  255. package/lib/Socialite/SocialiteProvider.d.ts.map +1 -0
  256. package/lib/Socialite/SocialiteProvider.js +15 -0
  257. package/lib/Socialite/config.d.ts +7 -0
  258. package/lib/Socialite/config.d.ts.map +1 -0
  259. package/lib/Socialite/config.js +44 -0
  260. package/lib/Socialite/constant.d.ts +18 -0
  261. package/lib/Socialite/constant.d.ts.map +1 -0
  262. package/lib/Socialite/constant.js +20 -0
  263. package/lib/Socialite/index.d.ts +13 -0
  264. package/lib/Socialite/index.d.ts.map +1 -0
  265. package/lib/Socialite/index.js +25 -0
  266. package/lib/Socialite/types.d.ts +13 -0
  267. package/lib/Socialite/types.d.ts.map +1 -0
  268. package/lib/Socialite/types.js +2 -0
  269. package/lib/Templating-engine/benchmark.d.ts +7 -0
  270. package/lib/Templating-engine/benchmark.d.ts.map +1 -0
  271. package/lib/Templating-engine/benchmark.js +44 -0
  272. package/lib/Templating-engine/engineHelper.d.ts +37 -8
  273. package/lib/Templating-engine/engineHelper.d.ts.map +1 -1
  274. package/lib/Templating-engine/engineHelper.js +203 -26
  275. package/lib/Templating-engine/errors.d.ts +15 -0
  276. package/lib/Templating-engine/errors.d.ts.map +1 -0
  277. package/lib/Templating-engine/errors.js +35 -0
  278. package/lib/Templating-engine/expressions.d.ts +24 -0
  279. package/lib/Templating-engine/expressions.d.ts.map +1 -1
  280. package/lib/Templating-engine/expressions.js +27 -5
  281. package/lib/Templating-engine/index.d.ts +87 -17
  282. package/lib/Templating-engine/index.d.ts.map +1 -1
  283. package/lib/Templating-engine/index.js +701 -96
  284. package/lib/Templating-engine/plugins.d.ts +30 -0
  285. package/lib/Templating-engine/plugins.d.ts.map +1 -0
  286. package/lib/Templating-engine/plugins.js +47 -0
  287. package/lib/Type/index.d.ts +1 -0
  288. package/lib/Type/index.d.ts.map +1 -1
  289. package/lib/Validation/Validator/CustomValidation.d.ts.map +1 -1
  290. package/lib/Validation/Validator/CustomValidation.js +2 -2
  291. package/lib/Validation/Validator/helper.d.ts.map +1 -1
  292. package/lib/Validation/Validator/helper.js +8 -1
  293. package/lib/util/index.d.ts +42 -1
  294. package/lib/util/index.d.ts.map +1 -1
  295. package/lib/util/index.js +154 -17
  296. package/package.json +1 -1
@@ -41,6 +41,7 @@ const inflection = __importStar(require("inflection"));
41
41
  const DatabaseError_1 = require("../Error/DatabaseError");
42
42
  const app_root_path_1 = __importDefault(require("app-root-path"));
43
43
  const Model_1 = require("../Model");
44
+ const Config_1 = require("../../../Config/Config");
44
45
  class Utils {
45
46
  /**
46
47
  * Pluralizes a string.
@@ -153,6 +154,54 @@ class Utils {
153
154
  }
154
155
  return links;
155
156
  }
157
+ /**
158
+ * Merge `request.query` with overrides into a full URL (pathname + search).
159
+ * Pass `null` / `undefined` in overrides to remove a query key.
160
+ */
161
+ static mergeRequestQuery(request, overrides) {
162
+ const host = request.get("host") || "localhost";
163
+ const proto = (request.protocol || "http").replace(/:$/, "");
164
+ const pathname = request.path || "/";
165
+ const base = `${proto}://${host}${pathname}`;
166
+ const u = new URL(base);
167
+ const sp = u.searchParams;
168
+ for (const [k, v] of Object.entries(request.query)) {
169
+ if (v === undefined || v === null)
170
+ continue;
171
+ const val = Array.isArray(v) ? v[0] : v;
172
+ sp.set(k, String(val));
173
+ }
174
+ for (const [k, v] of Object.entries(overrides)) {
175
+ if (v === null || v === undefined)
176
+ sp.delete(k);
177
+ else
178
+ sp.set(k, String(v));
179
+ }
180
+ return u.toString();
181
+ }
182
+ /** Encode a cursor column value for `?cursor=` (base64url JSON). */
183
+ static encodeCursorValue(value) {
184
+ const v = value instanceof Date ? value.toISOString() : value;
185
+ const payload = JSON.stringify({ v });
186
+ return Buffer.from(payload, "utf8").toString("base64url");
187
+ }
188
+ /** Decode `?cursor=` from {@link encodeCursorValue} or fall back to raw string / number. */
189
+ static decodeCursorValue(encoded) {
190
+ if (encoded == null || encoded === "")
191
+ return undefined;
192
+ try {
193
+ const json = JSON.parse(Buffer.from(encoded, "base64url").toString("utf8"));
194
+ if (json && typeof json === "object" && "v" in json)
195
+ return json.v;
196
+ }
197
+ catch {
198
+ /* fall through */
199
+ }
200
+ const n = Number(encoded);
201
+ if (!Number.isNaN(n) && String(n) === String(encoded).trim())
202
+ return n;
203
+ return encoded;
204
+ }
156
205
  /**
157
206
  * Extracts and returns metadata and configurations for a given Model.
158
207
  * @param {any} Model - The model whose metadata needs to be extracted. This should follow the ORM's Model structure.
@@ -265,5 +314,18 @@ class Utils {
265
314
  return (typeof value === "function" &&
266
315
  /^\s*class\s+/.test(Function.prototype.toString.call(value)));
267
316
  }
317
+ static isPostgres() {
318
+ return (Config_1.config.get("DB_CONNECTION").toLowerCase() === "postgres" ||
319
+ Config_1.config.get("DB_ORM").toLowerCase() === "pg");
320
+ }
321
+ static isMysql() {
322
+ return (Config_1.config.get("DB_CONNECTION").toLowerCase() === "mysql" ||
323
+ Config_1.config.get("DB_ORM").toLowerCase() === "mysql2");
324
+ }
325
+ static isSqlite() {
326
+ return (Config_1.config.get("DB_CONNECTION").toLowerCase() === "sqlite" ||
327
+ Config_1.config.get("DB_ORM").toLowerCase() === "better-sqlite3" ||
328
+ Config_1.config.get("DB_ORM").toLowerCase() === "bun:sqlite");
329
+ }
268
330
  }
269
331
  exports.Utils = Utils;
@@ -8,6 +8,7 @@ export declare class Middleware {
8
8
  constructor(app: Application);
9
9
  loadStaticFiles(): void;
10
10
  use(globalMiddleares: RequestHandler[]): void;
11
+ private requestResponseMiddleware;
11
12
  /**
12
13
  * Default templating engine for the application.
13
14
  * It sets up the Blade templating engine with the express app.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Middleware/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAyB,EAEvB,cAAc,EACf,MAAM,SAAS,CAAC;AAUjB,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW;IAW5B,eAAe;IAWf,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE;IA+BtC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Middleware/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAyB,EAEvB,cAAc,EACf,MAAM,SAAS,CAAC;AAejB,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,GAAG,CAAc;gBAEb,GAAG,EAAE,WAAW;IAW5B,eAAe;IAWf,GAAG,CAAC,gBAAgB,EAAE,cAAc,EAAE;IA8BtC,OAAO,CAAC,yBAAyB;IASjC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,UAAU;CAGnB"}
@@ -11,6 +11,11 @@ const request_1 = require("../Request/request");
11
11
  const morgan_1 = __importDefault(require("morgan"));
12
12
  const Config_1 = require("../Config/Config");
13
13
  const express_rate_limit_1 = __importDefault(require("express-rate-limit"));
14
+ const cookie_parser_1 = __importDefault(require("cookie-parser"));
15
+ const connect_flash_1 = __importDefault(require("connect-flash"));
16
+ const express_fileupload_1 = __importDefault(require("express-fileupload"));
17
+ const ExpressJccSession_1 = require("../Session/ExpressJccSession");
18
+ const SessionManager_1 = require("../Session/SessionManager");
14
19
  class Middleware {
15
20
  //
16
21
  constructor(app) {
@@ -35,29 +40,36 @@ class Middleware {
35
40
  [
36
41
  this.express.json(),
37
42
  this.express.urlencoded({ extended: false }),
43
+ (0, cookie_parser_1.default)(),
44
+ this.app.resolve(SessionManager_1.SessionManager.name).getExpressMiddleware(),
45
+ (0, connect_flash_1.default)(),
46
+ (0, express_fileupload_1.default)(),
38
47
  (0, cors_1.default)(this.corsOption()),
39
48
  (0, morgan_1.default)(Config_1.config.get("APP_DEBUG") === "true" ? "dev" : "combined"),
40
49
  (0, express_rate_limit_1.default)(this.app.config.rateLimit || {}),
50
+ this.requestResponseMiddleware(),
41
51
  ...globalMiddleares,
42
52
  ].forEach((middleware) => this.expressApp.use(middleware));
43
53
  //
44
54
  this.expressApp.use(((req, res, next) => {
45
- new Response_1.HttpResponse(req, res);
46
- new request_1.HttpRequest(req, res);
47
55
  this.app.instance("request", req);
48
56
  this.app.instance("response", res);
49
57
  this.app.instance("next", next);
50
58
  res.on("finish", () => {
51
- this.app.forgetMany([
52
- "request",
53
- "response",
54
- "next",
55
- ]);
59
+ this.app.forgetMany(["request", "response", "next"]);
56
60
  });
57
- //
61
+ //
58
62
  next();
59
63
  }));
60
64
  }
65
+ requestResponseMiddleware() {
66
+ return (req, res, next) => {
67
+ req.jccSession = (0, ExpressJccSession_1.createExpressJccSession)(req);
68
+ new Response_1.HttpResponse(req, res);
69
+ new request_1.HttpRequest(req, res);
70
+ next();
71
+ };
72
+ }
61
73
  /**
62
74
  * Default templating engine for the application.
63
75
  * It sets up the Blade templating engine with the express app.
@@ -0,0 +1,3 @@
1
+ export declare class SequelizeModel {
2
+ }
3
+ //# sourceMappingURL=Sequelize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Sequelize.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Model/Sequelize.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAc;CAAG"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequelizeModel = void 0;
4
+ class SequelizeModel {
5
+ }
6
+ exports.SequelizeModel = SequelizeModel;
@@ -1 +1 @@
1
- {"version":3,"file":"RouteServiceProvider.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Providers/RouteServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,oBAAqB,SAAQ,eAAe;gBAC3C,GAAG,EAAE,WAAW;IAItB,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3D,QAAQ,IAAI,IAAI;IAEhB,IAAI,IAAI,IAAI;CACb"}
1
+ {"version":3,"file":"RouteServiceProvider.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Providers/RouteServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,qBAAa,oBAAqB,SAAQ,eAAe;gBAC3C,GAAG,EAAE,WAAW;IAItB,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAY3D,QAAQ,IAAI,IAAI;IAEhB,IAAI,IAAI,IAAI;CACb"}
@@ -14,6 +14,9 @@ class RouteServiceProvider extends ServiceProvider_1.ServiceProvider {
14
14
  (0, util_1.loadRoute)(route.name);
15
15
  });
16
16
  }
17
+ Route_1.Route.basePath("/queue").group((Route) => {
18
+ require("../Queue/Route/web");
19
+ });
17
20
  }
18
21
  register() { }
19
22
  boot() { }
@@ -0,0 +1,12 @@
1
+ import type { Application } from "../Application/Application";
2
+ import { ServiceProvider } from "./ServiceProvider";
3
+ /**
4
+ * Registers {@link SessionManager} from `app.config.session` (Laravel-style: driver, lifetime, stores).
5
+ * Used by {@link Middleware} to mount `express-session` with the correct store.
6
+ */
7
+ export declare class SessionServiceProvider extends ServiceProvider {
8
+ constructor(app: Application);
9
+ register(): void;
10
+ private mergeSessionConfig;
11
+ }
12
+ //# sourceMappingURL=SessionServiceProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionServiceProvider.d.ts","sourceRoot":"","sources":["../../../jcc-express-mvc/lib/Providers/SessionServiceProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,eAAe;gBAC7C,GAAG,EAAE,WAAW;IAI5B,QAAQ,IAAI,IAAI;IAMhB,OAAO,CAAC,kBAAkB;CA+B3B"}
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionServiceProvider = void 0;
4
+ const ServiceProvider_1 = require("./ServiceProvider");
5
+ const SessionManager_1 = require("../Session/SessionManager");
6
+ /**
7
+ * Registers {@link SessionManager} from `app.config.session` (Laravel-style: driver, lifetime, stores).
8
+ * Used by {@link Middleware} to mount `express-session` with the correct store.
9
+ */
10
+ class SessionServiceProvider extends ServiceProvider_1.ServiceProvider {
11
+ constructor(app) {
12
+ super(app);
13
+ }
14
+ register() {
15
+ this.app.singleton(SessionManager_1.SessionManager.name, () => {
16
+ return new SessionManager_1.SessionManager(this.mergeSessionConfig());
17
+ });
18
+ }
19
+ mergeSessionConfig() {
20
+ const raw = (this.app.config?.session ?? {});
21
+ const defaultLifetime = 120 * 60 * 1000;
22
+ const lifetimeMs = typeof raw.lifetime === "number" && raw.lifetime > 0
23
+ ? raw.lifetime
24
+ : defaultLifetime;
25
+ const cookieBase = raw.cookie ?? {
26
+ name: "connect.sid",
27
+ httpOnly: true,
28
+ secure: false,
29
+ sameSite: "lax",
30
+ maxAge: lifetimeMs,
31
+ };
32
+ const cookie = {
33
+ ...cookieBase,
34
+ maxAge: cookieBase.maxAge ?? lifetimeMs,
35
+ path: cookieBase.path ?? "/",
36
+ };
37
+ return {
38
+ driver: raw.driver ?? "file",
39
+ lifetime: lifetimeMs,
40
+ cookie,
41
+ files: raw.files,
42
+ database: raw.database,
43
+ redis: raw.redis,
44
+ };
45
+ }
46
+ }
47
+ exports.SessionServiceProvider = SessionServiceProvider;
@@ -0,0 +1,31 @@
1
+ import { Queue } from "..";
2
+ import { HttpContext } from "../../Interface";
3
+ export declare class QueueControllers {
4
+ private readonly queue;
5
+ constructor(queue: Queue);
6
+ /**
7
+ * Show the dashboard
8
+ */
9
+ dashboard(): Promise<void>;
10
+ /**
11
+ * JSON list of queues (API)
12
+ */
13
+ index(): Promise<import("../../Interface").AppResponse>;
14
+ /**
15
+ * Show the queue
16
+ */
17
+ show(status: string): Promise<void>;
18
+ /**
19
+ * Retry a failed job or run a pending job.
20
+ * PUT /queue/jobs/:id/failed -> retry (re-queue as pending)
21
+ * PUT /queue/jobs/:id/pending -> run immediately
22
+ */
23
+ update(id: string, status: string): Promise<any>;
24
+ /**
25
+ * Delete a job (manual delete from dashboard)
26
+ */
27
+ destroy(id: string): Promise<any>;
28
+ private formatJob;
29
+ runJob({ req }: HttpContext): Promise<any>;
30
+ }
31
+ //# sourceMappingURL=QueueControllers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueControllers.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Queue/Controllers/QueueControllers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,qBACa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAEzC;;OAEG;IACG,SAAS;IAIf;;OAEG;IACG,KAAK;IAKX;;OAEG;IAEG,IAAI,CAAC,MAAM,EAAE,MAAM;IAWzB;;;;OAIG;IAEG,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IA+BvC;;OAEG;IAEG,OAAO,CAAC,EAAE,EAAE,MAAM;IAKxB,OAAO,CAAC,SAAS;IAkBX,MAAM,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW;CAGlC"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.QueueControllers = void 0;
13
+ const __1 = require("..");
14
+ const Dependency_1 = require("../../Dependency");
15
+ let QueueControllers = class QueueControllers {
16
+ constructor(queue) {
17
+ this.queue = queue;
18
+ }
19
+ /**
20
+ * Show the dashboard
21
+ */
22
+ async dashboard() {
23
+ return view("queue/dashboard");
24
+ }
25
+ /**
26
+ * JSON list of queues (API)
27
+ */
28
+ async index() {
29
+ const queues = await this.queue.getQueues();
30
+ return response().json({ success: true, data: queues });
31
+ }
32
+ /**
33
+ * Show the queue
34
+ */
35
+ async show(status) {
36
+ const jobs = (await this.queue.findQueueBy("status", status)).map((job) => this.formatJob(job));
37
+ return view("queue/jobs", {
38
+ jobs,
39
+ status: status,
40
+ totalJobs: jobs?.length || 0,
41
+ });
42
+ }
43
+ /**
44
+ * Retry a failed job or run a pending job.
45
+ * PUT /queue/jobs/:id/failed -> retry (re-queue as pending)
46
+ * PUT /queue/jobs/:id/pending -> run immediately
47
+ */
48
+ async update(id, status) {
49
+ const job = await this.queue.findQueueById(id);
50
+ if (!job) {
51
+ return response()
52
+ .status(404)
53
+ .json({ success: false, message: "Job not found" });
54
+ }
55
+ const currentStatus = job.status?.toLowerCase();
56
+ if (currentStatus === "failed") {
57
+ const newId = await this.queue.retry(id);
58
+ if (!newId) {
59
+ return response()
60
+ .status(400)
61
+ .json({ success: false, message: "Failed to retry job" });
62
+ }
63
+ }
64
+ else if (currentStatus === "pending" || currentStatus === "processing") {
65
+ await this.queue.runJob(id);
66
+ }
67
+ else {
68
+ return response()
69
+ .status(400)
70
+ .json({
71
+ success: false,
72
+ message: `Cannot run a ${currentStatus} job`,
73
+ });
74
+ }
75
+ return response().redirectBack();
76
+ }
77
+ /**
78
+ * Delete a job (manual delete from dashboard)
79
+ */
80
+ async destroy(id) {
81
+ await this.queue.deleteJob(id);
82
+ return response().redirectBack();
83
+ }
84
+ formatJob(job) {
85
+ return {
86
+ id: job.id,
87
+ attempts: job.attempts,
88
+ available_at: job.available_at,
89
+ queue: job.queue,
90
+ payload: typeof job.payload === "string" ? JSON.parse(job.payload) : job.payload,
91
+ created_at: job.created_at,
92
+ updated_at: job.updated_at,
93
+ status: job.status,
94
+ started_at: job.started_at,
95
+ finished_at: job.finished_at,
96
+ failed_at: job.failed_at,
97
+ exception: job.exception,
98
+ };
99
+ }
100
+ async runJob({ req }) {
101
+ return req.body;
102
+ }
103
+ };
104
+ exports.QueueControllers = QueueControllers;
105
+ __decorate([
106
+ (0, Dependency_1.Method)({ params: ["status"] }),
107
+ __metadata("design:type", Function),
108
+ __metadata("design:paramtypes", [String]),
109
+ __metadata("design:returntype", Promise)
110
+ ], QueueControllers.prototype, "show", null);
111
+ __decorate([
112
+ (0, Dependency_1.Method)({ params: ["id", "status"] }),
113
+ __metadata("design:type", Function),
114
+ __metadata("design:paramtypes", [String, String]),
115
+ __metadata("design:returntype", Promise)
116
+ ], QueueControllers.prototype, "update", null);
117
+ __decorate([
118
+ (0, Dependency_1.Method)({ params: ["id"] }),
119
+ __metadata("design:type", Function),
120
+ __metadata("design:paramtypes", [String]),
121
+ __metadata("design:returntype", Promise)
122
+ ], QueueControllers.prototype, "destroy", null);
123
+ exports.QueueControllers = QueueControllers = __decorate([
124
+ (0, Dependency_1.Inject)(),
125
+ __metadata("design:paramtypes", [__1.Queue])
126
+ ], QueueControllers);
@@ -1,4 +1,4 @@
1
- import { QueueDriver, QueuedJob } from "../interface";
1
+ import { JobStatusUpdate, QueueDriver, QueuedJob } from "../interface";
2
2
  export declare class DatabaseDriver implements QueueDriver {
3
3
  push(job: QueuedJob, queue: string): Promise<void>;
4
4
  later(job: QueuedJob, delay: number, queue: string): Promise<void>;
@@ -6,5 +6,10 @@ export declare class DatabaseDriver implements QueueDriver {
6
6
  delete(jobId: string): Promise<void>;
7
7
  release(job: QueuedJob, delay?: number): Promise<void>;
8
8
  failed(job: QueuedJob, error: any): Promise<void>;
9
+ updateStatus(jobId: string, update: JobStatusUpdate): Promise<void>;
10
+ getQueues(): Promise<any>;
11
+ findQueueById(id: string): Promise<any>;
12
+ findQueueBy(key: string, value: any): Promise<any>;
13
+ private sortByLatest;
9
14
  }
10
15
  //# sourceMappingURL=DatabaseDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseDriver.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Queue/Drivers/DatabaseDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGtD,qBAAa,cAAe,YAAW,WAAW;IACnC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAclD,KAAK,CAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAgBH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;IAqB5C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzD,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAY/D"}
1
+ {"version":3,"file":"DatabaseDriver.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Queue/Drivers/DatabaseDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGvE,qBAAa,cAAe,YAAW,WAAW;IACnC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBlD,KAAK,CAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAeH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,GAAG,CAAC;IA+B5C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAezD,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjD,YAAY,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBH,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAKzB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIvC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAK/D,OAAO,CAAC,YAAY;CASrB"}
@@ -7,6 +7,7 @@ class DatabaseDriver {
7
7
  try {
8
8
  await Jcc_eloquent_1.DB.table("jobs").insert({
9
9
  queue,
10
+ status: "pending",
10
11
  payload: JSON.stringify(job.payload),
11
12
  attempts: 0,
12
13
  available_at: new Date(),
@@ -14,14 +15,13 @@ class DatabaseDriver {
14
15
  });
15
16
  }
16
17
  catch (error) {
17
- console.log(error?.message);
18
+ console.error("[DatabaseDriver] push failed:", error?.message);
19
+ throw error;
18
20
  }
19
21
  }
20
22
  async later(job, delay, queue) {
21
- //
22
23
  try {
23
24
  await Jcc_eloquent_1.DB.table("jobs").insert({
24
- id: job.id,
25
25
  queue,
26
26
  payload: JSON.stringify(job.payload),
27
27
  attempts: 0,
@@ -30,50 +30,105 @@ class DatabaseDriver {
30
30
  });
31
31
  }
32
32
  catch (error) {
33
- console.log(error?.message);
33
+ console.error("[DatabaseDriver] later failed:", error?.message);
34
+ throw error;
34
35
  }
35
36
  }
36
37
  async pop(queue) {
37
38
  try {
38
- // Use a slight buffer for time comparison
39
39
  const now = new Date(Date.now() + 1000);
40
40
  const job = await Jcc_eloquent_1.DB.table("jobs")
41
41
  .where("queue", queue)
42
42
  .where("available_at", "<=", now)
43
+ .whereRaw("(status = ? OR status = ? OR status IS NULL)", [
44
+ "pending",
45
+ "processing",
46
+ ])
43
47
  .orderBy("available_at", "asc")
44
48
  .first();
45
- if (!job) {
46
- // console.log(`[DatabaseDriver] No available jobs found in queue '${queue}' at ${now.toISOString()}`);
49
+ if (!job)
47
50
  return null;
51
+ try {
52
+ await this.updateStatus(job.id, {
53
+ status: "processing",
54
+ startedAt: new Date(),
55
+ });
48
56
  }
49
- return job;
57
+ catch {
58
+ // status columns may not exist yet
59
+ }
60
+ return { ...job, status: "processing", started_at: new Date() };
50
61
  }
51
62
  catch (error) {
52
63
  console.error("[DatabaseDriver] Error in pop():", error?.message);
64
+ return null;
53
65
  }
54
66
  }
55
67
  async delete(jobId) {
56
68
  await Jcc_eloquent_1.DB.table("jobs").where("id", jobId).delete();
57
69
  }
58
70
  async release(job, delay = 0) {
59
- await Jcc_eloquent_1.DB.table("jobs")
60
- .where("id", job.id)
61
- .update({
71
+ const base = {
62
72
  attempts: job.attempts,
63
73
  available_at: new Date(Date.now() + delay),
64
74
  updated_at: new Date(),
65
- });
75
+ };
76
+ try {
77
+ await Jcc_eloquent_1.DB.table("jobs")
78
+ .where("id", job.id)
79
+ .update({ ...base, status: "pending", started_at: null });
80
+ }
81
+ catch {
82
+ await Jcc_eloquent_1.DB.table("jobs").where("id", job.id).update(base);
83
+ }
66
84
  }
67
85
  async failed(job, error) {
68
- await Jcc_eloquent_1.DB.table("failed_jobs").insert({
69
- id: job.id || crypto.randomUUID(),
70
- connection: "database",
71
- queue: job.queue,
72
- payload: JSON.stringify(job.payload),
73
- exception: error.message + "\n" + (error.stack || ""),
74
- failed_at: new Date().getTime(),
75
- created_at: new Date(),
76
- updated_at: new Date(),
86
+ const exception = error?.message + "\n" + (error?.stack || "");
87
+ try {
88
+ await Jcc_eloquent_1.DB.table("jobs")
89
+ .where("id", job.id)
90
+ .update({ exception, updated_at: new Date() });
91
+ }
92
+ catch {
93
+ // exception column may not exist yet
94
+ }
95
+ }
96
+ async updateStatus(jobId, update) {
97
+ try {
98
+ const data = {
99
+ status: update.status,
100
+ updated_at: new Date(),
101
+ };
102
+ if (update.startedAt)
103
+ data.started_at = update.startedAt;
104
+ if (update.finishedAt)
105
+ data.finished_at = update.finishedAt;
106
+ if (update.failedAt)
107
+ data.failed_at = update.failedAt;
108
+ await Jcc_eloquent_1.DB.table("jobs").where("id", jobId).update(data);
109
+ }
110
+ catch {
111
+ // Columns may not exist yet - run migration to add status, started_at, finished_at, failed_at
112
+ }
113
+ }
114
+ async getQueues() {
115
+ const rows = (await Jcc_eloquent_1.DB.table("jobs").getRaw()) || [];
116
+ return this.sortByLatest(rows);
117
+ }
118
+ async findQueueById(id) {
119
+ return Jcc_eloquent_1.DB.table("jobs").where("id", id).firstRaw();
120
+ }
121
+ async findQueueBy(key, value) {
122
+ const rows = await Jcc_eloquent_1.DB.table("jobs").where(key, value).getRaw();
123
+ return this.sortByLatest(rows || []);
124
+ }
125
+ sortByLatest(jobs) {
126
+ return jobs.sort((a, b) => {
127
+ const tsA = a.finished_at ?? a.failed_at ?? a.created_at ?? a.available_at ?? 0;
128
+ const tsB = b.finished_at ?? b.failed_at ?? b.created_at ?? b.available_at ?? 0;
129
+ const numA = tsA instanceof Date ? tsA.getTime() : (typeof tsA === "number" ? tsA : new Date(tsA)?.getTime() ?? 0);
130
+ const numB = tsB instanceof Date ? tsB.getTime() : (typeof tsB === "number" ? tsB : new Date(tsB)?.getTime() ?? 0);
131
+ return numB - numA;
77
132
  });
78
133
  }
79
134
  }
@@ -1,17 +1,28 @@
1
- import { Job } from "../Job";
2
- import { QueueDriver, QueuedJob } from "../interface";
1
+ import { JobStatusUpdate, QueueDriver, QueuedJob } from "../interface";
2
+ export interface MemoryDriverConfig {
3
+ defaultQueue?: string;
4
+ file?: string;
5
+ }
3
6
  export declare class MemoryDriver implements QueueDriver {
4
- private defaultQueue;
5
7
  private queues;
6
8
  private fail;
7
- private jobClasses;
8
- constructor(defaultQueue: string);
9
- registerJobClass(name: string, jobClass: new (data: any) => Job): void;
9
+ private completed;
10
+ private processing;
11
+ private filePath;
12
+ constructor(config?: string | MemoryDriverConfig);
13
+ private load;
14
+ private save;
10
15
  push(job: QueuedJob, queue: string): Promise<void>;
11
16
  later(job: QueuedJob, delay: number, queue: string): Promise<void>;
12
17
  pop(queue: string): Promise<QueuedJob | null>;
13
18
  delete(jobId: string): Promise<void>;
19
+ updateStatus(jobId: string, update: JobStatusUpdate): Promise<void>;
14
20
  release(job: QueuedJob, delay?: number): Promise<void>;
15
21
  failed(job: QueuedJob, error: any): Promise<void>;
22
+ getQueues(): Promise<any>;
23
+ private sortByLatest;
24
+ findQueueById(id: string): Promise<any>;
25
+ private toJobRecord;
26
+ findQueueBy(key: string, value: any): Promise<any[]>;
16
27
  }
17
28
  //# sourceMappingURL=MemoryDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemoryDriver.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Queue/Drivers/MemoryDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAE7B,OAAO,EAAc,WAAW,EAAa,SAAS,EAAE,MAAM,cAAc,CAAC;AAE7E,qBAAa,YAAa,YAAW,WAAW;IAOlC,OAAO,CAAC,YAAY;IANhC,OAAO,CAAC,MAAM,CAAmC;IAEjD,OAAO,CAAC,IAAI,CAAoB;IAEhC,OAAO,CAAC,UAAU,CAA8C;gBAE5C,YAAY,EAAE,MAAM;IAIjC,gBAAgB,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,KAAK,GAAG,GAC/B,IAAI;IAIM,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAelD,KAAK,CAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IASH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAsB7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQpC,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQzD,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAQ/D"}
1
+ {"version":3,"file":"MemoryDriver.d.ts","sourceRoot":"","sources":["../../../../jcc-express-mvc/lib/Queue/Drivers/MemoryDriver.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,eAAe,EACf,WAAW,EAEX,SAAS,EACV,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA4BD,qBAAa,YAAa,YAAW,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,IAAI,CAAoB;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,MAAM,GAAE,MAAM,GAAG,kBAA8B;IAW3D,OAAO,CAAC,IAAI;IA0BZ,OAAO,CAAC,IAAI;IA4BC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBlD,KAAK,CAChB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAoBH,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA8B7C,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpC,YAAY,CACvB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC;IAmCH,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBzD,MAAM,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAajD,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAiCtC,OAAO,CAAC,YAAY;IAUP,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IA4BpD,OAAO,CAAC,WAAW;IAoBN,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAiClE"}