@ductape/sdk 0.0.4 → 0.0.6

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 (952) hide show
  1. package/README.md +87 -53
  2. package/dist/agents/agent-context.d.ts +100 -0
  3. package/dist/agents/agent-context.js +604 -0
  4. package/dist/agents/agent-context.js.map +1 -0
  5. package/dist/agents/agent-executor.d.ts +180 -0
  6. package/dist/agents/agent-executor.js +715 -0
  7. package/dist/agents/agent-executor.js.map +1 -0
  8. package/dist/agents/agents.service.d.ts +310 -0
  9. package/dist/agents/agents.service.js +1253 -0
  10. package/dist/agents/agents.service.js.map +1 -0
  11. package/dist/agents/index.d.ts +55 -0
  12. package/dist/agents/index.js +110 -0
  13. package/dist/agents/index.js.map +1 -0
  14. package/dist/agents/memory-manager.d.ts +182 -0
  15. package/dist/agents/memory-manager.js +383 -0
  16. package/dist/agents/memory-manager.js.map +1 -0
  17. package/dist/agents/tool-registry.d.ts +141 -0
  18. package/dist/agents/tool-registry.js +355 -0
  19. package/dist/agents/tool-registry.js.map +1 -0
  20. package/dist/agents/types/agents.types.d.ts +1240 -0
  21. package/dist/agents/types/agents.types.js +12 -0
  22. package/dist/agents/types/agents.types.js.map +1 -0
  23. package/dist/agents/types/index.d.ts +6 -0
  24. package/dist/agents/types/index.js +23 -0
  25. package/dist/agents/types/index.js.map +1 -0
  26. package/dist/agents/vector-store-adapter.d.ts +108 -0
  27. package/dist/agents/vector-store-adapter.js +213 -0
  28. package/dist/agents/vector-store-adapter.js.map +1 -0
  29. package/dist/api/services/appApi.service.d.ts +51 -5
  30. package/dist/api/services/appApi.service.js +116 -9
  31. package/dist/api/services/appApi.service.js.map +1 -1
  32. package/dist/api/services/logsApi.service.d.ts +51 -0
  33. package/dist/api/services/logsApi.service.js +19 -2
  34. package/dist/api/services/logsApi.service.js.map +1 -1
  35. package/dist/api/services/pricingApi.service.d.ts +10 -0
  36. package/dist/api/services/pricingApi.service.js +34 -0
  37. package/dist/api/services/pricingApi.service.js.map +1 -0
  38. package/dist/api/services/processorApi.service.d.ts +900 -2
  39. package/dist/api/services/processorApi.service.js +665 -12
  40. package/dist/api/services/processorApi.service.js.map +1 -1
  41. package/dist/api/services/productsApi.service.d.ts +130 -1
  42. package/dist/api/services/productsApi.service.js +198 -11
  43. package/dist/api/services/productsApi.service.js.map +1 -1
  44. package/dist/api/services/resilienceApi.service.d.ts +106 -0
  45. package/dist/api/services/resilienceApi.service.js +224 -0
  46. package/dist/api/services/resilienceApi.service.js.map +1 -0
  47. package/dist/api/services/secretsApi.service.d.ts +50 -0
  48. package/dist/api/services/secretsApi.service.js +113 -0
  49. package/dist/api/services/secretsApi.service.js.map +1 -0
  50. package/dist/api/services/webhooksApi.service.js +13 -6
  51. package/dist/api/services/webhooksApi.service.js.map +1 -1
  52. package/dist/api/services/workflowApi.service.d.ts +199 -0
  53. package/dist/api/services/workflowApi.service.js +201 -0
  54. package/dist/api/services/workflowApi.service.js.map +1 -0
  55. package/dist/api/services/workspaceApi.service.d.ts +8 -0
  56. package/dist/api/services/workspaceApi.service.js +20 -0
  57. package/dist/api/services/workspaceApi.service.js.map +1 -1
  58. package/dist/api/urls.d.ts +92 -1
  59. package/dist/api/urls.js +118 -18
  60. package/dist/api/urls.js.map +1 -1
  61. package/dist/api/utils/auth.utils.d.ts +1 -3
  62. package/dist/api/utils/auth.utils.js.map +1 -1
  63. package/dist/api/utils/cache.utils.d.ts +1 -1
  64. package/dist/api/utils/cache.utils.js +2 -2
  65. package/dist/api/utils/cache.utils.js.map +1 -1
  66. package/dist/api/utils/strings.utils.d.ts +2 -0
  67. package/dist/api/utils/strings.utils.js +14 -0
  68. package/dist/api/utils/strings.utils.js.map +1 -1
  69. package/dist/apps/services/app.service.d.ts +42 -33
  70. package/dist/apps/services/app.service.js +574 -223
  71. package/dist/apps/services/app.service.js.map +1 -1
  72. package/dist/apps/utils/auth-context-manager.d.ts +137 -0
  73. package/dist/apps/utils/auth-context-manager.js +248 -0
  74. package/dist/apps/utils/auth-context-manager.js.map +1 -0
  75. package/dist/apps/utils/credential-manager.d.ts +128 -0
  76. package/dist/apps/utils/credential-manager.js +199 -0
  77. package/dist/apps/utils/credential-manager.js.map +1 -0
  78. package/dist/apps/utils/index.d.ts +10 -0
  79. package/dist/apps/utils/index.js +54 -0
  80. package/dist/apps/utils/index.js.map +1 -0
  81. package/dist/apps/utils/input-helpers.d.ts +67 -0
  82. package/dist/apps/utils/input-helpers.js +185 -0
  83. package/dist/apps/utils/input-helpers.js.map +1 -0
  84. package/dist/apps/utils/input-resolver.d.ts +165 -0
  85. package/dist/apps/utils/input-resolver.js +477 -0
  86. package/dist/apps/utils/input-resolver.js.map +1 -0
  87. package/dist/apps/utils/oauth-manager.d.ts +196 -0
  88. package/dist/apps/utils/oauth-manager.js +429 -0
  89. package/dist/apps/utils/oauth-manager.js.map +1 -0
  90. package/dist/apps/validators/joi-validators/create.appAction.validator.d.ts +1 -2
  91. package/dist/apps/validators/joi-validators/create.appAction.validator.js +22 -2
  92. package/dist/apps/validators/joi-validators/create.appAction.validator.js.map +1 -1
  93. package/dist/apps/validators/joi-validators/update.app.validator.js +2 -0
  94. package/dist/apps/validators/joi-validators/update.app.validator.js.map +1 -1
  95. package/dist/apps/validators/joi-validators/update.appAction.validator.js +23 -2
  96. package/dist/apps/validators/joi-validators/update.appAction.validator.js.map +1 -1
  97. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.d.ts +1 -1
  98. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js +34 -1
  99. package/dist/apps/validators/joi-validators/update.appActionResponse.validator.js.map +1 -1
  100. package/dist/bin.d.ts +26 -0
  101. package/dist/bin.js +28 -0
  102. package/dist/bin.js.map +1 -0
  103. package/dist/brokers/brokers.service.d.ts +435 -0
  104. package/dist/brokers/brokers.service.js +1205 -0
  105. package/dist/brokers/brokers.service.js.map +1 -0
  106. package/dist/brokers/index.d.ts +46 -0
  107. package/dist/brokers/index.js +83 -0
  108. package/dist/brokers/index.js.map +1 -0
  109. package/dist/brokers/types/index.d.ts +567 -0
  110. package/dist/brokers/types/index.js +8 -0
  111. package/dist/brokers/types/index.js.map +1 -0
  112. package/dist/brokers/utils/broker.util.d.ts +33 -0
  113. package/dist/brokers/utils/broker.util.js +125 -0
  114. package/dist/brokers/utils/broker.util.js.map +1 -0
  115. package/dist/{processor/services/messagebrokers → brokers/utils/providers}/aws-sqs.service.d.ts +3 -2
  116. package/dist/brokers/utils/providers/aws-sqs.service.js +71 -0
  117. package/dist/brokers/utils/providers/aws-sqs.service.js.map +1 -0
  118. package/dist/{processor/services/messagebrokers → brokers/utils/providers}/google-pubsub.service.d.ts +2 -2
  119. package/dist/{processor/services/messagebrokers → brokers/utils/providers}/google-pubsub.service.js +16 -7
  120. package/dist/brokers/utils/providers/google-pubsub.service.js.map +1 -0
  121. package/dist/brokers/utils/providers/index.d.ts +6 -0
  122. package/dist/brokers/utils/providers/index.js +16 -0
  123. package/dist/brokers/utils/providers/index.js.map +1 -0
  124. package/dist/brokers/utils/providers/kafka.service.d.ts +23 -0
  125. package/dist/brokers/utils/providers/kafka.service.js +131 -0
  126. package/dist/brokers/utils/providers/kafka.service.js.map +1 -0
  127. package/dist/brokers/utils/providers/nats.service.d.ts +18 -0
  128. package/dist/brokers/utils/providers/nats.service.js +63 -0
  129. package/dist/brokers/utils/providers/nats.service.js.map +1 -0
  130. package/dist/brokers/utils/providers/rabbitmq.service.d.ts +25 -0
  131. package/dist/brokers/utils/providers/rabbitmq.service.js +138 -0
  132. package/dist/brokers/utils/providers/rabbitmq.service.js.map +1 -0
  133. package/dist/{processor/services/messagebrokers → brokers/utils/providers}/redis.service.d.ts +3 -3
  134. package/dist/{processor/services/messagebrokers → brokers/utils/providers}/redis.service.js +25 -14
  135. package/dist/brokers/utils/providers/redis.service.js.map +1 -0
  136. package/dist/cache/cache.manager.d.ts +308 -0
  137. package/dist/cache/cache.manager.js +900 -0
  138. package/dist/cache/cache.manager.js.map +1 -0
  139. package/dist/cache/cache.service.d.ts +191 -0
  140. package/dist/cache/cache.service.js +594 -0
  141. package/dist/cache/cache.service.js.map +1 -0
  142. package/dist/cache/index.d.ts +52 -0
  143. package/dist/cache/index.js +81 -0
  144. package/dist/cache/index.js.map +1 -0
  145. package/dist/cache/types/index.d.ts +110 -0
  146. package/dist/cache/types/index.js +6 -0
  147. package/dist/cache/types/index.js.map +1 -0
  148. package/dist/clients/apps.client.js +1 -1
  149. package/dist/clients/apps.client.js.map +1 -1
  150. package/dist/clients/pricing.client.d.ts +3 -0
  151. package/dist/clients/pricing.client.js +33 -0
  152. package/dist/clients/pricing.client.js.map +1 -0
  153. package/dist/database/actions/action-manager.d.ts +170 -0
  154. package/dist/database/actions/action-manager.js +465 -0
  155. package/dist/database/actions/action-manager.js.map +1 -0
  156. package/dist/database/actions/index.d.ts +6 -0
  157. package/dist/database/actions/index.js +13 -0
  158. package/dist/database/actions/index.js.map +1 -0
  159. package/dist/database/adapters/adapter.factory.d.ts +62 -0
  160. package/dist/database/adapters/adapter.factory.js +97 -0
  161. package/dist/database/adapters/adapter.factory.js.map +1 -0
  162. package/dist/database/adapters/base.adapter.d.ts +423 -0
  163. package/dist/database/adapters/base.adapter.js +260 -0
  164. package/dist/database/adapters/base.adapter.js.map +1 -0
  165. package/dist/database/adapters/cassandra.adapter.d.ts +92 -0
  166. package/dist/database/adapters/cassandra.adapter.js +1091 -0
  167. package/dist/database/adapters/cassandra.adapter.js.map +1 -0
  168. package/dist/database/adapters/dynamodb.adapter.d.ts +110 -0
  169. package/dist/database/adapters/dynamodb.adapter.js +1564 -0
  170. package/dist/database/adapters/dynamodb.adapter.js.map +1 -0
  171. package/dist/database/adapters/index.d.ts +11 -0
  172. package/dist/database/adapters/index.js +27 -0
  173. package/dist/database/adapters/index.js.map +1 -0
  174. package/dist/database/adapters/mariadb.adapter.d.ts +100 -0
  175. package/dist/database/adapters/mariadb.adapter.js +247 -0
  176. package/dist/database/adapters/mariadb.adapter.js.map +1 -0
  177. package/dist/database/adapters/mongodb.adapter.d.ts +121 -0
  178. package/dist/database/adapters/mongodb.adapter.js +1284 -0
  179. package/dist/database/adapters/mongodb.adapter.js.map +1 -0
  180. package/dist/database/adapters/mysql.adapter.d.ts +86 -0
  181. package/dist/database/adapters/mysql.adapter.js +1371 -0
  182. package/dist/database/adapters/mysql.adapter.js.map +1 -0
  183. package/dist/database/adapters/postgresql.adapter.d.ts +90 -0
  184. package/dist/database/adapters/postgresql.adapter.js +1487 -0
  185. package/dist/database/adapters/postgresql.adapter.js.map +1 -0
  186. package/dist/database/databases.service.d.ts +1476 -0
  187. package/dist/database/databases.service.js +3068 -0
  188. package/dist/database/databases.service.js.map +1 -0
  189. package/dist/database/index.d.ts +46 -0
  190. package/dist/database/index.js +109 -0
  191. package/dist/database/index.js.map +1 -0
  192. package/dist/database/migrations/index.d.ts +6 -0
  193. package/dist/database/migrations/index.js +12 -0
  194. package/dist/database/migrations/index.js.map +1 -0
  195. package/dist/database/migrations/migration-engine.d.ts +136 -0
  196. package/dist/database/migrations/migration-engine.js +1421 -0
  197. package/dist/database/migrations/migration-engine.js.map +1 -0
  198. package/dist/database/operators/aggregation-builder.d.ts +67 -0
  199. package/dist/database/operators/aggregation-builder.js +841 -0
  200. package/dist/database/operators/aggregation-builder.js.map +1 -0
  201. package/dist/database/operators/index.d.ts +7 -0
  202. package/dist/database/operators/index.js +15 -0
  203. package/dist/database/operators/index.js.map +1 -0
  204. package/dist/database/operators/query-builder.d.ts +69 -0
  205. package/dist/database/operators/query-builder.js +447 -0
  206. package/dist/database/operators/query-builder.js.map +1 -0
  207. package/dist/database/presave/decrypt.d.ts +25 -0
  208. package/dist/database/presave/decrypt.js +146 -0
  209. package/dist/database/presave/decrypt.js.map +1 -0
  210. package/dist/database/presave/index.d.ts +9 -0
  211. package/dist/database/presave/index.js +18 -0
  212. package/dist/database/presave/index.js.map +1 -0
  213. package/dist/database/presave/presave-processor.d.ts +148 -0
  214. package/dist/database/presave/presave-processor.js +702 -0
  215. package/dist/database/presave/presave-processor.js.map +1 -0
  216. package/dist/database/schema/index.d.ts +7 -0
  217. package/dist/database/schema/index.js +13 -0
  218. package/dist/database/schema/index.js.map +1 -0
  219. package/dist/database/schema/schema-manager.d.ts +258 -0
  220. package/dist/database/schema/schema-manager.js +638 -0
  221. package/dist/database/schema/schema-manager.js.map +1 -0
  222. package/dist/database/transactions/index.d.ts +6 -0
  223. package/dist/database/transactions/index.js +13 -0
  224. package/dist/database/transactions/index.js.map +1 -0
  225. package/dist/database/transactions/transaction-manager.d.ts +113 -0
  226. package/dist/database/transactions/transaction-manager.js +344 -0
  227. package/dist/database/transactions/transaction-manager.js.map +1 -0
  228. package/dist/database/triggers/index.d.ts +7 -0
  229. package/dist/database/triggers/index.js +14 -0
  230. package/dist/database/triggers/index.js.map +1 -0
  231. package/dist/database/triggers/trigger-processor.d.ts +239 -0
  232. package/dist/database/triggers/trigger-processor.js +1034 -0
  233. package/dist/database/triggers/trigger-processor.js.map +1 -0
  234. package/dist/database/types/action.interface.d.ts +148 -0
  235. package/dist/database/types/action.interface.js +6 -0
  236. package/dist/database/types/action.interface.js.map +1 -0
  237. package/dist/database/types/aggregation.interface.d.ts +185 -0
  238. package/dist/database/types/aggregation.interface.js +6 -0
  239. package/dist/database/types/aggregation.interface.js.map +1 -0
  240. package/dist/database/types/connection.interface.d.ts +137 -0
  241. package/dist/database/types/connection.interface.js +6 -0
  242. package/dist/database/types/connection.interface.js.map +1 -0
  243. package/dist/database/types/dashboard.interface.d.ts +74 -0
  244. package/dist/database/types/dashboard.interface.js +7 -0
  245. package/dist/database/types/dashboard.interface.js.map +1 -0
  246. package/dist/database/types/enums.d.ts +195 -0
  247. package/dist/database/types/enums.js +244 -0
  248. package/dist/database/types/enums.js.map +1 -0
  249. package/dist/database/types/index.d.ts +15 -0
  250. package/dist/database/types/index.js +31 -0
  251. package/dist/database/types/index.js.map +1 -0
  252. package/dist/database/types/migration.interface.d.ts +686 -0
  253. package/dist/database/types/migration.interface.js +9 -0
  254. package/dist/database/types/migration.interface.js.map +1 -0
  255. package/dist/database/types/presave.interface.d.ts +292 -0
  256. package/dist/database/types/presave.interface.js +60 -0
  257. package/dist/database/types/presave.interface.js.map +1 -0
  258. package/dist/database/types/query.interface.d.ts +205 -0
  259. package/dist/database/types/query.interface.js +6 -0
  260. package/dist/database/types/query.interface.js.map +1 -0
  261. package/dist/database/types/schema.interface.d.ts +412 -0
  262. package/dist/database/types/schema.interface.js +6 -0
  263. package/dist/database/types/schema.interface.js.map +1 -0
  264. package/dist/database/types/transaction.interface.d.ts +84 -0
  265. package/dist/database/types/transaction.interface.js +6 -0
  266. package/dist/database/types/transaction.interface.js.map +1 -0
  267. package/dist/database/types/trigger.interface.d.ts +612 -0
  268. package/dist/database/types/trigger.interface.js +121 -0
  269. package/dist/database/types/trigger.interface.js.map +1 -0
  270. package/dist/database/types/write.interface.d.ts +216 -0
  271. package/dist/database/types/write.interface.js +6 -0
  272. package/dist/database/types/write.interface.js.map +1 -0
  273. package/dist/database/utils/database-error.d.ts +96 -0
  274. package/dist/database/utils/database-error.js +221 -0
  275. package/dist/database/utils/database-error.js.map +1 -0
  276. package/dist/database/utils/index.d.ts +6 -0
  277. package/dist/database/utils/index.js +11 -0
  278. package/dist/database/utils/index.js.map +1 -0
  279. package/dist/graph/adapters/adapter.factory.d.ts +47 -0
  280. package/dist/graph/adapters/adapter.factory.js +77 -0
  281. package/dist/graph/adapters/adapter.factory.js.map +1 -0
  282. package/dist/graph/adapters/arangodb.adapter.d.ts +86 -0
  283. package/dist/graph/adapters/arangodb.adapter.js +1588 -0
  284. package/dist/graph/adapters/arangodb.adapter.js.map +1 -0
  285. package/dist/graph/adapters/base.adapter.d.ts +264 -0
  286. package/dist/graph/adapters/base.adapter.js +156 -0
  287. package/dist/graph/adapters/base.adapter.js.map +1 -0
  288. package/dist/graph/adapters/index.d.ts +11 -0
  289. package/dist/graph/adapters/index.js +21 -0
  290. package/dist/graph/adapters/index.js.map +1 -0
  291. package/dist/graph/adapters/memgraph.adapter.d.ts +110 -0
  292. package/dist/graph/adapters/memgraph.adapter.js +1452 -0
  293. package/dist/graph/adapters/memgraph.adapter.js.map +1 -0
  294. package/dist/graph/adapters/neo4j.adapter.d.ts +81 -0
  295. package/dist/graph/adapters/neo4j.adapter.js +1317 -0
  296. package/dist/graph/adapters/neo4j.adapter.js.map +1 -0
  297. package/dist/graph/adapters/neptune.adapter.d.ts +82 -0
  298. package/dist/graph/adapters/neptune.adapter.js +1369 -0
  299. package/dist/graph/adapters/neptune.adapter.js.map +1 -0
  300. package/dist/graph/graphs.service.d.ts +606 -0
  301. package/dist/graph/graphs.service.js +2434 -0
  302. package/dist/graph/graphs.service.js.map +1 -0
  303. package/dist/graph/index.d.ts +57 -0
  304. package/dist/graph/index.js +77 -0
  305. package/dist/graph/index.js.map +1 -0
  306. package/dist/graph/transactions/index.d.ts +4 -0
  307. package/dist/graph/transactions/index.js +9 -0
  308. package/dist/graph/transactions/index.js.map +1 -0
  309. package/dist/graph/transactions/transaction-manager.d.ts +61 -0
  310. package/dist/graph/transactions/transaction-manager.js +126 -0
  311. package/dist/graph/transactions/transaction-manager.js.map +1 -0
  312. package/dist/graph/types/connection.interface.d.ts +149 -0
  313. package/dist/graph/types/connection.interface.js +9 -0
  314. package/dist/graph/types/connection.interface.js.map +1 -0
  315. package/dist/graph/types/enums.d.ts +101 -0
  316. package/dist/graph/types/enums.js +114 -0
  317. package/dist/graph/types/enums.js.map +1 -0
  318. package/dist/graph/types/index.d.ts +13 -0
  319. package/dist/graph/types/index.js +20 -0
  320. package/dist/graph/types/index.js.map +1 -0
  321. package/dist/graph/types/node.interface.d.ts +248 -0
  322. package/dist/graph/types/node.interface.js +9 -0
  323. package/dist/graph/types/node.interface.js.map +1 -0
  324. package/dist/graph/types/query.interface.d.ts +175 -0
  325. package/dist/graph/types/query.interface.js +9 -0
  326. package/dist/graph/types/query.interface.js.map +1 -0
  327. package/dist/graph/types/relationship.interface.d.ts +207 -0
  328. package/dist/graph/types/relationship.interface.js +9 -0
  329. package/dist/graph/types/relationship.interface.js.map +1 -0
  330. package/dist/graph/types/schema.interface.d.ts +295 -0
  331. package/dist/graph/types/schema.interface.js +9 -0
  332. package/dist/graph/types/schema.interface.js.map +1 -0
  333. package/dist/graph/types/transaction.interface.d.ts +55 -0
  334. package/dist/graph/types/transaction.interface.js +9 -0
  335. package/dist/graph/types/transaction.interface.js.map +1 -0
  336. package/dist/graph/types/traversal.interface.d.ts +181 -0
  337. package/dist/graph/types/traversal.interface.js +9 -0
  338. package/dist/graph/types/traversal.interface.js.map +1 -0
  339. package/dist/graph/utils/graph-error.d.ts +71 -0
  340. package/dist/graph/utils/graph-error.js +142 -0
  341. package/dist/graph/utils/graph-error.js.map +1 -0
  342. package/dist/graph/utils/index.d.ts +4 -0
  343. package/dist/graph/utils/index.js +9 -0
  344. package/dist/graph/utils/index.js.map +1 -0
  345. package/dist/imports/imports.service.d.ts +3 -3
  346. package/dist/imports/imports.service.js +8 -7
  347. package/dist/imports/imports.service.js.map +1 -1
  348. package/dist/imports/imports.types.d.ts +8 -0
  349. package/dist/imports/repos/openApi.repo.d.ts +1 -2
  350. package/dist/imports/repos/openApi.repo.js +409 -70
  351. package/dist/imports/repos/openApi.repo.js.map +1 -1
  352. package/dist/imports/repos/postmanV21.repo.d.ts +1 -1
  353. package/dist/imports/repos/postmanV21.repo.js +126 -83
  354. package/dist/imports/repos/postmanV21.repo.js.map +1 -1
  355. package/dist/index.d.ts +3926 -269
  356. package/dist/index.js +5475 -682
  357. package/dist/index.js.map +1 -1
  358. package/dist/init.interface.d.ts +407 -0
  359. package/dist/{processor/services/messagebrokers/messagebrokers.type.js → init.interface.js} +1 -1
  360. package/dist/init.interface.js.map +1 -0
  361. package/dist/inputs/inputs.service.d.ts +1 -1
  362. package/dist/inputs/inputs.service.js +2 -2
  363. package/dist/inputs/inputs.service.js.map +1 -1
  364. package/dist/inputs/utils/inputs.utils.create.js +1 -1
  365. package/dist/inputs/utils/inputs.utils.create.js.map +1 -1
  366. package/dist/jobs/index.d.ts +38 -0
  367. package/dist/jobs/index.js +50 -0
  368. package/dist/jobs/index.js.map +1 -0
  369. package/dist/jobs/jobs.service.d.ts +154 -0
  370. package/dist/jobs/jobs.service.js +491 -0
  371. package/dist/jobs/jobs.service.js.map +1 -0
  372. package/dist/jobs/jobs.state.d.ts +113 -0
  373. package/dist/jobs/jobs.state.js +447 -0
  374. package/dist/jobs/jobs.state.js.map +1 -0
  375. package/dist/jobs/types.d.ts +449 -0
  376. package/dist/jobs/types.js +74 -0
  377. package/dist/jobs/types.js.map +1 -0
  378. package/dist/logs/logs.service.js +6 -1
  379. package/dist/logs/logs.service.js.map +1 -1
  380. package/dist/logs/logs.types.d.ts +33 -1
  381. package/dist/logs/logs.types.js +17 -0
  382. package/dist/logs/logs.types.js.map +1 -1
  383. package/dist/models/index.d.ts +6 -0
  384. package/dist/models/index.js +11 -0
  385. package/dist/models/index.js.map +1 -0
  386. package/dist/models/models.service.d.ts +137 -0
  387. package/dist/models/models.service.js +195 -0
  388. package/dist/models/models.service.js.map +1 -0
  389. package/dist/notifications/index.d.ts +13 -0
  390. package/dist/notifications/index.js +26 -0
  391. package/dist/notifications/index.js.map +1 -0
  392. package/dist/notifications/notifications.service.d.ts +268 -0
  393. package/dist/notifications/notifications.service.js +905 -0
  394. package/dist/notifications/notifications.service.js.map +1 -0
  395. package/dist/notifications/types/index.d.ts +4 -0
  396. package/dist/notifications/types/index.js +21 -0
  397. package/dist/notifications/types/index.js.map +1 -0
  398. package/dist/notifications/types/notifications.types.d.ts +452 -0
  399. package/dist/notifications/types/notifications.types.js +49 -0
  400. package/dist/notifications/types/notifications.types.js.map +1 -0
  401. package/dist/parsers/index.d.ts +3 -0
  402. package/dist/parsers/index.js +27 -0
  403. package/dist/parsers/index.js.map +1 -0
  404. package/dist/parsers/pipelines/postman.pipelines.d.ts +15 -0
  405. package/dist/parsers/pipelines/postman.pipelines.js +103 -0
  406. package/dist/parsers/pipelines/postman.pipelines.js.map +1 -0
  407. package/dist/parsers/types/postman.types.d.ts +200 -0
  408. package/dist/parsers/types/postman.types.js +3 -0
  409. package/dist/parsers/types/postman.types.js.map +1 -0
  410. package/dist/parsers/utils/postman.utils.d.ts +12 -0
  411. package/dist/parsers/utils/postman.utils.js +116 -0
  412. package/dist/parsers/utils/postman.utils.js.map +1 -0
  413. package/dist/parsers/validators/postman-auth.validators.d.ts +10 -0
  414. package/dist/parsers/validators/postman-auth.validators.js +127 -0
  415. package/dist/parsers/validators/postman-auth.validators.js.map +1 -0
  416. package/dist/parsers/validators/postman-request.validators.d.ts +13 -0
  417. package/dist/parsers/validators/postman-request.validators.js +139 -0
  418. package/dist/parsers/validators/postman-request.validators.js.map +1 -0
  419. package/dist/parsers/validators/postman-response.validators.d.ts +13 -0
  420. package/dist/parsers/validators/postman-response.validators.js +150 -0
  421. package/dist/parsers/validators/postman-response.validators.js.map +1 -0
  422. package/dist/parsers/validators/postman-variable.validators.d.ts +14 -0
  423. package/dist/parsers/validators/postman-variable.validators.js +163 -0
  424. package/dist/parsers/validators/postman-variable.validators.js.map +1 -0
  425. package/dist/pricing/pricing.repo.js +1 -0
  426. package/dist/pricing/pricing.repo.js.map +1 -0
  427. package/dist/pricing/pricing.service.d.ts +24 -0
  428. package/dist/pricing/pricing.service.js +51 -0
  429. package/dist/pricing/pricing.service.js.map +1 -0
  430. package/dist/pricing/pricing.types.d.ts +76 -0
  431. package/dist/pricing/pricing.types.js +21 -0
  432. package/dist/pricing/pricing.types.js.map +1 -0
  433. package/dist/pricing/utils/string.utils.d.ts +1 -0
  434. package/dist/pricing/utils/string.utils.js +9 -0
  435. package/dist/pricing/utils/string.utils.js.map +1 -0
  436. package/dist/processor/repos/sms.repo.d.ts +4 -4
  437. package/dist/processor/repos/sms.repo.js +23 -10
  438. package/dist/processor/repos/sms.repo.js.map +1 -1
  439. package/dist/processor/services/processor.service.d.ts +251 -78
  440. package/dist/processor/services/processor.service.js +2803 -1495
  441. package/dist/processor/services/processor.service.js.map +1 -1
  442. package/dist/processor/services/request.service.d.ts +36 -0
  443. package/dist/processor/services/request.service.js +304 -0
  444. package/dist/processor/services/request.service.js.map +1 -0
  445. package/dist/processor/types/request.types.d.ts +14 -0
  446. package/dist/processor/types/request.types.js +3 -0
  447. package/dist/processor/types/request.types.js.map +1 -0
  448. package/dist/processor/utils/processor.utils.d.ts +8 -0
  449. package/dist/processor/utils/processor.utils.js +152 -12
  450. package/dist/processor/utils/processor.utils.js.map +1 -1
  451. package/dist/processor/utils/request.utils.d.ts +20 -0
  452. package/dist/processor/utils/request.utils.js +113 -0
  453. package/dist/processor/utils/request.utils.js.map +1 -0
  454. package/dist/processor/utils/storage.util.js +63 -40
  455. package/dist/processor/utils/storage.util.js.map +1 -1
  456. package/dist/products/services/products.service.d.ts +386 -76
  457. package/dist/products/services/products.service.js +3221 -419
  458. package/dist/products/services/products.service.js.map +1 -1
  459. package/dist/products/utils/string.utils.d.ts +1 -1
  460. package/dist/products/utils/string.utils.js +14 -2
  461. package/dist/products/utils/string.utils.js.map +1 -1
  462. package/dist/products/validators/index.d.ts +7 -1
  463. package/dist/products/validators/index.js +16 -1
  464. package/dist/products/validators/index.js.map +1 -1
  465. package/dist/products/validators/joi-validators/create.productAgent.validator.d.ts +3 -0
  466. package/dist/products/validators/joi-validators/create.productAgent.validator.js +266 -0
  467. package/dist/products/validators/joi-validators/create.productAgent.validator.js.map +1 -0
  468. package/dist/products/validators/joi-validators/create.productApp.validator.js +2 -2
  469. package/dist/products/validators/joi-validators/create.productApp.validator.js.map +1 -1
  470. package/dist/products/validators/joi-validators/create.productDatabase.validator.js +5 -0
  471. package/dist/products/validators/joi-validators/create.productDatabase.validator.js.map +1 -1
  472. package/dist/products/validators/joi-validators/create.productEnv.validator.js +1 -0
  473. package/dist/products/validators/joi-validators/create.productEnv.validator.js.map +1 -1
  474. package/dist/products/validators/joi-validators/create.productFeature.validator.js +1 -1
  475. package/dist/products/validators/joi-validators/create.productGraph.validator.js +89 -0
  476. package/dist/products/validators/joi-validators/create.productGraph.validator.js.map +1 -0
  477. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.d.ts +4 -0
  478. package/dist/{processor/services/messagebrokers/rabbitmq.service.js → products/validators/joi-validators/create.productHealthcheck.validator.js} +23 -32
  479. package/dist/products/validators/joi-validators/create.productHealthcheck.validator.js.map +1 -0
  480. package/dist/products/validators/joi-validators/create.productJob.validator.js +2 -2
  481. package/dist/products/validators/joi-validators/create.productJob.validator.js.map +1 -1
  482. package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js +1 -0
  483. package/dist/products/validators/joi-validators/create.productMessageBrokerTopic.validator.js.map +1 -1
  484. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js +81 -25
  485. package/dist/products/validators/joi-validators/create.productMessageBrokers.validator.js.map +1 -1
  486. package/dist/products/validators/joi-validators/create.productModel.validator.d.ts +3 -0
  487. package/dist/products/validators/joi-validators/create.productModel.validator.js +132 -0
  488. package/dist/products/validators/joi-validators/create.productModel.validator.js.map +1 -0
  489. package/dist/products/validators/joi-validators/create.productNotification.validator.js +150 -51
  490. package/dist/products/validators/joi-validators/create.productNotification.validator.js.map +1 -1
  491. package/dist/products/validators/joi-validators/create.productStorage.validator.js +77 -18
  492. package/dist/products/validators/joi-validators/create.productStorage.validator.js.map +1 -1
  493. package/dist/products/validators/joi-validators/create.productVector.validator.d.ts +3 -0
  494. package/dist/products/validators/joi-validators/create.productVector.validator.js +136 -0
  495. package/dist/products/validators/joi-validators/create.productVector.validator.js.map +1 -0
  496. package/dist/products/validators/joi-validators/create.userAuth.validator.js +1 -0
  497. package/dist/products/validators/joi-validators/create.userAuth.validator.js.map +1 -1
  498. package/dist/products/validators/joi-validators/update.dataValue.validator.js +1 -0
  499. package/dist/products/validators/joi-validators/update.dataValue.validator.js.map +1 -1
  500. package/dist/products/validators/joi-validators/update.productDatabase.validator.js +5 -0
  501. package/dist/products/validators/joi-validators/update.productDatabase.validator.js.map +1 -1
  502. package/dist/products/validators/joi-validators/update.productEnv.validator.js +3 -0
  503. package/dist/products/validators/joi-validators/update.productEnv.validator.js.map +1 -1
  504. package/dist/products/validators/joi-validators/update.productGraph.validator.js +88 -0
  505. package/dist/products/validators/joi-validators/update.productGraph.validator.js.map +1 -0
  506. package/dist/products/validators/joi-validators/update.userAuth.validator.js +1 -0
  507. package/dist/products/validators/joi-validators/update.userAuth.validator.js.map +1 -1
  508. package/dist/resilience/fallback.service.d.ts +141 -0
  509. package/dist/resilience/fallback.service.js +766 -0
  510. package/dist/resilience/fallback.service.js.map +1 -0
  511. package/dist/resilience/healthcheck.service.d.ts +159 -0
  512. package/dist/resilience/healthcheck.service.js +943 -0
  513. package/dist/resilience/healthcheck.service.js.map +1 -0
  514. package/dist/resilience/index.d.ts +104 -0
  515. package/dist/resilience/index.js +140 -0
  516. package/dist/resilience/index.js.map +1 -0
  517. package/dist/resilience/quota.service.d.ts +83 -0
  518. package/dist/resilience/quota.service.js +518 -0
  519. package/dist/resilience/quota.service.js.map +1 -0
  520. package/dist/resilience/resilience.service.d.ts +98 -0
  521. package/dist/resilience/resilience.service.js +560 -0
  522. package/dist/resilience/resilience.service.js.map +1 -0
  523. package/dist/resilience/types/index.d.ts +513 -0
  524. package/dist/resilience/types/index.js +29 -0
  525. package/dist/resilience/types/index.js.map +1 -0
  526. package/dist/secrets/index.d.ts +10 -0
  527. package/dist/secrets/index.js +33 -0
  528. package/dist/secrets/index.js.map +1 -0
  529. package/dist/secrets/secrets.resolver.d.ts +52 -0
  530. package/dist/secrets/secrets.resolver.js +236 -0
  531. package/dist/secrets/secrets.resolver.js.map +1 -0
  532. package/dist/secrets/secrets.service.d.ts +93 -0
  533. package/dist/secrets/secrets.service.js +246 -0
  534. package/dist/secrets/secrets.service.js.map +1 -0
  535. package/dist/secrets/secrets.types.d.ts +188 -0
  536. package/dist/secrets/secrets.types.js +87 -0
  537. package/dist/secrets/secrets.types.js.map +1 -0
  538. package/dist/sessions/index.d.ts +50 -0
  539. package/dist/sessions/index.js +96 -0
  540. package/dist/sessions/index.js.map +1 -0
  541. package/dist/sessions/sessions.helper.d.ts +88 -0
  542. package/dist/sessions/sessions.helper.js +133 -0
  543. package/dist/sessions/sessions.helper.js.map +1 -0
  544. package/dist/sessions/sessions.resolver.d.ts +188 -0
  545. package/dist/sessions/sessions.resolver.js +603 -0
  546. package/dist/sessions/sessions.resolver.js.map +1 -0
  547. package/dist/sessions/sessions.service.d.ts +194 -0
  548. package/dist/sessions/sessions.service.js +987 -0
  549. package/dist/sessions/sessions.service.js.map +1 -0
  550. package/dist/sessions/types/index.d.ts +342 -0
  551. package/dist/sessions/types/index.js +6 -0
  552. package/dist/sessions/types/index.js.map +1 -0
  553. package/dist/storage/index.d.ts +66 -0
  554. package/dist/storage/index.js +99 -0
  555. package/dist/storage/index.js.map +1 -0
  556. package/dist/storage/storage.service.d.ts +177 -0
  557. package/dist/storage/storage.service.js +897 -0
  558. package/dist/storage/storage.service.js.map +1 -0
  559. package/dist/storage/types/index.d.ts +267 -0
  560. package/dist/storage/types/index.js +6 -0
  561. package/dist/storage/types/index.js.map +1 -0
  562. package/dist/storage/utils/storage.util.d.ts +62 -0
  563. package/dist/storage/utils/storage.util.js +593 -0
  564. package/dist/storage/utils/storage.util.js.map +1 -0
  565. package/dist/types/appBuilder.types.d.ts +13 -14
  566. package/dist/types/enums.d.ts +11 -1
  567. package/dist/types/enums.js +10 -0
  568. package/dist/types/enums.js.map +1 -1
  569. package/dist/types/index.types.d.ts +9 -4
  570. package/dist/types/index.types.js +0 -1
  571. package/dist/types/index.types.js.map +1 -1
  572. package/dist/types/inputs.types.d.ts +1 -0
  573. package/dist/types/inputs.types.js +4 -3
  574. package/dist/types/inputs.types.js.map +1 -1
  575. package/dist/types/pricing.types.d.ts +4 -0
  576. package/dist/types/pricing.types.js +3 -0
  577. package/dist/types/pricing.types.js.map +1 -0
  578. package/dist/types/processor.types.d.ts +324 -18
  579. package/dist/types/processor.types.js +9 -1
  580. package/dist/types/processor.types.js.map +1 -1
  581. package/dist/types/productsBuilder.types.d.ts +1007 -23
  582. package/dist/types/productsBuilder.types.js +216 -2
  583. package/dist/types/productsBuilder.types.js.map +1 -1
  584. package/dist/types/request-tracker.interface.js +1 -0
  585. package/dist/types/request-tracker.interface.js.map +1 -0
  586. package/dist/types/requests.types.d.ts +2 -0
  587. package/dist/utils/constants.d.ts +1 -0
  588. package/dist/utils/constants.js +5 -0
  589. package/dist/utils/constants.js.map +1 -0
  590. package/dist/utils/index.d.ts +0 -2
  591. package/dist/utils/index.js +24 -52
  592. package/dist/utils/index.js.map +1 -1
  593. package/dist/vector/actions/action-manager.d.ts +140 -0
  594. package/dist/vector/actions/action-manager.js +356 -0
  595. package/dist/vector/actions/action-manager.js.map +1 -0
  596. package/dist/vector/adapters/base.adapter.d.ts +169 -0
  597. package/dist/vector/adapters/base.adapter.js +218 -0
  598. package/dist/vector/adapters/base.adapter.js.map +1 -0
  599. package/dist/vector/adapters/index.d.ts +10 -0
  600. package/dist/vector/adapters/index.js +19 -0
  601. package/dist/vector/adapters/index.js.map +1 -0
  602. package/dist/vector/adapters/memory.adapter.d.ts +85 -0
  603. package/dist/vector/adapters/memory.adapter.js +505 -0
  604. package/dist/vector/adapters/memory.adapter.js.map +1 -0
  605. package/dist/vector/adapters/pinecone.adapter.d.ts +52 -0
  606. package/dist/vector/adapters/pinecone.adapter.js +433 -0
  607. package/dist/vector/adapters/pinecone.adapter.js.map +1 -0
  608. package/dist/vector/adapters/qdrant.adapter.d.ts +56 -0
  609. package/dist/vector/adapters/qdrant.adapter.js +442 -0
  610. package/dist/vector/adapters/qdrant.adapter.js.map +1 -0
  611. package/dist/vector/adapters/weaviate.adapter.d.ts +68 -0
  612. package/dist/vector/adapters/weaviate.adapter.js +661 -0
  613. package/dist/vector/adapters/weaviate.adapter.js.map +1 -0
  614. package/dist/vector/index.d.ts +36 -0
  615. package/dist/vector/index.js +70 -0
  616. package/dist/vector/index.js.map +1 -0
  617. package/dist/vector/types/action.interface.d.ts +195 -0
  618. package/dist/vector/types/action.interface.js +100 -0
  619. package/dist/vector/types/action.interface.js.map +1 -0
  620. package/dist/vector/types/connection.interface.d.ts +151 -0
  621. package/dist/vector/types/connection.interface.js +8 -0
  622. package/dist/vector/types/connection.interface.js.map +1 -0
  623. package/dist/vector/types/embedding.interface.d.ts +144 -0
  624. package/dist/vector/types/embedding.interface.js +8 -0
  625. package/dist/vector/types/embedding.interface.js.map +1 -0
  626. package/dist/vector/types/enums.d.ts +104 -0
  627. package/dist/vector/types/enums.js +113 -0
  628. package/dist/vector/types/enums.js.map +1 -0
  629. package/dist/vector/types/index.d.ts +11 -0
  630. package/dist/vector/types/index.js +23 -0
  631. package/dist/vector/types/index.js.map +1 -0
  632. package/dist/vector/types/vector.interface.d.ts +315 -0
  633. package/dist/vector/types/vector.interface.js +8 -0
  634. package/dist/vector/types/vector.interface.js.map +1 -0
  635. package/dist/vector/utils/index.d.ts +6 -0
  636. package/dist/vector/utils/index.js +11 -0
  637. package/dist/vector/utils/index.js.map +1 -0
  638. package/dist/vector/utils/vector-error.d.ts +69 -0
  639. package/dist/vector/utils/vector-error.js +116 -0
  640. package/dist/vector/utils/vector-error.js.map +1 -0
  641. package/dist/vector/vector-database.service.d.ts +476 -0
  642. package/dist/vector/vector-database.service.js +892 -0
  643. package/dist/vector/vector-database.service.js.map +1 -0
  644. package/dist/vector/vector.service.d.ts +283 -0
  645. package/dist/vector/vector.service.js +544 -0
  646. package/dist/vector/vector.service.js.map +1 -0
  647. package/dist/warehouse/executor/index.d.ts +5 -0
  648. package/dist/warehouse/executor/index.js +12 -0
  649. package/dist/warehouse/executor/index.js.map +1 -0
  650. package/dist/warehouse/executor/joins/index.d.ts +5 -0
  651. package/dist/warehouse/executor/joins/index.js +11 -0
  652. package/dist/warehouse/executor/joins/index.js.map +1 -0
  653. package/dist/warehouse/executor/joins/join-executor.d.ts +101 -0
  654. package/dist/warehouse/executor/joins/join-executor.js +493 -0
  655. package/dist/warehouse/executor/joins/join-executor.js.map +1 -0
  656. package/dist/warehouse/executor/joins/semantic-join.d.ts +64 -0
  657. package/dist/warehouse/executor/joins/semantic-join.js +241 -0
  658. package/dist/warehouse/executor/joins/semantic-join.js.map +1 -0
  659. package/dist/warehouse/executor/single-source-executor.d.ts +155 -0
  660. package/dist/warehouse/executor/single-source-executor.js +573 -0
  661. package/dist/warehouse/executor/single-source-executor.js.map +1 -0
  662. package/dist/warehouse/index.d.ts +79 -0
  663. package/dist/warehouse/index.js +111 -0
  664. package/dist/warehouse/index.js.map +1 -0
  665. package/dist/warehouse/parser/index.d.ts +4 -0
  666. package/dist/warehouse/parser/index.js +10 -0
  667. package/dist/warehouse/parser/index.js.map +1 -0
  668. package/dist/warehouse/parser/query-parser.d.ts +181 -0
  669. package/dist/warehouse/parser/query-parser.js +415 -0
  670. package/dist/warehouse/parser/query-parser.js.map +1 -0
  671. package/dist/warehouse/registry/data-source-registry.d.ts +207 -0
  672. package/dist/warehouse/registry/data-source-registry.js +396 -0
  673. package/dist/warehouse/registry/data-source-registry.js.map +1 -0
  674. package/dist/warehouse/registry/index.d.ts +4 -0
  675. package/dist/warehouse/registry/index.js +9 -0
  676. package/dist/warehouse/registry/index.js.map +1 -0
  677. package/dist/warehouse/transactions/index.d.ts +4 -0
  678. package/dist/warehouse/transactions/index.js +9 -0
  679. package/dist/warehouse/transactions/index.js.map +1 -0
  680. package/dist/warehouse/transactions/saga-orchestrator.d.ts +92 -0
  681. package/dist/warehouse/transactions/saga-orchestrator.js +383 -0
  682. package/dist/warehouse/transactions/saga-orchestrator.js.map +1 -0
  683. package/dist/warehouse/types/index.d.ts +9 -0
  684. package/dist/warehouse/types/index.js +33 -0
  685. package/dist/warehouse/types/index.js.map +1 -0
  686. package/dist/warehouse/types/join.interface.d.ts +225 -0
  687. package/dist/warehouse/types/join.interface.js +87 -0
  688. package/dist/warehouse/types/join.interface.js.map +1 -0
  689. package/dist/warehouse/types/query.interface.d.ts +232 -0
  690. package/dist/warehouse/types/query.interface.js +9 -0
  691. package/dist/warehouse/types/query.interface.js.map +1 -0
  692. package/dist/warehouse/types/transaction.interface.d.ts +236 -0
  693. package/dist/warehouse/types/transaction.interface.js +74 -0
  694. package/dist/warehouse/types/transaction.interface.js.map +1 -0
  695. package/dist/warehouse/types/where.interface.d.ts +208 -0
  696. package/dist/warehouse/types/where.interface.js +89 -0
  697. package/dist/warehouse/types/where.interface.js.map +1 -0
  698. package/dist/warehouse/warehouse.service.d.ts +200 -0
  699. package/dist/warehouse/warehouse.service.js +470 -0
  700. package/dist/warehouse/warehouse.service.js.map +1 -0
  701. package/dist/workflows/index.d.ts +30 -0
  702. package/dist/workflows/index.js +64 -0
  703. package/dist/workflows/index.js.map +1 -0
  704. package/dist/workflows/types/index.d.ts +6 -0
  705. package/dist/workflows/types/index.js +23 -0
  706. package/dist/workflows/types/index.js.map +1 -0
  707. package/dist/workflows/types/workflows.types.d.ts +1095 -0
  708. package/dist/workflows/types/workflows.types.js +13 -0
  709. package/dist/workflows/types/workflows.types.js.map +1 -0
  710. package/dist/workflows/workflow-builder.d.ts +70 -0
  711. package/dist/workflows/workflow-builder.js +353 -0
  712. package/dist/workflows/workflow-builder.js.map +1 -0
  713. package/dist/workflows/workflow-executor.d.ts +287 -0
  714. package/dist/workflows/workflow-executor.js +2399 -0
  715. package/dist/workflows/workflow-executor.js.map +1 -0
  716. package/dist/workflows/workflows.service.d.ts +412 -0
  717. package/dist/workflows/workflows.service.js +2188 -0
  718. package/dist/workflows/workflows.service.js.map +1 -0
  719. package/package.json +83 -11
  720. package/dist/actions/actions.repo.js +0 -13
  721. package/dist/actions/actions.repo.js.map +0 -1
  722. package/dist/actions/actions.service.js +0 -24
  723. package/dist/actions/actions.service.js.map +0 -1
  724. package/dist/actions/utils/actions.util.read.d.ts +0 -0
  725. package/dist/actions/utils/actions.util.read.js +0 -427
  726. package/dist/actions/utils/actions.util.read.js.map +0 -1
  727. package/dist/api/services/integrationsApi.service.d.ts +0 -18
  728. package/dist/api/services/integrationsApi.service.js +0 -80
  729. package/dist/api/services/integrationsApi.service.js.map +0 -1
  730. package/dist/appBuilder/services/app.service.d.ts +0 -111
  731. package/dist/appBuilder/services/app.service.js +0 -737
  732. package/dist/appBuilder/services/app.service.js.map +0 -1
  733. package/dist/appBuilder/services/appBuilder.service.d.ts +0 -111
  734. package/dist/appBuilder/services/appBuilder.service.js +0 -662
  735. package/dist/appBuilder/services/appBuilder.service.js.map +0 -1
  736. package/dist/appBuilder/utils/objects.utils.d.ts +0 -3
  737. package/dist/appBuilder/utils/objects.utils.js +0 -9
  738. package/dist/appBuilder/utils/objects.utils.js.map +0 -1
  739. package/dist/appBuilder/utils/string.utils.d.ts +0 -2
  740. package/dist/appBuilder/utils/string.utils.js +0 -57
  741. package/dist/appBuilder/utils/string.utils.js.map +0 -1
  742. package/dist/appBuilder/validators/index.d.ts +0 -19
  743. package/dist/appBuilder/validators/index.js +0 -40
  744. package/dist/appBuilder/validators/index.js.map +0 -1
  745. package/dist/appBuilder/validators/joi-validators/create.app.validator.js +0 -10
  746. package/dist/appBuilder/validators/joi-validators/create.app.validator.js.map +0 -1
  747. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.d.ts +0 -4
  748. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js +0 -20
  749. package/dist/appBuilder/validators/joi-validators/create.appAction.validator.js.map +0 -1
  750. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.d.ts +0 -7
  751. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js +0 -44
  752. package/dist/appBuilder/validators/joi-validators/create.appActionResponse.validator.js.map +0 -1
  753. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.d.ts +0 -3
  754. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js +0 -31
  755. package/dist/appBuilder/validators/joi-validators/create.appAuth.validator.js.map +0 -1
  756. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.d.ts +0 -4
  757. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js +0 -11
  758. package/dist/appBuilder/validators/joi-validators/create.appBody.validators.js.map +0 -1
  759. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.d.ts +0 -4
  760. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js +0 -12
  761. package/dist/appBuilder/validators/joi-validators/create.appConstants.validator.js.map +0 -1
  762. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.d.ts +0 -4
  763. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js +0 -17
  764. package/dist/appBuilder/validators/joi-validators/create.appEnv.validator.js.map +0 -1
  765. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
  766. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js +0 -30
  767. package/dist/appBuilder/validators/joi-validators/create.appEvent.validator.js.map +0 -1
  768. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.d.ts +0 -4
  769. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js +0 -14
  770. package/dist/appBuilder/validators/joi-validators/create.appVariable.validator.js.map +0 -1
  771. package/dist/appBuilder/validators/joi-validators/sample.validator.d.ts +0 -5
  772. package/dist/appBuilder/validators/joi-validators/sample.validator.js +0 -26
  773. package/dist/appBuilder/validators/joi-validators/sample.validator.js.map +0 -1
  774. package/dist/appBuilder/validators/joi-validators/update.app.validator.d.ts +0 -4
  775. package/dist/appBuilder/validators/joi-validators/update.app.validator.js +0 -34
  776. package/dist/appBuilder/validators/joi-validators/update.app.validator.js.map +0 -1
  777. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.d.ts +0 -4
  778. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js +0 -23
  779. package/dist/appBuilder/validators/joi-validators/update.appAction.validator.js.map +0 -1
  780. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.d.ts +0 -3
  781. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js +0 -21
  782. package/dist/appBuilder/validators/joi-validators/update.appActionResponse.validator.js.map +0 -1
  783. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.d.ts +0 -4
  784. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js +0 -19
  785. package/dist/appBuilder/validators/joi-validators/update.appAuth.validator.js.map +0 -1
  786. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.d.ts +0 -4
  787. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js +0 -12
  788. package/dist/appBuilder/validators/joi-validators/update.appConstants.validator.js.map +0 -1
  789. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.d.ts +0 -4
  790. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js +0 -17
  791. package/dist/appBuilder/validators/joi-validators/update.appEnv.validator.js.map +0 -1
  792. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
  793. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js +0 -16
  794. package/dist/appBuilder/validators/joi-validators/update.appEvent.validator.js.map +0 -1
  795. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.d.ts +0 -4
  796. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js +0 -14
  797. package/dist/appBuilder/validators/joi-validators/update.appVariables.validator.js.map +0 -1
  798. package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js +0 -27
  799. package/dist/appBuilder/validators/joi-validators/update.validation.entityData.validator.js.map +0 -1
  800. package/dist/apps/validators/joi-validators/create.appEvent.validator.d.ts +0 -5
  801. package/dist/apps/validators/joi-validators/create.appEvent.validator.js +0 -30
  802. package/dist/apps/validators/joi-validators/create.appEvent.validator.js.map +0 -1
  803. package/dist/apps/validators/joi-validators/update.appEvent.validator.d.ts +0 -4
  804. package/dist/apps/validators/joi-validators/update.appEvent.validator.js +0 -16
  805. package/dist/apps/validators/joi-validators/update.appEvent.validator.js.map +0 -1
  806. package/dist/clients/integrations.client.d.ts +0 -2
  807. package/dist/clients/integrations.client.js +0 -26
  808. package/dist/clients/integrations.client.js.map +0 -1
  809. package/dist/integrationsBuilder/services/integration.service.d.ts +0 -138
  810. package/dist/integrationsBuilder/services/integration.service.js +0 -1148
  811. package/dist/integrationsBuilder/services/integration.service.js.map +0 -1
  812. package/dist/integrationsBuilder/services/integrationBuilder.service.d.ts +0 -130
  813. package/dist/integrationsBuilder/services/integrationBuilder.service.js +0 -1017
  814. package/dist/integrationsBuilder/services/integrationBuilder.service.js.map +0 -1
  815. package/dist/integrationsBuilder/utils/objects.utils.d.ts +0 -2
  816. package/dist/integrationsBuilder/utils/objects.utils.js +0 -48
  817. package/dist/integrationsBuilder/utils/objects.utils.js.map +0 -1
  818. package/dist/integrationsBuilder/utils/string.utils.d.ts +0 -1
  819. package/dist/integrationsBuilder/utils/string.utils.js +0 -9
  820. package/dist/integrationsBuilder/utils/string.utils.js.map +0 -1
  821. package/dist/integrationsBuilder/validators/index.d.ts +0 -18
  822. package/dist/integrationsBuilder/validators/index.js +0 -38
  823. package/dist/integrationsBuilder/validators/index.js.map +0 -1
  824. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.d.ts +0 -3
  825. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js +0 -10
  826. package/dist/integrationsBuilder/validators/joi-validators/create.integration.validator.js.map +0 -1
  827. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.d.ts +0 -4
  828. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js +0 -26
  829. package/dist/integrationsBuilder/validators/joi-validators/create.integrationApp.validator.js.map +0 -1
  830. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.d.ts +0 -3
  831. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js +0 -8
  832. package/dist/integrationsBuilder/validators/joi-validators/create.integrationCache.validator.js.map +0 -1
  833. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.d.ts +0 -3
  834. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js +0 -8
  835. package/dist/integrationsBuilder/validators/joi-validators/create.integrationDatabase.validator.js.map +0 -1
  836. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.d.ts +0 -3
  837. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js +0 -10
  838. package/dist/integrationsBuilder/validators/joi-validators/create.integrationEnv.validator.js.map +0 -1
  839. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.d.ts +0 -3
  840. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js +0 -60
  841. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFeature.validator.js.map +0 -1
  842. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.d.ts +0 -3
  843. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js +0 -8
  844. package/dist/integrationsBuilder/validators/joi-validators/create.integrationFunction.validator.js.map +0 -1
  845. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.d.ts +0 -3
  846. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js +0 -8
  847. package/dist/integrationsBuilder/validators/joi-validators/create.integrationJob.validator.js.map +0 -1
  848. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.d.ts +0 -3
  849. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js +0 -8
  850. package/dist/integrationsBuilder/validators/joi-validators/create.integrationNotification.validator.js.map +0 -1
  851. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.d.ts +0 -3
  852. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js +0 -9
  853. package/dist/integrationsBuilder/validators/joi-validators/update.integrationApp.validator.js.map +0 -1
  854. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.d.ts +0 -3
  855. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js +0 -8
  856. package/dist/integrationsBuilder/validators/joi-validators/update.integrationCache.validator.js.map +0 -1
  857. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.d.ts +0 -3
  858. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js +0 -8
  859. package/dist/integrationsBuilder/validators/joi-validators/update.integrationDatabase.validator.js.map +0 -1
  860. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.d.ts +0 -3
  861. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js +0 -8
  862. package/dist/integrationsBuilder/validators/joi-validators/update.integrationEnv.validator.js.map +0 -1
  863. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.d.ts +0 -3
  864. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js +0 -8
  865. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFeature.validator.js.map +0 -1
  866. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.d.ts +0 -3
  867. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js +0 -8
  868. package/dist/integrationsBuilder/validators/joi-validators/update.integrationFunction.validator copy.js.map +0 -1
  869. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.d.ts +0 -3
  870. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js +0 -8
  871. package/dist/integrationsBuilder/validators/joi-validators/update.integrationJob.validator.js.map +0 -1
  872. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.d.ts +0 -3
  873. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js +0 -8
  874. package/dist/integrationsBuilder/validators/joi-validators/update.integrationNotification.validator.js.map +0 -1
  875. package/dist/postman.d.ts +0 -1
  876. package/dist/postman.js +0 -21674
  877. package/dist/postman.js.map +0 -1
  878. package/dist/processor/services/fallback.service.d.ts +0 -5
  879. package/dist/processor/services/fallback.service.js +0 -43
  880. package/dist/processor/services/fallback.service.js.map +0 -1
  881. package/dist/processor/services/messagebrokers/aws-sqs.service.js +0 -77
  882. package/dist/processor/services/messagebrokers/aws-sqs.service.js.map +0 -1
  883. package/dist/processor/services/messagebrokers/google-pubsub.service.js.map +0 -1
  884. package/dist/processor/services/messagebrokers/index.d.ts +0 -3
  885. package/dist/processor/services/messagebrokers/index.js +0 -26
  886. package/dist/processor/services/messagebrokers/index.js.map +0 -1
  887. package/dist/processor/services/messagebrokers/kafka.service.d.ts +0 -14
  888. package/dist/processor/services/messagebrokers/kafka.service.js +0 -45
  889. package/dist/processor/services/messagebrokers/kafka.service.js.map +0 -1
  890. package/dist/processor/services/messagebrokers/messagebrokers.type.d.ts +0 -6
  891. package/dist/processor/services/messagebrokers/messagebrokers.type.js.map +0 -1
  892. package/dist/processor/services/messagebrokers/rabbitmq.service.d.ts +0 -14
  893. package/dist/processor/services/messagebrokers/rabbitmq.service.js.map +0 -1
  894. package/dist/processor/services/messagebrokers/redis.service.js.map +0 -1
  895. package/dist/processor/services/quota.service.d.ts +0 -15
  896. package/dist/processor/services/quota.service.js +0 -63
  897. package/dist/processor/services/quota.service.js.map +0 -1
  898. package/dist/processor/utils/mongo.util.d.ts +0 -0
  899. package/dist/processor/utils/mongo.util.js +0 -152
  900. package/dist/processor/utils/mongo.util.js.map +0 -1
  901. package/dist/processor/utils/postgres.util.d.ts +0 -14
  902. package/dist/processor/utils/postgres.util.js +0 -83
  903. package/dist/processor/utils/postgres.util.js.map +0 -1
  904. package/dist/products/validators/joi-validators/create.product.validator.d.ts +0 -3
  905. package/dist/products/validators/joi-validators/create.product.validator.js +0 -10
  906. package/dist/products/validators/joi-validators/create.product.validator.js.map +0 -1
  907. package/dist/test/test.appBuilder.d.ts +0 -1
  908. package/dist/test/test.appBuilder.js +0 -16
  909. package/dist/test/test.appBuilder.js.map +0 -1
  910. package/dist/test/test.import.d.ts +0 -1
  911. package/dist/test/test.import.js +0 -1460
  912. package/dist/test/test.import.js.map +0 -1
  913. package/dist/test/test.import.openapi.d.ts +0 -1
  914. package/dist/test/test.import.openapi.js +0 -76
  915. package/dist/test/test.import.openapi.js.map +0 -1
  916. package/dist/test/test.imports.d.ts +0 -1
  917. package/dist/test/test.imports.js +0 -62
  918. package/dist/test/test.imports.js.map +0 -1
  919. package/dist/test/test.logs.d.ts +0 -1
  920. package/dist/test/test.logs.js +0 -18
  921. package/dist/test/test.logs.js.map +0 -1
  922. package/dist/test/test.processor.d.ts +0 -1
  923. package/dist/test/test.processor.js +0 -123
  924. package/dist/test/test.processor.js.map +0 -1
  925. package/dist/test/test.productBuilder.d.ts +0 -1
  926. package/dist/test/test.productBuilder.js +0 -661
  927. package/dist/test/test.productBuilder.js.map +0 -1
  928. package/dist/test.appBuilder.d.ts +0 -1
  929. package/dist/test.appBuilder.js +0 -14
  930. package/dist/test.appBuilder.js.map +0 -1
  931. package/dist/test.import.d.ts +0 -0
  932. package/dist/test.import.js +0 -24
  933. package/dist/test.import.js.map +0 -1
  934. package/dist/test.imports.d.ts +0 -1
  935. package/dist/test.imports.js +0 -28
  936. package/dist/test.imports.js.map +0 -1
  937. package/dist/test.integrationBuilder.d.ts +0 -1
  938. package/dist/test.integrationBuilder.js +0 -276
  939. package/dist/test.integrationBuilder.js.map +0 -1
  940. package/dist/test.processor.d.ts +0 -1
  941. package/dist/test.processor.js +0 -23
  942. package/dist/test.processor.js.map +0 -1
  943. package/dist/test.utils.d.ts +0 -1
  944. package/dist/test.utils.js +0 -25
  945. package/dist/test.utils.js.map +0 -1
  946. package/dist/types/integrationsBuilder.types.d.ts +0 -276
  947. package/dist/types/integrationsBuilder.types.js +0 -51
  948. package/dist/types/integrationsBuilder.types.js.map +0 -1
  949. /package/dist/{actions/actions.repo.d.ts → pricing/pricing.repo.d.ts} +0 -0
  950. /package/dist/{appBuilder/validators/joi-validators/create.app.validator.d.ts → products/validators/joi-validators/create.productGraph.validator.d.ts} +0 -0
  951. /package/dist/{appBuilder/validators/joi-validators/update.validation.entityData.validator.d.ts → products/validators/joi-validators/update.productGraph.validator.d.ts} +0 -0
  952. /package/dist/{actions/actions.service.d.ts → types/request-tracker.interface.d.ts} +0 -0
@@ -0,0 +1,3068 @@
1
+ "use strict";
2
+ /**
3
+ * DatabaseService - Main ORM Service Class
4
+ *
5
+ * This is the primary entry point for all database operations in the Ductape SDK.
6
+ * It provides a unified interface for querying, writing, transactions, schema management,
7
+ * migrations, and database actions across multiple database types.
8
+ *
9
+ * Supported databases: PostgreSQL, MySQL, MongoDB, DynamoDB, MariaDB, Cassandra
10
+ */
11
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
12
+ if (k2 === undefined) k2 = k;
13
+ var desc = Object.getOwnPropertyDescriptor(m, k);
14
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
15
+ desc = { enumerable: true, get: function() { return m[k]; } };
16
+ }
17
+ Object.defineProperty(o, k2, desc);
18
+ }) : (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ o[k2] = m[k];
21
+ }));
22
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
23
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
24
+ }) : function(o, v) {
25
+ o["default"] = v;
26
+ });
27
+ var __importStar = (this && this.__importStar) || (function () {
28
+ var ownKeys = function(o) {
29
+ ownKeys = Object.getOwnPropertyNames || function (o) {
30
+ var ar = [];
31
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
32
+ return ar;
33
+ };
34
+ return ownKeys(o);
35
+ };
36
+ return function (mod) {
37
+ if (mod && mod.__esModule) return mod;
38
+ var result = {};
39
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
40
+ __setModuleDefault(result, mod);
41
+ return result;
42
+ };
43
+ })();
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.databaseService = exports.DatabaseConnection = exports.DatabaseService = void 0;
49
+ const enums_1 = require("./types/enums");
50
+ const presave_processor_1 = require("./presave/presave-processor");
51
+ const adapter_factory_1 = require("./adapters/adapter.factory");
52
+ const query_builder_1 = require("./operators/query-builder");
53
+ const aggregation_builder_1 = require("./operators/aggregation-builder");
54
+ const transaction_manager_1 = require("./transactions/transaction-manager");
55
+ const schema_manager_1 = require("./schema/schema-manager");
56
+ const migration_engine_1 = require("./migrations/migration-engine");
57
+ const action_manager_1 = require("./actions/action-manager");
58
+ const trigger_processor_1 = require("./triggers/trigger-processor");
59
+ const trigger_interface_1 = require("./types/trigger.interface");
60
+ const database_error_1 = require("./utils/database-error");
61
+ const products_service_1 = __importDefault(require("../products/services/products.service"));
62
+ const types_1 = require("../types");
63
+ const cache_manager_1 = require("../cache/cache.manager");
64
+ const processor_service_1 = __importDefault(require("../processor/services/processor.service"));
65
+ const crypto_1 = require("crypto");
66
+ const logs_service_1 = __importDefault(require("../logs/logs.service"));
67
+ const logs_types_1 = require("../logs/logs.types");
68
+ const processor_utils_1 = require("../processor/utils/processor.utils");
69
+ const secrets_1 = require("../secrets");
70
+ /**
71
+ * Main Database Service class
72
+ * Provides unified ORM interface for all supported databases
73
+ */
74
+ class DatabaseService {
75
+ /**
76
+ * Create a new DatabaseService instance
77
+ * @param config - Optional configuration for authentication and workspace context
78
+ */
79
+ constructor(config) {
80
+ this.adapters = new Map();
81
+ this.connectionContexts = new Map();
82
+ this.currentContext = null;
83
+ this.schemaManagers = new Map();
84
+ this.migrationEngines = new Map();
85
+ /** Service configuration */
86
+ this.config = null;
87
+ /** ProductBuilder instances cache (keyed by product tag) */
88
+ this.productBuilders = new Map();
89
+ /** LogService instance for logging operations */
90
+ this.logService = null;
91
+ /** Current product ID for logging */
92
+ this.productId = '';
93
+ /** CacheManager for two-tier caching (Redis + remote) */
94
+ this.cacheManager = null;
95
+ /** Private keys cache for products (keyed by product tag) */
96
+ this.privateKeys = new Map();
97
+ /** Local cache for cache configurations to avoid repeated API calls (5 minute TTL) */
98
+ this.cacheConfigCache = new Map();
99
+ this.config = config || null;
100
+ this.adapterFactory = new adapter_factory_1.AdapterFactory();
101
+ this.transactionManager = new transaction_manager_1.TransactionManager();
102
+ this.actionManager = new action_manager_1.ActionManager(this);
103
+ this._privateKey = (config === null || config === void 0 ? void 0 : config.private_key) || '';
104
+ // Initialize CacheManager (Redis is optional - Tier 1 internal cache and Tier 3 remote cache always work)
105
+ if ((config === null || config === void 0 ? void 0 : config.workspace_id) && (config === null || config === void 0 ? void 0 : config.public_key) && (config === null || config === void 0 ? void 0 : config.user_id) && (config === null || config === void 0 ? void 0 : config.token)) {
106
+ this.cacheManager = new cache_manager_1.CacheManager({
107
+ workspace_id: config.workspace_id,
108
+ public_key: config.public_key,
109
+ user_id: config.user_id,
110
+ token: config.token,
111
+ env_type: config.env_type,
112
+ redis_client: config.redis_client, // Optional - Tier 2 cache
113
+ });
114
+ }
115
+ }
116
+ /**
117
+ * Get or create a SchemaManager for the given adapter key or current context
118
+ */
119
+ getSchemaManager(adapterKey) {
120
+ // If no key provided, use current context
121
+ if (!adapterKey) {
122
+ if (!this.currentContext) {
123
+ throw new database_error_1.DatabaseError('No active database connection. Please connect first.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
124
+ }
125
+ adapterKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
126
+ }
127
+ let manager = this.schemaManagers.get(adapterKey);
128
+ if (!manager) {
129
+ const adapter = this.adapters.get(adapterKey);
130
+ if (!adapter) {
131
+ throw new database_error_1.DatabaseError(`No adapter found for key: ${adapterKey}`, enums_1.DatabaseErrorType.NOT_FOUND);
132
+ }
133
+ manager = new schema_manager_1.SchemaManager(adapter);
134
+ this.schemaManagers.set(adapterKey, manager);
135
+ }
136
+ return manager;
137
+ }
138
+ /**
139
+ * Get or create a MigrationEngine for the given adapter key or current context
140
+ */
141
+ getMigrationEngine(adapterKey) {
142
+ // If no key provided, use current context
143
+ if (!adapterKey) {
144
+ if (!this.currentContext) {
145
+ throw new database_error_1.DatabaseError('No active database connection. Please connect first.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
146
+ }
147
+ adapterKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
148
+ }
149
+ let engine = this.migrationEngines.get(adapterKey);
150
+ if (!engine) {
151
+ const adapter = this.adapters.get(adapterKey);
152
+ if (!adapter) {
153
+ throw new database_error_1.DatabaseError(`No adapter found for key: ${adapterKey}`, enums_1.DatabaseErrorType.NOT_FOUND);
154
+ }
155
+ engine = new migration_engine_1.MigrationEngine(adapter);
156
+ this.migrationEngines.set(adapterKey, engine);
157
+ }
158
+ return engine;
159
+ }
160
+ // ==================== PRODUCT BUILDER MANAGEMENT ====================
161
+ /**
162
+ * Create a new ProductBuilder instance
163
+ */
164
+ createNewProductBuilder() {
165
+ if (!this.config) {
166
+ throw new database_error_1.DatabaseError('DatabaseService not configured. Please provide config when initializing.', enums_1.DatabaseErrorType.CONFIGURATION_ERROR);
167
+ }
168
+ return new products_service_1.default({
169
+ workspace_id: this.config.workspace_id,
170
+ public_key: this.config.public_key,
171
+ user_id: this.config.user_id,
172
+ token: this.config.token,
173
+ env_type: this.config.env_type,
174
+ access_key: this.config.access_key,
175
+ });
176
+ }
177
+ /**
178
+ * Get or create a ProductBuilder instance for the given product tag
179
+ */
180
+ async getProductBuilder(productTag) {
181
+ let builder = this.productBuilders.get(productTag);
182
+ if (!builder) {
183
+ builder = this.createNewProductBuilder();
184
+ await builder.initializeProductByTag(productTag);
185
+ this.productBuilders.set(productTag, builder);
186
+ // Update productId for logging
187
+ this.productId = builder.fetchProductId() || '';
188
+ // Cache private key for caching operations
189
+ const privateKey = builder.fetchPrivateKey();
190
+ if (privateKey) {
191
+ this.privateKeys.set(productTag, privateKey);
192
+ }
193
+ }
194
+ return builder;
195
+ }
196
+ /**
197
+ * Initialize logging service
198
+ */
199
+ initializeLogService() {
200
+ if (!this.logService && this.config) {
201
+ this.logService = new logs_service_1.default({
202
+ product_id: this.productId,
203
+ workspace_id: this.config.workspace_id,
204
+ public_key: this.config.public_key,
205
+ user_id: this.config.user_id,
206
+ token: this.config.token,
207
+ env_type: this.config.env_type,
208
+ });
209
+ }
210
+ }
211
+ /**
212
+ * Create a new ProcessorService instance for job scheduling
213
+ */
214
+ createNewProcessor() {
215
+ if (!this.config) {
216
+ throw new database_error_1.DatabaseError('DatabaseService not configured. Please provide config when initializing.', enums_1.DatabaseErrorType.CONFIGURATION_ERROR);
217
+ }
218
+ return new processor_service_1.default({
219
+ workspace_id: this.config.workspace_id,
220
+ public_key: this.config.public_key,
221
+ user_id: this.config.user_id,
222
+ token: this.config.token,
223
+ env_type: this.config.env_type,
224
+ private_key: this._privateKey,
225
+ });
226
+ }
227
+ // ==================== DATABASE CRUD OPERATIONS ====================
228
+ /**
229
+ * Register a new database configuration for a product
230
+ * @param productTag - The product tag
231
+ * @param data - The database configuration data
232
+ */
233
+ async registerDatabase(productTag, data) {
234
+ const builder = await this.getProductBuilder(productTag);
235
+ return builder.createDatabase(data);
236
+ }
237
+ /**
238
+ * Fetch all databases for a product
239
+ * @param productTag - The product tag
240
+ * @returns Array of database configurations
241
+ */
242
+ async fetchAllDatabases(productTag) {
243
+ const builder = await this.getProductBuilder(productTag);
244
+ return builder.fetchDatabases();
245
+ }
246
+ /**
247
+ * Fetch a specific database by tag
248
+ * @param productTag - The product tag
249
+ * @param databaseTag - The database tag
250
+ * @returns The database configuration or null if not found
251
+ */
252
+ async fetchDatabase(productTag, databaseTag) {
253
+ const builder = await this.getProductBuilder(productTag);
254
+ return builder.fetchDatabase(databaseTag);
255
+ }
256
+ /**
257
+ * Update a database configuration
258
+ * @param productTag - The product tag
259
+ * @param databaseTag - The database tag
260
+ * @param data - The data to update
261
+ */
262
+ async updateDatabase(productTag, databaseTag, data) {
263
+ const builder = await this.getProductBuilder(productTag);
264
+ // Process connection URLs in envs if provided
265
+ if (data.envs && data.envs.length > 0) {
266
+ const secretsService = (0, secrets_1.getSecretsService)();
267
+ const processedEnvs = [];
268
+ for (const env of data.envs) {
269
+ let connectionUrl = env.connection_url;
270
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
271
+ // If not already a secret reference and we have a secrets service, store it as a secret
272
+ if (!secretCheck.isSecret && secretsService) {
273
+ const secretKey = this.generateDbSecretKey(productTag, databaseTag, env.slug);
274
+ try {
275
+ const exists = await secretsService.exists(secretKey);
276
+ if (exists) {
277
+ await secretsService.update(secretKey, { value: connectionUrl });
278
+ console.log(`[Secrets] Updated existing secret '${secretKey}' for database '${databaseTag}' in environment '${env.slug}'`);
279
+ }
280
+ else {
281
+ await secretsService.create({
282
+ key: secretKey,
283
+ value: connectionUrl,
284
+ description: `Database connection URL for ${databaseTag} in ${env.slug}`,
285
+ scope: [productTag, databaseTag],
286
+ envs: [env.slug],
287
+ });
288
+ console.log(`[Secrets] Created new secret '${secretKey}' for database '${databaseTag}' in environment '${env.slug}'`);
289
+ }
290
+ // Update the connection URL to use the secret reference
291
+ connectionUrl = `$Secret{${secretKey}}`;
292
+ console.log(`[Secrets] Connection URL converted to secret reference: $Secret{${secretKey}}`);
293
+ }
294
+ catch (error) {
295
+ console.warn(`[Secrets] Failed to store database connection URL as secret: ${error}`);
296
+ // Continue with the original connection URL
297
+ }
298
+ }
299
+ processedEnvs.push(Object.assign(Object.assign({}, env), { connection_url: connectionUrl }));
300
+ }
301
+ data = Object.assign(Object.assign({}, data), { envs: processedEnvs });
302
+ }
303
+ return builder.updateDatabase(databaseTag, data);
304
+ }
305
+ // ==================== DATABASE TRIGGER OPERATIONS ====================
306
+ /**
307
+ * Create a database trigger
308
+ * @param productTag - The product tag
309
+ * @param data - The trigger configuration
310
+ */
311
+ async createTrigger(productTag, data) {
312
+ const builder = await this.getProductBuilder(productTag);
313
+ return builder.createDatabaseTrigger(data);
314
+ }
315
+ /**
316
+ * Update a database trigger
317
+ * @param productTag - The product tag
318
+ * @param data - The trigger configuration
319
+ */
320
+ async updateTrigger(productTag, data) {
321
+ const builder = await this.getProductBuilder(productTag);
322
+ return builder.updateDatabaseTrigger(data);
323
+ }
324
+ /**
325
+ * Fetch a database trigger
326
+ * @param productTag - The product tag
327
+ * @param tag - The trigger tag (format: database_tag:trigger_tag)
328
+ */
329
+ async fetchTrigger(productTag, tag) {
330
+ const builder = await this.getProductBuilder(productTag);
331
+ return builder.fetchDatabaseTrigger(tag);
332
+ }
333
+ /**
334
+ * Fetch all triggers for a database
335
+ * @param productTag - The product tag
336
+ * @param databaseTag - The database tag
337
+ */
338
+ async fetchTriggers(productTag, databaseTag) {
339
+ const builder = await this.getProductBuilder(productTag);
340
+ return builder.fetchDatabaseTriggers(databaseTag);
341
+ }
342
+ /**
343
+ * Delete a database trigger
344
+ * @param productTag - The product tag
345
+ * @param tag - The trigger tag (format: database_tag:trigger_tag)
346
+ */
347
+ async deleteTrigger(productTag, tag) {
348
+ const builder = await this.getProductBuilder(productTag);
349
+ return builder.deleteDatabaseTrigger(tag);
350
+ }
351
+ /**
352
+ * Get the current service configuration
353
+ */
354
+ getConfig() {
355
+ return this.config;
356
+ }
357
+ /**
358
+ * Validate cache tag exists in product and return cache configuration
359
+ * Uses local in-memory cache to avoid repeated API calls (5 minute TTL)
360
+ */
361
+ async validateCache(productTag, cacheTag) {
362
+ const cacheKey = `${productTag}:${cacheTag}`;
363
+ const cached = this.cacheConfigCache.get(cacheKey);
364
+ const now = Date.now();
365
+ const CACHE_TTL = 5 * 60 * 1000; // 5 minutes
366
+ // Return cached config if still valid
367
+ if (cached && (now - cached.fetchedAt) < CACHE_TTL) {
368
+ return { expiry: cached.expiry };
369
+ }
370
+ // Fetch from API and cache the result
371
+ const builder = await this.getProductBuilder(productTag);
372
+ const cache = await builder.fetchCache(cacheTag);
373
+ if (!cache) {
374
+ throw new database_error_1.DatabaseError(`Cache configuration '${cacheTag}' does not exist`, enums_1.DatabaseErrorType.NOT_FOUND);
375
+ }
376
+ this.cacheConfigCache.set(cacheKey, { expiry: cache.expiry, fetchedAt: now });
377
+ return { expiry: cache.expiry };
378
+ }
379
+ /**
380
+ * Update the service configuration (used after auth is complete)
381
+ */
382
+ updateConfig(config) {
383
+ if (this.config) {
384
+ this.config = Object.assign(Object.assign({}, this.config), config);
385
+ }
386
+ else {
387
+ this.config = config;
388
+ }
389
+ }
390
+ /**
391
+ * Get workspace ID from config
392
+ */
393
+ getWorkspaceId() {
394
+ var _a;
395
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || null;
396
+ }
397
+ /**
398
+ * Get user ID from config
399
+ */
400
+ getUserId() {
401
+ var _a;
402
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.user_id) || null;
403
+ }
404
+ /**
405
+ * Get authentication token from config
406
+ */
407
+ getToken() {
408
+ var _a;
409
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.token) || null;
410
+ }
411
+ /**
412
+ * Get environment type from config
413
+ */
414
+ getEnvType() {
415
+ var _a;
416
+ return ((_a = this.config) === null || _a === void 0 ? void 0 : _a.env_type) || null;
417
+ }
418
+ // ==================== CONNECTION MANAGEMENT ====================
419
+ /**
420
+ * Create/register a new database configuration
421
+ *
422
+ * @example
423
+ * // Persist to product
424
+ * await ductape.database.create({
425
+ * product: 'my-product',
426
+ * name: 'User Database',
427
+ * tag: 'users-db',
428
+ * type: 'postgresql',
429
+ * description: 'Stores user accounts and profiles',
430
+ * envs: [
431
+ * { slug: 'dev', connection_url: 'postgresql://localhost:5432/myapp_dev' },
432
+ * { slug: 'prd', connection_url: 'postgresql://prod-host:5432/myapp_prod' },
433
+ * ],
434
+ * });
435
+ *
436
+ * // Local only (not persisted)
437
+ * await ductape.database.create({
438
+ * name: 'Temp Database',
439
+ * tag: 'temp-db',
440
+ * type: 'postgresql',
441
+ * envs: [{ slug: 'dev', connection_url: 'postgresql://localhost:5432/temp' }],
442
+ * });
443
+ */
444
+ async create(config) {
445
+ var _a;
446
+ // Validate required fields
447
+ if (!config.name || !config.tag || !config.type || !((_a = config.envs) === null || _a === void 0 ? void 0 : _a.length)) {
448
+ throw new database_error_1.DatabaseError('Missing required fields: name, tag, type, and envs are required', enums_1.DatabaseErrorType.VALIDATION_ERROR);
449
+ }
450
+ const exists = await this.fetchDatabase(config.product, config.tag);
451
+ if (exists) {
452
+ return;
453
+ }
454
+ // Validate database type
455
+ if (!Object.values(enums_1.DatabaseType).includes(config.type)) {
456
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${config.type}. Supported types: ${Object.values(enums_1.DatabaseType).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
457
+ }
458
+ // Process connection URLs - store as secrets if not already secret references
459
+ const secretsService = (0, secrets_1.getSecretsService)();
460
+ const processedEnvs = [];
461
+ for (const env of config.envs) {
462
+ let connectionUrl = env.connection_url;
463
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
464
+ // If not already a secret reference and we have a secrets service, store it as a secret
465
+ if (!secretCheck.isSecret && secretsService && config.product) {
466
+ const secretKey = this.generateDbSecretKey(config.product, config.tag, env.slug);
467
+ try {
468
+ const exists = await secretsService.exists(secretKey);
469
+ if (exists) {
470
+ await secretsService.update(secretKey, { value: connectionUrl });
471
+ }
472
+ else {
473
+ await secretsService.create({
474
+ key: secretKey,
475
+ value: connectionUrl,
476
+ description: `Database connection URL for ${config.tag} in ${env.slug}`,
477
+ scope: [config.product, config.tag],
478
+ envs: [env.slug],
479
+ });
480
+ }
481
+ // Update the connection URL to use the secret reference
482
+ connectionUrl = `$Secret{${secretKey}}`;
483
+ }
484
+ catch (error) {
485
+ // Continue with the original connection URL on failure
486
+ }
487
+ }
488
+ processedEnvs.push(Object.assign(Object.assign({}, env), { connection_url: connectionUrl }));
489
+ }
490
+ // Persist to ProductBuilder if product is specified
491
+ if (config.product) {
492
+ const productBuilder = await this.getProductBuilder(config.product);
493
+ await productBuilder.createDatabase({
494
+ name: config.name,
495
+ tag: config.tag,
496
+ type: config.type, // DatabaseType maps to DatabaseTypes enum
497
+ description: config.description,
498
+ envs: processedEnvs.map(env => ({
499
+ slug: env.slug,
500
+ connection_url: env.connection_url,
501
+ description: env.description,
502
+ })),
503
+ });
504
+ }
505
+ // Create local adapters and connection contexts
506
+ this.createAdapter({
507
+ tag: config.tag,
508
+ name: config.name,
509
+ type: config.type,
510
+ description: config.description,
511
+ envs: processedEnvs,
512
+ });
513
+ }
514
+ /**
515
+ * Create local adapter and connection context for a database configuration.
516
+ * This is a lightweight operation that only sets up local state without API calls.
517
+ * Use this when the database config is already fetched/decrypted from the API.
518
+ *
519
+ * @param config - The database configuration (already decrypted if from API)
520
+ */
521
+ createAdapter(config) {
522
+ var _a;
523
+ // Validate required fields
524
+ if (!config.tag || !config.type || !((_a = config.envs) === null || _a === void 0 ? void 0 : _a.length)) {
525
+ throw new database_error_1.DatabaseError('Database configuration requires tag, type, and at least one environment', enums_1.DatabaseErrorType.VALIDATION_ERROR);
526
+ }
527
+ const databaseType = typeof config.type === 'string'
528
+ ? this.convertDatabaseType(config.type)
529
+ : config.type;
530
+ // Validate database type
531
+ if (!Object.values(enums_1.DatabaseType).includes(databaseType)) {
532
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${config.type}. Supported types: ${Object.values(enums_1.DatabaseType).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
533
+ }
534
+ // Create adapters and contexts for each environment
535
+ for (const envConfig of config.envs) {
536
+ const contextKey = this.buildContextKey(config.tag, envConfig.slug);
537
+ // Skip if already exists
538
+ if (this.adapters.has(contextKey) && this.connectionContexts.has(contextKey)) {
539
+ continue;
540
+ }
541
+ const adapter = this.adapterFactory.create(databaseType);
542
+ this.adapters.set(contextKey, adapter);
543
+ this.connectionContexts.set(contextKey, {
544
+ database: config.tag,
545
+ env: envConfig.slug,
546
+ type: databaseType,
547
+ connectionUrl: envConfig.connection_url,
548
+ connected: false,
549
+ name: config.name,
550
+ description: config.description,
551
+ });
552
+ }
553
+ }
554
+ /**
555
+ * Generate a secret key for database connection URLs
556
+ * Format: DB_{PRODUCT}_{ASSET_TAG}_{ENV}_{KEY}
557
+ *
558
+ * Where:
559
+ * - PRODUCT = productTag.split('.')[1] (second part after workspace)
560
+ * - ASSET_TAG = if dbTag starts with same workspace prefix, use second part; otherwise sanitize full tag
561
+ * - All parts are automatically capitalized
562
+ */
563
+ generateDbSecretKey(product, dbTag, env) {
564
+ const sanitize = (str) => str.toUpperCase().replace(/[^A-Z0-9]/g, '_');
565
+ // Support both ':' and '.' delimiters for product tags (e.g., 'ductape:rematch' or 'ductape.rematch')
566
+ const productParts = product.includes(':') ? product.split(':') : product.split('.');
567
+ const productKey = productParts[1] || productParts[0]; // Use product name (index 1), fallback to index 0
568
+ const workspace = productParts[0];
569
+ // Support both ':' and '.' delimiters for database tags
570
+ const dbParts = dbTag.includes(':') ? dbTag.split(':') : dbTag.split('.');
571
+ let assetTag;
572
+ if (dbParts.length > 1 && dbParts[0] === workspace) {
573
+ // Same workspace prefix, use second part
574
+ assetTag = dbParts[1];
575
+ }
576
+ else {
577
+ // Different or no prefix, use full tag
578
+ assetTag = dbTag;
579
+ }
580
+ return `DB_${sanitize(productKey)}_${sanitize(assetTag)}_${sanitize(env)}_URL`;
581
+ }
582
+ /**
583
+ * Connect to a database
584
+ *
585
+ * @example
586
+ * const result = await ductape.database.connect({
587
+ * env: 'dev',
588
+ * product: 'my-app',
589
+ * database: 'users-db',
590
+ * });
591
+ * console.log('Connected:', result.connected);
592
+ * console.log('Database Version:', result.version);
593
+ * console.log('Latency:', result.latency, 'ms');
594
+ *
595
+ * // With the returned connection object, you can use scoped operations:
596
+ * const db = await ductape.databases.connect({ env: 'dev', product: 'my-app', database: 'users-db' });
597
+ * await db.triggers.create({ tag: 'my-trigger', ... });
598
+ */
599
+ async connect(config) {
600
+ var _a, _b, _c, _d, _e, _f;
601
+ const process_id = (0, processor_utils_1.generateObjectId)();
602
+ const start = Date.now();
603
+ const contextKey = this.buildContextKey(config.database, config.env);
604
+ let adapter = this.adapters.get(contextKey);
605
+ let context = this.connectionContexts.get(contextKey);
606
+ // If not found locally, fetch from the remote API
607
+ if (!adapter || !context) {
608
+ if (!config.product) {
609
+ throw new database_error_1.DatabaseError(`Database '${config.database}' not found locally. Please provide 'product' to fetch from remote.`, enums_1.DatabaseErrorType.NOT_FOUND);
610
+ }
611
+ // Initialize product builder
612
+ await this.getProductBuilder(config.product);
613
+ // Fetch the database config from the API (already decrypted)
614
+ const dbConfig = await this.fetchDatabase(config.product, config.database);
615
+ if (!dbConfig) {
616
+ throw new database_error_1.DatabaseError(`Database '${config.database}' not found for product '${config.product}'.`, enums_1.DatabaseErrorType.NOT_FOUND);
617
+ }
618
+ // Register the database locally (config is already decrypted from API)
619
+ this.createAdapter({
620
+ tag: config.database,
621
+ name: dbConfig.name,
622
+ type: dbConfig.type,
623
+ description: dbConfig.description,
624
+ envs: dbConfig.envs.map(e => ({
625
+ slug: e.slug,
626
+ connection_url: e.connection_url,
627
+ description: e.description,
628
+ })),
629
+ });
630
+ adapter = this.adapters.get(contextKey);
631
+ context = this.connectionContexts.get(contextKey);
632
+ }
633
+ if (!adapter || !context) {
634
+ throw new database_error_1.DatabaseError(`Failed to initialize adapter for ${contextKey}`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
635
+ }
636
+ // Initialize logging
637
+ this.initializeLogService();
638
+ const envValue = config.env || '';
639
+ const baseLogs = {
640
+ product_tag: config.product || '',
641
+ workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
642
+ env: envValue,
643
+ app_env: envValue,
644
+ process_id,
645
+ type: logs_types_1.LogEventTypes.DATABASE,
646
+ parent_tag: config.database,
647
+ child_tag: 'connect',
648
+ data: { database: config.database, env: envValue, operation: 'connect' },
649
+ };
650
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database connect - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
651
+ try {
652
+ // Resolve secret reference in connection URL if needed
653
+ let connectionUrl = context.connectionUrl;
654
+ const secretCheck = (0, secrets_1.isSecretReference)(connectionUrl);
655
+ if (secretCheck.isSecret) {
656
+ const secretsService = (0, secrets_1.getSecretsService)();
657
+ if (secretsService) {
658
+ const resolved = await secretsService.resolve(connectionUrl, { env: config.env });
659
+ connectionUrl = resolved.value;
660
+ }
661
+ else {
662
+ throw new database_error_1.DatabaseError(`Connection URL contains secret reference but secrets service is not initialized.`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
663
+ }
664
+ }
665
+ await adapter.connect({
666
+ connectionUrl,
667
+ });
668
+ context.connected = true;
669
+ context.product = config.product;
670
+ this.currentContext = context;
671
+ const end = Date.now();
672
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
673
+ end, message: 'Database connect - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
674
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
675
+ // Return a DatabaseConnection object for scoped operations
676
+ return new DatabaseConnection(this, config.database, config.env, config.product || '');
677
+ }
678
+ catch (error) {
679
+ const end = Date.now();
680
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
681
+ end, message: 'Database connect - failed', failed_execution: true, data: { database: config.database, env: config.env, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
682
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
683
+ throw new database_error_1.DatabaseError(`Failed to connect to database: ${error.message}`, enums_1.DatabaseErrorType.CONNECTION_ERROR, error);
684
+ }
685
+ }
686
+ /**
687
+ * Test database connection without establishing persistent connection
688
+ *
689
+ * @example
690
+ * const result = await ductape.database.testConnection({
691
+ * env: 'dev',
692
+ * product: 'my-app',
693
+ * database: 'users-db',
694
+ * });
695
+ * if (result.connected) {
696
+ * console.log('Connection successful!');
697
+ * } else {
698
+ * console.error('Connection failed:', result.error);
699
+ * }
700
+ */
701
+ async testConnection(config) {
702
+ const contextKey = this.buildContextKey(config.database, config.env);
703
+ let adapter = this.adapters.get(contextKey);
704
+ let context = this.connectionContexts.get(contextKey);
705
+ if (!adapter || !context) {
706
+ return {
707
+ connected: false,
708
+ error: `Database '${config.database}' not found for environment '${config.env}'`,
709
+ };
710
+ }
711
+ const startTime = Date.now();
712
+ try {
713
+ const result = await adapter.testConnection({
714
+ connectionUrl: context.connectionUrl,
715
+ });
716
+ return {
717
+ connected: result.connected,
718
+ version: result.version,
719
+ latency: Date.now() - startTime,
720
+ };
721
+ }
722
+ catch (error) {
723
+ return {
724
+ connected: false,
725
+ error: error.message,
726
+ latency: Date.now() - startTime,
727
+ };
728
+ }
729
+ }
730
+ /**
731
+ * Disconnect from the current database
732
+ */
733
+ async disconnect() {
734
+ if (this.currentContext) {
735
+ const contextKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
736
+ const adapter = this.adapters.get(contextKey);
737
+ if (adapter) {
738
+ await adapter.disconnect();
739
+ this.currentContext.connected = false;
740
+ }
741
+ this.currentContext = null;
742
+ }
743
+ }
744
+ /**
745
+ * Close all database connections
746
+ *
747
+ * @example
748
+ * await ductape.database.closeAll();
749
+ */
750
+ async closeAll() {
751
+ const disconnectPromises = [];
752
+ for (const [key, adapter] of this.adapters) {
753
+ disconnectPromises.push(adapter.disconnect());
754
+ const context = this.connectionContexts.get(key);
755
+ if (context) {
756
+ context.connected = false;
757
+ }
758
+ }
759
+ await Promise.all(disconnectPromises);
760
+ this.currentContext = null;
761
+ }
762
+ /**
763
+ * Fetch all registered databases
764
+ *
765
+ * @example
766
+ * const databases = await ductape.database.fetchAll();
767
+ * databases.forEach((db) => {
768
+ * console.log(`${db.name} (${db.tag}): ${db.type}`);
769
+ * });
770
+ */
771
+ async fetchAll(product) {
772
+ const databases = new Map();
773
+ for (const [key, context] of this.connectionContexts) {
774
+ if (!databases.has(context.database)) {
775
+ databases.set(context.database, {
776
+ product,
777
+ name: context.name || context.database,
778
+ tag: context.database,
779
+ type: context.type,
780
+ description: context.description,
781
+ envs: [],
782
+ });
783
+ }
784
+ databases.get(context.database).envs.push({
785
+ slug: context.env,
786
+ connection_url: context.connectionUrl,
787
+ });
788
+ }
789
+ return Array.from(databases.values());
790
+ }
791
+ /**
792
+ * Fetch a specific database configuration
793
+ *
794
+ * @example
795
+ * const usersDb = await ductape.database.fetch('users-db');
796
+ * console.log('Database:', usersDb.name);
797
+ * console.log('Type:', usersDb.type);
798
+ * console.log('Environments:', usersDb.envs);
799
+ */
800
+ async fetch(product, database) {
801
+ const databases = await this.fetchAll(product);
802
+ return databases.find((db) => db.tag === database) || null;
803
+ }
804
+ /**
805
+ * Update a local database configuration
806
+ *
807
+ * @example
808
+ * await ductape.database.updateLocalConfig('users-db', {
809
+ * name: 'User Database v2',
810
+ * description: 'Updated user storage',
811
+ * envs: [
812
+ * { slug: 'dev', connection_url: 'postgresql://new-dev-host:5432/myapp' },
813
+ * ],
814
+ * });
815
+ */
816
+ async updateLocalConfig(tag, updates) {
817
+ for (const [key, context] of this.connectionContexts) {
818
+ if (context.database === tag) {
819
+ if (updates.name) {
820
+ context.name = updates.name;
821
+ }
822
+ if (updates.description) {
823
+ context.description = updates.description;
824
+ }
825
+ if (updates.envs) {
826
+ const envUpdate = updates.envs.find((e) => e.slug === context.env);
827
+ if (envUpdate) {
828
+ context.connectionUrl = envUpdate.connection_url;
829
+ }
830
+ }
831
+ }
832
+ }
833
+ }
834
+ // ==================== QUERY OPERATIONS ====================
835
+ /**
836
+ * Query records from a table
837
+ *
838
+ * @example
839
+ * // With established connection
840
+ * const result = await ductape.database.query({
841
+ * table: 'users',
842
+ * where: { status: 'active' },
843
+ * orderBy: { column: 'created_at', order: 'DESC' },
844
+ * limit: 10,
845
+ * });
846
+ *
847
+ * // With explicit connection params
848
+ * const result = await ductape.database.query({
849
+ * env: 'prd',
850
+ * product: 'my-app',
851
+ * database: 'main-db',
852
+ * table: 'users',
853
+ * });
854
+ */
855
+ async query(options) {
856
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
857
+ const process_id = (0, processor_utils_1.generateObjectId)();
858
+ const start = Date.now();
859
+ this.initializeLogService();
860
+ // Session log fields (will be populated if session is provided)
861
+ let sessionLogFields = {};
862
+ let resolvedOptions = options;
863
+ // Process session if provided
864
+ if (options.session && options.product) {
865
+ const builder = await this.getProductBuilder(options.product);
866
+ const privateKey = builder.fetchPrivateKey();
867
+ if (privateKey) {
868
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
869
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
870
+ fetchSessionSelector: async (sessionTag) => {
871
+ const sessionConfig = await builder.fetchSession(sessionTag);
872
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
873
+ },
874
+ });
875
+ if (sessionResult.error) {
876
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
877
+ }
878
+ resolvedOptions = sessionResult.input;
879
+ sessionLogFields = sessionResult.logFields;
880
+ }
881
+ }
882
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
883
+ const baseLogs = Object.assign({ product_tag: options.product || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.product) || '', workspace_id: ((_c = this.config) === null || _c === void 0 ? void 0 : _c.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: options.database || ((_d = this.currentContext) === null || _d === void 0 ? void 0 : _d.database) || '', child_tag: 'query', data: {
884
+ table: options.table,
885
+ operation: 'query',
886
+ database: options.database || ((_e = this.currentContext) === null || _e === void 0 ? void 0 : _e.database) || '',
887
+ env: envValue,
888
+ where: options.where,
889
+ select: options.select,
890
+ orderBy: options.orderBy,
891
+ limit: options.limit,
892
+ offset: options.offset,
893
+ include: options.include,
894
+ } }, sessionLogFields);
895
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database query - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
896
+ // Check cache if cache tag is provided
897
+ // Use product from options or from current context (set during connect)
898
+ const productTag = options.product || ((_g = this.currentContext) === null || _g === void 0 ? void 0 : _g.product);
899
+ const privateKey = productTag ? this.privateKeys.get(productTag) : undefined;
900
+ let queryCacheKey;
901
+ try {
902
+ if (options.cache && this.cacheManager && privateKey) {
903
+ const cacheOptions = {
904
+ cache_tag: options.cache,
905
+ product_tag: productTag || '',
906
+ component_tag: options.database || ((_h = this.currentContext) === null || _h === void 0 ? void 0 : _h.database) || '',
907
+ component_type: 'database',
908
+ input: { table: options.table, where: options.where, select: options.select, orderBy: options.orderBy, limit: options.limit, offset: options.offset },
909
+ privateKey,
910
+ };
911
+ const cached = await this.cacheManager.fetch(cacheOptions);
912
+ queryCacheKey = cached.key;
913
+ if (cached.hit && cached.data) {
914
+ const end = Date.now();
915
+ (_j = this.logService) === null || _j === void 0 ? void 0 : _j.add(Object.assign(Object.assign({}, baseLogs), { start,
916
+ end, message: `Database query - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, cache_tag: options.cache, cache_key: cached.key, cache_status: true }));
917
+ (_k = this.logService) === null || _k === void 0 ? void 0 : _k.publish();
918
+ return cached.data;
919
+ }
920
+ }
921
+ const adapter = this.getAdapter(resolvedOptions);
922
+ const queryBuilder = new query_builder_1.QueryBuilder(adapter.getDatabaseType());
923
+ const builtQuery = queryBuilder.buildQuery(resolvedOptions);
924
+ const result = await adapter.query(builtQuery);
925
+ // Store in cache if cache tag is provided
926
+ if (options.cache && this.cacheManager && privateKey && productTag) {
927
+ const cacheConfig = await this.validateCache(productTag, options.cache);
928
+ const cacheOptions = {
929
+ cache_tag: options.cache,
930
+ product_tag: productTag,
931
+ component_tag: options.database || ((_l = this.currentContext) === null || _l === void 0 ? void 0 : _l.database) || '',
932
+ component_type: 'database',
933
+ input: { table: options.table, where: options.where, select: options.select, orderBy: options.orderBy, limit: options.limit, offset: options.offset },
934
+ privateKey,
935
+ expiry: cacheConfig.expiry,
936
+ };
937
+ this.cacheManager.store(cacheOptions, result); // Fire-and-forget
938
+ }
939
+ const end = Date.now();
940
+ (_m = this.logService) === null || _m === void 0 ? void 0 : _m.add(Object.assign(Object.assign({}, baseLogs), { start,
941
+ end, message: options.cache ? 'Database query - cache miss' : 'Database query - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, cache_tag: options.cache, cache_key: queryCacheKey }));
942
+ (_o = this.logService) === null || _o === void 0 ? void 0 : _o.publish();
943
+ return result;
944
+ }
945
+ catch (error) {
946
+ const end = Date.now();
947
+ (_p = this.logService) === null || _p === void 0 ? void 0 : _p.add(Object.assign(Object.assign({}, baseLogs), { start,
948
+ end, message: 'Database query - failed', failed_execution: true, data: { table: options.table, operation: 'query', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL, cache_tag: options.cache, cache_key: queryCacheKey }));
949
+ await ((_q = this.logService) === null || _q === void 0 ? void 0 : _q.publish());
950
+ throw error;
951
+ }
952
+ }
953
+ /**
954
+ * Execute a raw query
955
+ *
956
+ * @example
957
+ * // PostgreSQL
958
+ * const result = await ductape.database.raw({
959
+ * query: 'SELECT * FROM users WHERE created_at > $1 AND status = $2',
960
+ * params: [new Date('2024-01-01'), 'active'],
961
+ * });
962
+ *
963
+ * // MySQL
964
+ * const result = await ductape.database.raw({
965
+ * query: 'SELECT * FROM users WHERE created_at > ? AND status = ?',
966
+ * params: [new Date('2024-01-01'), 'active'],
967
+ * });
968
+ *
969
+ * // MongoDB
970
+ * const result = await ductape.database.raw({
971
+ * query: { status: 'active', created_at: { $gte: new Date('2024-01-01') } },
972
+ * collection: 'users',
973
+ * });
974
+ */
975
+ async raw(options) {
976
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
977
+ const process_id = (0, processor_utils_1.generateObjectId)();
978
+ const start = Date.now();
979
+ this.initializeLogService();
980
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
981
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
982
+ const baseLogs = {
983
+ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '',
984
+ workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '',
985
+ env: envValue,
986
+ app_env: envValue,
987
+ process_id,
988
+ type: logs_types_1.LogEventTypes.DATABASE,
989
+ parent_tag: databaseValue,
990
+ child_tag: 'raw',
991
+ data: {
992
+ operation: 'raw',
993
+ database: databaseValue,
994
+ env: envValue,
995
+ collection: options.collection,
996
+ query: options.query,
997
+ params: options.params,
998
+ },
999
+ };
1000
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database raw query - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1001
+ // Check cache if cache tag is provided
1002
+ const privateKey = options.product ? this.privateKeys.get(options.product) : undefined;
1003
+ let rawQueryCacheKey;
1004
+ try {
1005
+ if (options.cache && this.cacheManager && privateKey) {
1006
+ const cacheOptions = {
1007
+ cache_tag: options.cache,
1008
+ product_tag: options.product || '',
1009
+ component_tag: options.database || '',
1010
+ component_type: 'database',
1011
+ input: { query: options.query, params: options.params, collection: options.collection },
1012
+ privateKey,
1013
+ };
1014
+ const cached = await this.cacheManager.fetch(cacheOptions);
1015
+ rawQueryCacheKey = cached.key;
1016
+ if (cached.hit && cached.data) {
1017
+ const end = Date.now();
1018
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1019
+ end, message: `Database raw query - cache hit (${cached.source})`, successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, cache_tag: options.cache, cache_key: cached.key, cache_status: true }));
1020
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1021
+ return cached.data;
1022
+ }
1023
+ }
1024
+ const adapter = this.getAdapter(options);
1025
+ const result = await adapter.raw(options);
1026
+ // Store in cache if cache tag is provided
1027
+ if (options.cache && this.cacheManager && privateKey && options.product) {
1028
+ const cacheConfig = await this.validateCache(options.product, options.cache);
1029
+ const cacheOptions = {
1030
+ cache_tag: options.cache,
1031
+ product_tag: options.product,
1032
+ component_tag: options.database || '',
1033
+ component_type: 'database',
1034
+ input: { query: options.query, params: options.params, collection: options.collection },
1035
+ privateKey,
1036
+ expiry: cacheConfig.expiry,
1037
+ };
1038
+ this.cacheManager.store(cacheOptions, result); // Fire-and-forget
1039
+ }
1040
+ const end = Date.now();
1041
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1042
+ end, message: options.cache ? 'Database raw query - cache miss' : 'Database raw query - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS, cache_tag: options.cache, cache_key: rawQueryCacheKey }));
1043
+ (_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish();
1044
+ return result;
1045
+ }
1046
+ catch (error) {
1047
+ const end = Date.now();
1048
+ (_k = this.logService) === null || _k === void 0 ? void 0 : _k.add(Object.assign(Object.assign({}, baseLogs), { start,
1049
+ end, message: 'Database raw query - failed', failed_execution: true, data: { operation: 'raw', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL, cache_tag: options.cache, cache_key: rawQueryCacheKey }));
1050
+ await ((_l = this.logService) === null || _l === void 0 ? void 0 : _l.publish());
1051
+ throw error;
1052
+ }
1053
+ }
1054
+ // ==================== WRITE OPERATIONS ====================
1055
+ /**
1056
+ * Insert one or more records
1057
+ *
1058
+ * @example
1059
+ * // Single record
1060
+ * const result = await ductape.database.insert({
1061
+ * table: 'users',
1062
+ * data: {
1063
+ * name: 'Jane Doe',
1064
+ * email: 'jane@example.com',
1065
+ * status: 'active',
1066
+ * },
1067
+ * returning: true,
1068
+ * });
1069
+ *
1070
+ * // Multiple records
1071
+ * const result = await ductape.database.insert({
1072
+ * table: 'users',
1073
+ * data: [
1074
+ * { name: 'User 1', email: 'user1@example.com' },
1075
+ * { name: 'User 2', email: 'user2@example.com' },
1076
+ * ],
1077
+ * });
1078
+ *
1079
+ * // With conflict handling (upsert)
1080
+ * const result = await ductape.database.insert({
1081
+ * table: 'users',
1082
+ * data: { email: 'john@example.com', name: 'John' },
1083
+ * onConflict: {
1084
+ * columns: ['email'],
1085
+ * action: 'update',
1086
+ * update: ['name'],
1087
+ * },
1088
+ * });
1089
+ */
1090
+ async insert(options) {
1091
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1092
+ const process_id = (0, processor_utils_1.generateObjectId)();
1093
+ const start = Date.now();
1094
+ this.initializeLogService();
1095
+ // Session log fields (will be populated if session is provided)
1096
+ let sessionLogFields = {};
1097
+ let resolvedOptions = options;
1098
+ // Process session if provided
1099
+ if (options.session && options.product) {
1100
+ const builder = await this.getProductBuilder(options.product);
1101
+ const privateKey = builder.fetchPrivateKey();
1102
+ if (privateKey) {
1103
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1104
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
1105
+ fetchSessionSelector: async (sessionTag) => {
1106
+ const sessionConfig = await builder.fetchSession(sessionTag);
1107
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
1108
+ },
1109
+ });
1110
+ if (sessionResult.error) {
1111
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1112
+ }
1113
+ resolvedOptions = sessionResult.input;
1114
+ sessionLogFields = sessionResult.logFields;
1115
+ }
1116
+ }
1117
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1118
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1119
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'insert', data: {
1120
+ table: options.table,
1121
+ operation: 'insert',
1122
+ database: databaseValue,
1123
+ env: envValue,
1124
+ data: options.data,
1125
+ returning: options.returning,
1126
+ onConflict: options.onConflict,
1127
+ } }, sessionLogFields);
1128
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database insert - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1129
+ try {
1130
+ // Apply pre-save operations if specified
1131
+ let processedData = resolvedOptions.data;
1132
+ if (resolvedOptions.preSave && resolvedOptions.preSave.length > 0) {
1133
+ const processor = new presave_processor_1.PreSaveProcessor(resolvedOptions.preSaveConfig);
1134
+ const preSaveResult = await processor.process(resolvedOptions.data, resolvedOptions.preSave);
1135
+ processedData = preSaveResult.data;
1136
+ }
1137
+ const adapter = this.getAdapter(resolvedOptions);
1138
+ const result = await adapter.insert(Object.assign(Object.assign({}, resolvedOptions), { data: processedData }));
1139
+ const end = Date.now();
1140
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1141
+ end, message: 'Database insert - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1142
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1143
+ return result;
1144
+ }
1145
+ catch (error) {
1146
+ const end = Date.now();
1147
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1148
+ end, message: 'Database insert - failed', failed_execution: true, data: { table: options.table, operation: 'insert', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1149
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1150
+ throw error;
1151
+ }
1152
+ }
1153
+ /**
1154
+ * Update records matching conditions
1155
+ *
1156
+ * @example
1157
+ * // Simple update
1158
+ * const result = await ductape.database.update({
1159
+ * table: 'users',
1160
+ * data: { status: 'inactive' },
1161
+ * where: { last_login: { $LT: new Date('2023-01-01') } },
1162
+ * });
1163
+ *
1164
+ * // With increment/decrement
1165
+ * await ductape.database.update({
1166
+ * table: 'products',
1167
+ * data: { stock: { $inc: 10 } },
1168
+ * where: { id: productId },
1169
+ * });
1170
+ */
1171
+ async update(options) {
1172
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1173
+ const process_id = (0, processor_utils_1.generateObjectId)();
1174
+ const start = Date.now();
1175
+ this.initializeLogService();
1176
+ // Session log fields (will be populated if session is provided)
1177
+ let sessionLogFields = {};
1178
+ let resolvedOptions = options;
1179
+ // Process session if provided
1180
+ if (options.session && options.product) {
1181
+ const builder = await this.getProductBuilder(options.product);
1182
+ const privateKey = builder.fetchPrivateKey();
1183
+ if (privateKey) {
1184
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1185
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
1186
+ fetchSessionSelector: async (sessionTag) => {
1187
+ const sessionConfig = await builder.fetchSession(sessionTag);
1188
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
1189
+ },
1190
+ });
1191
+ if (sessionResult.error) {
1192
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1193
+ }
1194
+ resolvedOptions = sessionResult.input;
1195
+ sessionLogFields = sessionResult.logFields;
1196
+ }
1197
+ }
1198
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1199
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1200
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'update', data: {
1201
+ table: options.table,
1202
+ operation: 'update',
1203
+ database: databaseValue,
1204
+ env: envValue,
1205
+ where: options.where,
1206
+ data: options.data,
1207
+ returning: options.returning,
1208
+ } }, sessionLogFields);
1209
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database update - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1210
+ try {
1211
+ // Apply pre-save operations if specified
1212
+ let processedData = resolvedOptions.data;
1213
+ if (resolvedOptions.preSave && resolvedOptions.preSave.length > 0) {
1214
+ const processor = new presave_processor_1.PreSaveProcessor(resolvedOptions.preSaveConfig);
1215
+ const preSaveResult = await processor.process(resolvedOptions.data, resolvedOptions.preSave);
1216
+ processedData = preSaveResult.data;
1217
+ }
1218
+ const adapter = this.getAdapter(resolvedOptions);
1219
+ const result = await adapter.update(Object.assign(Object.assign({}, resolvedOptions), { data: processedData }));
1220
+ const end = Date.now();
1221
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1222
+ end, message: 'Database update - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1223
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1224
+ return result;
1225
+ }
1226
+ catch (error) {
1227
+ const end = Date.now();
1228
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1229
+ end, message: 'Database update - failed', failed_execution: true, data: { table: options.table, operation: 'update', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1230
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1231
+ throw error;
1232
+ }
1233
+ }
1234
+ /**
1235
+ * Delete records matching conditions
1236
+ *
1237
+ * @example
1238
+ * const result = await ductape.database.delete({
1239
+ * table: 'users',
1240
+ * where: { status: 'deleted' },
1241
+ * });
1242
+ * console.log('Deleted count:', result.count);
1243
+ */
1244
+ async delete(options) {
1245
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1246
+ const process_id = (0, processor_utils_1.generateObjectId)();
1247
+ const start = Date.now();
1248
+ this.initializeLogService();
1249
+ // Session log fields (will be populated if session is provided)
1250
+ let sessionLogFields = {};
1251
+ let resolvedOptions = options;
1252
+ // Process session if provided
1253
+ if (options.session && options.product) {
1254
+ const builder = await this.getProductBuilder(options.product);
1255
+ const privateKey = builder.fetchPrivateKey();
1256
+ if (privateKey) {
1257
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1258
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
1259
+ fetchSessionSelector: async (sessionTag) => {
1260
+ const sessionConfig = await builder.fetchSession(sessionTag);
1261
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
1262
+ },
1263
+ });
1264
+ if (sessionResult.error) {
1265
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1266
+ }
1267
+ resolvedOptions = sessionResult.input;
1268
+ sessionLogFields = sessionResult.logFields;
1269
+ }
1270
+ }
1271
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1272
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1273
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'delete', data: {
1274
+ table: options.table,
1275
+ operation: 'delete',
1276
+ database: databaseValue,
1277
+ env: envValue,
1278
+ where: options.where,
1279
+ } }, sessionLogFields);
1280
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database delete - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1281
+ try {
1282
+ const adapter = this.getAdapter(resolvedOptions);
1283
+ const result = await adapter.delete(resolvedOptions);
1284
+ const end = Date.now();
1285
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1286
+ end, message: 'Database delete - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1287
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1288
+ return result;
1289
+ }
1290
+ catch (error) {
1291
+ const end = Date.now();
1292
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1293
+ end, message: 'Database delete - failed', failed_execution: true, data: { table: options.table, operation: 'delete', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1294
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1295
+ throw error;
1296
+ }
1297
+ }
1298
+ /**
1299
+ * Insert or update a record based on conflict keys
1300
+ *
1301
+ * @example
1302
+ * const result = await ductape.database.upsert({
1303
+ * table: 'user_preferences',
1304
+ * data: {
1305
+ * user_id: 123,
1306
+ * theme: 'dark',
1307
+ * language: 'en',
1308
+ * },
1309
+ * conflictKeys: ['user_id'],
1310
+ * });
1311
+ * console.log('Operation:', result.operation); // 'inserted' or 'updated'
1312
+ */
1313
+ async upsert(options) {
1314
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
1315
+ const process_id = (0, processor_utils_1.generateObjectId)();
1316
+ const start = Date.now();
1317
+ this.initializeLogService();
1318
+ // Session log fields (will be populated if session is provided)
1319
+ let sessionLogFields = {};
1320
+ let resolvedOptions = options;
1321
+ // Process session if provided
1322
+ if (options.session && options.product) {
1323
+ const builder = await this.getProductBuilder(options.product);
1324
+ const privateKey = builder.fetchPrivateKey();
1325
+ if (privateKey) {
1326
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
1327
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
1328
+ fetchSessionSelector: async (sessionTag) => {
1329
+ const sessionConfig = await builder.fetchSession(sessionTag);
1330
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
1331
+ },
1332
+ });
1333
+ if (sessionResult.error) {
1334
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
1335
+ }
1336
+ resolvedOptions = sessionResult.input;
1337
+ sessionLogFields = sessionResult.logFields;
1338
+ }
1339
+ }
1340
+ const envValue = options.env || ((_a = this.currentContext) === null || _a === void 0 ? void 0 : _a.env) || '';
1341
+ const databaseValue = options.database || ((_b = this.currentContext) === null || _b === void 0 ? void 0 : _b.database) || '';
1342
+ const baseLogs = Object.assign({ product_tag: options.product || ((_c = this.currentContext) === null || _c === void 0 ? void 0 : _c.product) || '', workspace_id: ((_d = this.config) === null || _d === void 0 ? void 0 : _d.workspace_id) || '', env: envValue, app_env: envValue, process_id, type: logs_types_1.LogEventTypes.DATABASE, parent_tag: databaseValue, child_tag: 'upsert', data: {
1343
+ table: options.table,
1344
+ operation: 'upsert',
1345
+ database: databaseValue,
1346
+ env: envValue,
1347
+ data: options.data,
1348
+ conflictKeys: options.conflictKeys,
1349
+ updateColumns: options.updateColumns,
1350
+ returning: options.returning,
1351
+ } }, sessionLogFields);
1352
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database upsert - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
1353
+ try {
1354
+ const adapter = this.getAdapter(resolvedOptions);
1355
+ const result = await adapter.upsert(resolvedOptions);
1356
+ const end = Date.now();
1357
+ (_f = this.logService) === null || _f === void 0 ? void 0 : _f.add(Object.assign(Object.assign({}, baseLogs), { start,
1358
+ end, message: 'Database upsert - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
1359
+ (_g = this.logService) === null || _g === void 0 ? void 0 : _g.publish();
1360
+ return result;
1361
+ }
1362
+ catch (error) {
1363
+ const end = Date.now();
1364
+ (_h = this.logService) === null || _h === void 0 ? void 0 : _h.add(Object.assign(Object.assign({}, baseLogs), { start,
1365
+ end, message: 'Database upsert - failed', failed_execution: true, data: { table: options.table, operation: 'upsert', error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
1366
+ await ((_j = this.logService) === null || _j === void 0 ? void 0 : _j.publish());
1367
+ throw error;
1368
+ }
1369
+ }
1370
+ // ==================== AGGREGATION OPERATIONS ====================
1371
+ /**
1372
+ * Count records
1373
+ *
1374
+ * @example
1375
+ * const count = await ductape.database.count({
1376
+ * table: 'users',
1377
+ * where: { status: 'active' },
1378
+ * });
1379
+ */
1380
+ async count(options) {
1381
+ const adapter = this.getAdapter(options);
1382
+ return adapter.count(options);
1383
+ }
1384
+ /**
1385
+ * Sum values of a column
1386
+ *
1387
+ * @example
1388
+ * const totalRevenue = await ductape.database.sum({
1389
+ * table: 'orders',
1390
+ * column: 'total',
1391
+ * where: { status: 'completed' },
1392
+ * });
1393
+ */
1394
+ async sum(options) {
1395
+ const adapter = this.getAdapter(options);
1396
+ return adapter.sum(options);
1397
+ }
1398
+ /**
1399
+ * Calculate average of a column
1400
+ *
1401
+ * @example
1402
+ * const avgOrderValue = await ductape.database.avg({
1403
+ * table: 'orders',
1404
+ * column: 'total',
1405
+ * });
1406
+ */
1407
+ async avg(options) {
1408
+ const adapter = this.getAdapter(options);
1409
+ return adapter.avg(options);
1410
+ }
1411
+ /**
1412
+ * Get minimum value of a column
1413
+ *
1414
+ * @example
1415
+ * const minPrice = await ductape.database.min({
1416
+ * table: 'products',
1417
+ * column: 'price',
1418
+ * });
1419
+ */
1420
+ async min(options) {
1421
+ const adapter = this.getAdapter(options);
1422
+ return adapter.min(options);
1423
+ }
1424
+ /**
1425
+ * Get maximum value of a column
1426
+ *
1427
+ * @example
1428
+ * const maxPrice = await ductape.database.max({
1429
+ * table: 'products',
1430
+ * column: 'price',
1431
+ * });
1432
+ */
1433
+ async max(options) {
1434
+ const adapter = this.getAdapter(options);
1435
+ return adapter.max(options);
1436
+ }
1437
+ /**
1438
+ * Perform multiple aggregations in one query
1439
+ *
1440
+ * @example
1441
+ * const stats = await ductape.database.aggregate({
1442
+ * table: 'orders',
1443
+ * operations: {
1444
+ * total_revenue: { $SUM: 'total' },
1445
+ * order_count: { $COUNT: '*' },
1446
+ * avg_order_value: { $AVG: 'total' },
1447
+ * },
1448
+ * where: { status: 'completed' },
1449
+ * });
1450
+ */
1451
+ async aggregate(options) {
1452
+ const adapter = this.getAdapter(options);
1453
+ const aggregationBuilder = new aggregation_builder_1.AggregationBuilder(adapter.getDatabaseType());
1454
+ const builtAggregation = aggregationBuilder.buildAggregation(options);
1455
+ return adapter.aggregate(builtAggregation);
1456
+ }
1457
+ /**
1458
+ * Group records and perform aggregations
1459
+ *
1460
+ * @example
1461
+ * const salesByCategory = await ductape.database.groupBy({
1462
+ * table: 'products',
1463
+ * groupBy: ['category'],
1464
+ * operations: {
1465
+ * total_sales: { $SUM: 'sales_count' },
1466
+ * avg_price: { $AVG: 'price' },
1467
+ * },
1468
+ * having: {
1469
+ * total_sales: { $GT: 100 },
1470
+ * },
1471
+ * });
1472
+ */
1473
+ async groupBy(options) {
1474
+ const adapter = this.getAdapter(options);
1475
+ const aggregationBuilder = new aggregation_builder_1.AggregationBuilder(adapter.getDatabaseType());
1476
+ const builtGroupBy = aggregationBuilder.buildGroupBy(options);
1477
+ return adapter.groupBy(builtGroupBy);
1478
+ }
1479
+ // ==================== TRANSACTION OPERATIONS ====================
1480
+ /**
1481
+ * Execute operations within a transaction (callback API - recommended)
1482
+ *
1483
+ * @example
1484
+ * const order = await ductape.database.transaction({
1485
+ * env: 'prd',
1486
+ * product: 'my-app',
1487
+ * database: 'main-db',
1488
+ * }, async (transaction) => {
1489
+ * const order = await ductape.database.insert({
1490
+ * table: 'orders',
1491
+ * data: { customer_id: 123, total: 99.99 },
1492
+ * transaction,
1493
+ * });
1494
+ *
1495
+ * await ductape.database.insert({
1496
+ * table: 'order_items',
1497
+ * data: items.map(item => ({ order_id: order.insertedIds[0], ...item })),
1498
+ * transaction,
1499
+ * });
1500
+ *
1501
+ * return order;
1502
+ * });
1503
+ */
1504
+ async transaction(options, callback) {
1505
+ const adapter = this.getAdapter(options);
1506
+ return this.transactionManager.executeTransaction(adapter, options, callback);
1507
+ }
1508
+ /**
1509
+ * Begin a transaction manually
1510
+ *
1511
+ * @example
1512
+ * const transaction = await ductape.database.beginTransaction({
1513
+ * env: 'prd',
1514
+ * product: 'my-app',
1515
+ * database: 'main-db',
1516
+ * isolationLevel: 'REPEATABLE_READ',
1517
+ * });
1518
+ *
1519
+ * try {
1520
+ * await ductape.database.insert({ table: 'accounts', data: {...}, transaction });
1521
+ * await transaction.commit();
1522
+ * } catch (error) {
1523
+ * await transaction.rollback();
1524
+ * throw error;
1525
+ * }
1526
+ */
1527
+ async beginTransaction(options) {
1528
+ const adapter = this.getAdapter(options);
1529
+ return this.transactionManager.beginTransaction(adapter, options);
1530
+ }
1531
+ // ==================== SCHEMA OPERATIONS ====================
1532
+ /**
1533
+ * Create a new table
1534
+ *
1535
+ * @example
1536
+ * import { SchemaHelpers } from '@ductape/sdk';
1537
+ *
1538
+ * await ductape.database.createTable(
1539
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1540
+ * {
1541
+ * name: 'products',
1542
+ * columns: [
1543
+ * SchemaHelpers.id(),
1544
+ * SchemaHelpers.string('name', 255, false),
1545
+ * SchemaHelpers.decimal('price', 10, 2),
1546
+ * ...SchemaHelpers.timestamps(),
1547
+ * ],
1548
+ * },
1549
+ * { ifNotExists: true }
1550
+ * );
1551
+ */
1552
+ async createTable(connectionConfigOrDefinition, tableDefinitionOrOptions, options) {
1553
+ // Check if first arg is a table definition (no connectionConfig provided)
1554
+ if ('columns' in connectionConfigOrDefinition || 'name' in connectionConfigOrDefinition && !('env' in connectionConfigOrDefinition)) {
1555
+ // Using current context - connectionConfigOrDefinition is actually tableDefinition
1556
+ const adapter = this.getAdapter();
1557
+ return adapter.createTable(connectionConfigOrDefinition, tableDefinitionOrOptions);
1558
+ }
1559
+ // Using explicit connection config
1560
+ const adapter = this.getAdapter(connectionConfigOrDefinition);
1561
+ return adapter.createTable(tableDefinitionOrOptions, options);
1562
+ }
1563
+ /**
1564
+ * Alter an existing table
1565
+ *
1566
+ * @example
1567
+ * import { ColumnAlterationType, ColumnType } from '@ductape/sdk';
1568
+ *
1569
+ * // Add column
1570
+ * await ductape.database.alterTable(
1571
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1572
+ * 'products',
1573
+ * [{ type: ColumnAlterationType.ADD, column: { name: 'sku', type: ColumnType.STRING, length: 50 } }]
1574
+ * );
1575
+ *
1576
+ * // Drop column
1577
+ * await ductape.database.alterTable(
1578
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1579
+ * 'products',
1580
+ * [{ type: ColumnAlterationType.DROP, columnName: 'old_field' }]
1581
+ * );
1582
+ *
1583
+ * // Rename column
1584
+ * await ductape.database.alterTable(
1585
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1586
+ * 'products',
1587
+ * [{ type: ColumnAlterationType.RENAME, oldName: 'old_name', newName: 'new_name' }]
1588
+ * );
1589
+ */
1590
+ async alterTable(connectionConfigOrTableName, tableNameOrAlterations, alterations) {
1591
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1592
+ if (typeof connectionConfigOrTableName === 'string') {
1593
+ const adapter = this.getAdapter();
1594
+ return adapter.alterTable(connectionConfigOrTableName, tableNameOrAlterations);
1595
+ }
1596
+ // Using explicit connection config
1597
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1598
+ return adapter.alterTable(tableNameOrAlterations, alterations);
1599
+ }
1600
+ /**
1601
+ * Drop a table
1602
+ *
1603
+ * @example
1604
+ * await ductape.database.dropTable(
1605
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1606
+ * 'old_table'
1607
+ * );
1608
+ */
1609
+ async dropTable(connectionConfigOrTableName, tableName) {
1610
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1611
+ if (typeof connectionConfigOrTableName === 'string') {
1612
+ const adapter = this.getAdapter();
1613
+ return adapter.dropTable(connectionConfigOrTableName, true);
1614
+ }
1615
+ // Using explicit connection config
1616
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1617
+ return adapter.dropTable(tableName, true);
1618
+ }
1619
+ /**
1620
+ * List all tables in the database
1621
+ *
1622
+ * @example
1623
+ * const tables = await ductape.database.listTables({
1624
+ * env: 'dev',
1625
+ * product: 'my-app',
1626
+ * database: 'main-db',
1627
+ * });
1628
+ */
1629
+ async listTables(connectionConfig) {
1630
+ const adapter = this.getAdapter(connectionConfig);
1631
+ return adapter.listTables();
1632
+ }
1633
+ /**
1634
+ * List all tables with basic information including estimated row counts
1635
+ *
1636
+ * @example
1637
+ * const tables = await ductape.database.listTablesWithInfo({
1638
+ * env: 'dev',
1639
+ * product: 'my-app',
1640
+ * database: 'main-db',
1641
+ * });
1642
+ * // Returns: [{ name: 'users', estimatedRowCount: 1247, schema: 'public' }, ...]
1643
+ */
1644
+ async listTablesWithInfo(connectionConfig) {
1645
+ const adapter = this.getAdapter(connectionConfig);
1646
+ return adapter.listTablesWithInfo();
1647
+ }
1648
+ /**
1649
+ * Check if a table exists
1650
+ *
1651
+ * @example
1652
+ * const exists = await ductape.database.tableExists(
1653
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1654
+ * 'users'
1655
+ * );
1656
+ */
1657
+ async tableExists(connectionConfigOrTableName, tableName) {
1658
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1659
+ if (typeof connectionConfigOrTableName === 'string') {
1660
+ const adapter = this.getAdapter();
1661
+ return adapter.tableExists(connectionConfigOrTableName);
1662
+ }
1663
+ // Using explicit connection config
1664
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1665
+ return adapter.tableExists(tableName);
1666
+ }
1667
+ /**
1668
+ * Get the schema of a table
1669
+ *
1670
+ * @example
1671
+ * const schema = await ductape.database.getTableSchema(
1672
+ * { env: 'dev', product: 'my-app', database: 'main-db' },
1673
+ * 'users'
1674
+ * );
1675
+ * console.log('Table:', schema.name);
1676
+ * console.log('Columns:', schema.columns);
1677
+ * console.log('Indexes:', schema.indexes);
1678
+ */
1679
+ async getTableSchema(connectionConfigOrTableName, tableName) {
1680
+ // Check if first arg is a string (tableName - no connectionConfig provided)
1681
+ if (typeof connectionConfigOrTableName === 'string') {
1682
+ const adapter = this.getAdapter();
1683
+ return adapter.getTableSchema(connectionConfigOrTableName);
1684
+ }
1685
+ // Using explicit connection config
1686
+ const adapter = this.getAdapter(connectionConfigOrTableName);
1687
+ return adapter.getTableSchema(tableName);
1688
+ }
1689
+ /**
1690
+ * Create an index
1691
+ *
1692
+ * @example
1693
+ * await ductape.database.createIndex({
1694
+ * env: 'dev',
1695
+ * product: 'my-app',
1696
+ * database: 'main-db',
1697
+ * table: 'users',
1698
+ * index: {
1699
+ * name: 'idx_users_email',
1700
+ * table: 'users',
1701
+ * columns: [{ name: 'email' }],
1702
+ * unique: true,
1703
+ * },
1704
+ * ifNotExists: true,
1705
+ * concurrent: true, // PostgreSQL: create without locking
1706
+ * });
1707
+ */
1708
+ async createIndex(options) {
1709
+ const adapter = this.getAdapter(options);
1710
+ return adapter.createIndex(options.index, options.ifNotExists, options.concurrent);
1711
+ }
1712
+ /**
1713
+ * Drop an index
1714
+ *
1715
+ * @example
1716
+ * await ductape.database.dropIndex({
1717
+ * env: 'dev',
1718
+ * product: 'my-app',
1719
+ * database: 'main-db',
1720
+ * table: 'users',
1721
+ * indexName: 'idx_users_old',
1722
+ * ifExists: true,
1723
+ * concurrent: true,
1724
+ * });
1725
+ */
1726
+ async dropIndex(options) {
1727
+ const adapter = this.getAdapter(options);
1728
+ return adapter.dropIndex(options.table, options.indexName, options.ifExists, options.concurrent, options.cascade);
1729
+ }
1730
+ /**
1731
+ * List all indexes on a table
1732
+ *
1733
+ * @example
1734
+ * const indexes = await ductape.database.listIndexes({
1735
+ * env: 'dev',
1736
+ * product: 'my-app',
1737
+ * database: 'main-db',
1738
+ * table: 'users',
1739
+ * includeSystem: false,
1740
+ * });
1741
+ */
1742
+ async listIndexes(options) {
1743
+ const adapter = this.getAdapter(options);
1744
+ return adapter.listIndexes(options.table, options.includeSystem);
1745
+ }
1746
+ /**
1747
+ * Get index statistics
1748
+ *
1749
+ * @example
1750
+ * // All indexes on a table
1751
+ * const stats = await ductape.database.getIndexStatistics(
1752
+ * { env: 'prd', product: 'my-app', database: 'main-db' },
1753
+ * 'users'
1754
+ * );
1755
+ *
1756
+ * // Specific index
1757
+ * const emailStats = await ductape.database.getIndexStatistics(
1758
+ * { env: 'prd', product: 'my-app', database: 'main-db' },
1759
+ * 'users',
1760
+ * 'idx_users_email'
1761
+ * );
1762
+ */
1763
+ async getIndexStatistics(connectionConfig, tableName, indexName) {
1764
+ const adapter = this.getAdapter(connectionConfig);
1765
+ return adapter.getIndexStatistics(tableName, indexName);
1766
+ }
1767
+ // ==================== MIGRATION OPERATIONS ====================
1768
+ /**
1769
+ * Run a migration
1770
+ *
1771
+ * @example
1772
+ * const result = await ductape.database.runMigration([migration]);
1773
+ * console.log('Migrated:', result.size);
1774
+ */
1775
+ async runMigration(migrations, options) {
1776
+ const engine = this.getMigrationEngine();
1777
+ return engine.migrate(migrations, options);
1778
+ }
1779
+ /**
1780
+ * Rollback migrations
1781
+ *
1782
+ * @example
1783
+ * const result = await ductape.database.rollbackMigration([migration], 1);
1784
+ * console.log('Rolled back:', result.size);
1785
+ */
1786
+ async rollbackMigration(migrations, count = 1) {
1787
+ const engine = this.getMigrationEngine();
1788
+ return engine.rollback(migrations, count);
1789
+ }
1790
+ /**
1791
+ * Get migration history (applied migrations)
1792
+ *
1793
+ * @example
1794
+ * const history = await ductape.database.getMigrationHistory();
1795
+ * history.forEach((entry) => {
1796
+ * console.log('Tag:', entry.tag);
1797
+ * console.log('Applied at:', entry.appliedAt);
1798
+ * });
1799
+ */
1800
+ async getMigrationHistory() {
1801
+ const engine = this.getMigrationEngine();
1802
+ return engine.getAppliedMigrations();
1803
+ }
1804
+ /**
1805
+ * Get status of all migrations
1806
+ *
1807
+ * @example
1808
+ * const status = await ductape.database.getMigrationStatus(allMigrations);
1809
+ * console.log('Pending:', status.pending);
1810
+ */
1811
+ async getMigrationStatus(migrations) {
1812
+ const engine = this.getMigrationEngine();
1813
+ return engine.getStatus(migrations);
1814
+ }
1815
+ // ==================== MIGRATION CRUD OPERATIONS ====================
1816
+ /**
1817
+ * Migration management sub-object
1818
+ * Provides CRUD operations for database migrations via ProductBuilder
1819
+ */
1820
+ get migration() {
1821
+ return {
1822
+ /**
1823
+ * Create a new database migration
1824
+ *
1825
+ * @example
1826
+ * await ductape.database.migration.create({
1827
+ * product: 'my-product',
1828
+ * database: 'main-db',
1829
+ * data: {
1830
+ * name: 'Add users table',
1831
+ * tag: 'main-db:add-users-table',
1832
+ * value: {
1833
+ * up: ['CREATE TABLE users (id SERIAL PRIMARY KEY, email VARCHAR(255))'],
1834
+ * down: ['DROP TABLE users'],
1835
+ * },
1836
+ * },
1837
+ * });
1838
+ */
1839
+ create: async (options) => {
1840
+ const builder = await this.getProductBuilder(options.product);
1841
+ // Format tag as database:migration if not already formatted
1842
+ const tag = options.data.tag.includes(':')
1843
+ ? options.data.tag
1844
+ : `${options.database}:${options.data.tag}`;
1845
+ await builder.createDatabaseMigration({
1846
+ name: options.data.name,
1847
+ tag,
1848
+ description: options.data.description,
1849
+ value: options.data.value,
1850
+ });
1851
+ },
1852
+ /**
1853
+ * Update an existing database migration
1854
+ *
1855
+ * @example
1856
+ * await ductape.database.migration.update({
1857
+ * product: 'my-product',
1858
+ * tag: 'main-db:add-users-table',
1859
+ * data: {
1860
+ * description: 'Updated description',
1861
+ * },
1862
+ * });
1863
+ */
1864
+ update: async (options) => {
1865
+ const builder = await this.getProductBuilder(options.product);
1866
+ await builder.updateDatabaseMigration(Object.assign({ tag: options.tag }, options.data));
1867
+ },
1868
+ /**
1869
+ * Fetch a specific database migration
1870
+ *
1871
+ * @example
1872
+ * const migration = await ductape.database.migration.fetch({
1873
+ * product: 'my-product',
1874
+ * tag: 'main-db:add-users-table',
1875
+ * });
1876
+ */
1877
+ fetch: async (options) => {
1878
+ const builder = await this.getProductBuilder(options.product);
1879
+ return builder.fetchDatabaseMigration(options.tag);
1880
+ },
1881
+ /**
1882
+ * Fetch all database migrations for a database
1883
+ *
1884
+ * @example
1885
+ * const migrations = await ductape.database.migration.fetchAll({
1886
+ * product: 'my-product',
1887
+ * database: 'main-db',
1888
+ * });
1889
+ */
1890
+ fetchAll: async (options) => {
1891
+ const builder = await this.getProductBuilder(options.product);
1892
+ return builder.fetchDatabaseMigrations(options.database);
1893
+ },
1894
+ /**
1895
+ * Delete a database migration
1896
+ *
1897
+ * @example
1898
+ * await ductape.database.migration.delete({
1899
+ * product: 'my-product',
1900
+ * tag: 'main-db:add-users-table',
1901
+ * });
1902
+ */
1903
+ delete: async (options) => {
1904
+ const builder = await this.getProductBuilder(options.product);
1905
+ return builder.deleteDatabaseMigration(options.tag);
1906
+ },
1907
+ /**
1908
+ * Run a database migration (up)
1909
+ * @deprecated Migration execution has been deprecated
1910
+ */
1911
+ run: async (_options) => {
1912
+ throw new Error('Migration execution has been deprecated');
1913
+ },
1914
+ /**
1915
+ * Rollback a database migration (down)
1916
+ * @deprecated Migration execution has been deprecated
1917
+ */
1918
+ rollback: async (_options) => {
1919
+ throw new Error('Migration execution has been deprecated');
1920
+ },
1921
+ };
1922
+ }
1923
+ // ==================== ACTION OPERATIONS ====================
1924
+ /**
1925
+ * Action management sub-object
1926
+ */
1927
+ get action() {
1928
+ return {
1929
+ /**
1930
+ * Create a new database action
1931
+ *
1932
+ * @example
1933
+ * await ductape.database.action.create({
1934
+ * name: 'Get Users Paginated',
1935
+ * tag: 'postgresdb:get-users-paginated',
1936
+ * tableName: 'users',
1937
+ * operation: DatabaseActionTypes.QUERY,
1938
+ * template: {
1939
+ * where: { is_active: true },
1940
+ * limit: '{{limit}}',
1941
+ * offset: '{{offset}}',
1942
+ * },
1943
+ * });
1944
+ */
1945
+ create: async (options) => {
1946
+ return this.actionManager.create(options);
1947
+ },
1948
+ /**
1949
+ * Update an existing action
1950
+ *
1951
+ * @example
1952
+ * await ductape.database.action.update({
1953
+ * tag: 'postgresdb:get-users',
1954
+ * template: { where: { status: '{{status}}' } },
1955
+ * });
1956
+ */
1957
+ update: async (options) => {
1958
+ return this.actionManager.update(options);
1959
+ },
1960
+ /**
1961
+ * Fetch a specific action
1962
+ *
1963
+ * @example
1964
+ * const action = await ductape.database.action.fetch('postgresdb:get-users');
1965
+ */
1966
+ fetch: async (tag) => {
1967
+ return this.actionManager.fetch(tag);
1968
+ },
1969
+ /**
1970
+ * Fetch all actions for a database
1971
+ *
1972
+ * @example
1973
+ * const actions = await ductape.database.action.fetchAll('postgresdb');
1974
+ */
1975
+ fetchAll: async (databaseTag) => {
1976
+ return this.actionManager.fetchAll(databaseTag);
1977
+ },
1978
+ /**
1979
+ * Delete a database action
1980
+ *
1981
+ * @example
1982
+ * await ductape.database.action.delete('postgresdb:get-users');
1983
+ */
1984
+ delete: async (tag) => {
1985
+ return this.actionManager.delete(tag);
1986
+ },
1987
+ /**
1988
+ * Dispatches a database action to run as a scheduled job.
1989
+ * @param {IDBActionDispatchInput} data - The database action dispatch input.
1990
+ * @returns {Promise<IDispatchResult>} The dispatch result with job ID and status.
1991
+ * @example
1992
+ * // Schedule a database action to run in 1 hour
1993
+ * await ductape.databases.action.dispatch({
1994
+ * product: 'my-product',
1995
+ * env: 'production',
1996
+ * database: 'users-db',
1997
+ * event: 'cleanup-inactive',
1998
+ * input: { query: { inactive: true } },
1999
+ * schedule: { start_at: Date.now() + 3600000 }
2000
+ * });
2001
+ *
2002
+ * // Run on a cron schedule
2003
+ * await ductape.databases.action.dispatch({
2004
+ * product: 'my-product',
2005
+ * env: 'production',
2006
+ * database: 'analytics-db',
2007
+ * event: 'aggregate-daily',
2008
+ * input: { query: {} },
2009
+ * schedule: { cron: '0 0 * * *' } // Daily at midnight
2010
+ * });
2011
+ */
2012
+ dispatch: async (data) => {
2013
+ const processorService = this.createNewProcessor();
2014
+ const productBuilder = await this.getProductBuilder(data.product);
2015
+ const schedule = data.schedule || {};
2016
+ const startAt = typeof schedule.start_at === 'string'
2017
+ ? new Date(schedule.start_at).getTime()
2018
+ : schedule.start_at || Date.now();
2019
+ // Generate job tag based on type, database, and event
2020
+ const jobTag = `database:${data.database}:${data.event}`;
2021
+ // Check if job exists, if not create it
2022
+ const existingJob = await productBuilder.fetchJob(jobTag);
2023
+ if (!existingJob) {
2024
+ await productBuilder.createJob({
2025
+ tag: jobTag,
2026
+ name: `Database: ${data.database}/${data.event}`,
2027
+ description: `Auto-created job for database action ${data.event} on database ${data.database}`,
2028
+ type: types_1.JobEventTypes.DATABASE_ACTION,
2029
+ app: data.database,
2030
+ event: data.event,
2031
+ executions: 0,
2032
+ intervals: schedule.every || 0,
2033
+ start_at: startAt,
2034
+ });
2035
+ }
2036
+ const jobInput = {
2037
+ product: data.product,
2038
+ env: data.env,
2039
+ event: jobTag,
2040
+ input: data.input,
2041
+ retries: data.retries || 0,
2042
+ start_at: startAt,
2043
+ session: data.session,
2044
+ cache: data.cache,
2045
+ repeat: schedule.cron || schedule.every ? {
2046
+ cron: schedule.cron,
2047
+ every: schedule.every,
2048
+ limit: schedule.limit,
2049
+ endDate: schedule.endDate,
2050
+ tz: schedule.tz,
2051
+ } : undefined,
2052
+ };
2053
+ await processorService.processJob(jobInput);
2054
+ const isRecurring = !!(schedule.cron || schedule.every);
2055
+ let nextRunAt;
2056
+ if (isRecurring && schedule.every) {
2057
+ nextRunAt = startAt + schedule.every;
2058
+ }
2059
+ return {
2060
+ job_id: (0, crypto_1.randomUUID)(),
2061
+ status: startAt > Date.now() ? 'scheduled' : 'queued',
2062
+ scheduled_at: startAt,
2063
+ recurring: isRecurring,
2064
+ next_run_at: nextRunAt,
2065
+ };
2066
+ },
2067
+ };
2068
+ }
2069
+ /**
2070
+ * Execute a database action
2071
+ *
2072
+ * @example
2073
+ * const users = await ductape.database.execute({
2074
+ * product: 'my-product',
2075
+ * env: 'prd',
2076
+ * database: 'postgresdb',
2077
+ * action: 'get-users-paginated',
2078
+ * input: {
2079
+ * limit: 25,
2080
+ * offset: 0,
2081
+ * },
2082
+ * });
2083
+ */
2084
+ async execute(options) {
2085
+ var _a, _b, _c, _d, _e, _f;
2086
+ const process_id = (0, processor_utils_1.generateObjectId)();
2087
+ const start = Date.now();
2088
+ // Session log fields (will be populated if session is provided)
2089
+ let sessionLogFields = {};
2090
+ let resolvedOptions = options;
2091
+ // Initialize product builder and logging
2092
+ if (options.product) {
2093
+ const builder = await this.getProductBuilder(options.product);
2094
+ // Process session if provided
2095
+ if (options.session) {
2096
+ const privateKey = builder.fetchPrivateKey();
2097
+ if (privateKey) {
2098
+ const { processSessionForExecution } = await Promise.resolve().then(() => __importStar(require('../sessions')));
2099
+ const sessionResult = await processSessionForExecution(options.session, privateKey, options, options.env, {
2100
+ fetchSessionSelector: async (sessionTag) => {
2101
+ const sessionConfig = await builder.fetchSession(sessionTag);
2102
+ return sessionConfig === null || sessionConfig === void 0 ? void 0 : sessionConfig.selector;
2103
+ },
2104
+ });
2105
+ if (sessionResult.error) {
2106
+ throw new Error(`Session validation failed: ${sessionResult.error}`);
2107
+ }
2108
+ resolvedOptions = sessionResult.input;
2109
+ sessionLogFields = sessionResult.logFields;
2110
+ }
2111
+ }
2112
+ }
2113
+ this.initializeLogService();
2114
+ const baseLogs = Object.assign({ product_tag: options.product || '', workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '', env: options.env, process_id, type: logs_types_1.LogEventTypes.DB_ACTION, parent_tag: options.database, child_tag: options.action, data: { database: options.database, action: options.action } }, sessionLogFields);
2115
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database action execute - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
2116
+ try {
2117
+ const result = await this.actionManager.execute(resolvedOptions);
2118
+ const end = Date.now();
2119
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
2120
+ end, message: 'Database action execute - success', successful_execution: true, status: logs_types_1.LogEventStatus.SUCCESS }));
2121
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
2122
+ return result;
2123
+ }
2124
+ catch (error) {
2125
+ const end = Date.now();
2126
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
2127
+ end, message: 'Database action execute - failed', failed_execution: true, data: { database: options.database, action: options.action, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
2128
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
2129
+ throw error;
2130
+ }
2131
+ }
2132
+ /**
2133
+ * Dispatches a database operation to run as a scheduled job.
2134
+ * Use this for direct database operations (query, insert, update, delete, etc.).
2135
+ * @param {IDBOperationDispatchInput} data - The database operation dispatch input.
2136
+ * @returns {Promise<IDispatchResult>} The dispatch result with job ID and status.
2137
+ * @example
2138
+ * // Schedule a database operation to run in 1 hour
2139
+ * await ductape.databases.dispatch({
2140
+ * product: 'my-product',
2141
+ * env: 'production',
2142
+ * database: 'users-db',
2143
+ * operation: 'deleteMany',
2144
+ * input: { filter: { inactive: true, lastLogin: { $lt: '2024-01-01' } } },
2145
+ * schedule: { start_at: Date.now() + 3600000 }
2146
+ * });
2147
+ *
2148
+ * // Run daily database cleanup
2149
+ * await ductape.databases.dispatch({
2150
+ * product: 'my-product',
2151
+ * env: 'production',
2152
+ * database: 'logs-db',
2153
+ * operation: 'deleteMany',
2154
+ * input: { filter: { createdAt: { $lt: '$DateAdd($Now(), -30, "days")' } } },
2155
+ * schedule: { cron: '0 3 * * *' } // Daily at 3 AM
2156
+ * });
2157
+ */
2158
+ async dispatch(data) {
2159
+ var _a, _b, _c, _d, _e, _f;
2160
+ const process_id = (0, processor_utils_1.generateObjectId)();
2161
+ const start = Date.now();
2162
+ const processorService = this.createNewProcessor();
2163
+ const productBuilder = await this.getProductBuilder(data.product);
2164
+ const schedule = data.schedule || {};
2165
+ const startAt = typeof schedule.start_at === 'string'
2166
+ ? new Date(schedule.start_at).getTime()
2167
+ : schedule.start_at || Date.now();
2168
+ // Generate job tag based on type, database, and operation
2169
+ const jobTag = `database-operation:${data.database}:${data.operation}`;
2170
+ // Initialize logging
2171
+ this.initializeLogService();
2172
+ const baseLogs = {
2173
+ product_tag: data.product,
2174
+ workspace_id: ((_a = this.config) === null || _a === void 0 ? void 0 : _a.workspace_id) || '',
2175
+ env: data.env,
2176
+ process_id,
2177
+ type: logs_types_1.LogEventTypes.DATABASE,
2178
+ parent_tag: data.database,
2179
+ child_tag: data.operation,
2180
+ data: { database: data.database, operation: data.operation },
2181
+ };
2182
+ (_b = this.logService) === null || _b === void 0 ? void 0 : _b.add(Object.assign(Object.assign({}, baseLogs), { start, message: 'Database dispatch - initiated', status: logs_types_1.LogEventStatus.PROCESSING }));
2183
+ try {
2184
+ // Check if job exists, if not create it
2185
+ const existingJob = await productBuilder.fetchJob(jobTag);
2186
+ if (!existingJob) {
2187
+ await productBuilder.createJob({
2188
+ tag: jobTag,
2189
+ name: `Database Operation: ${data.database}/${data.operation}`,
2190
+ description: `Auto-created job for database operation ${data.operation} on database ${data.database}`,
2191
+ type: types_1.JobEventTypes.DATABASE_OPERATION,
2192
+ app: data.database,
2193
+ event: data.operation,
2194
+ executions: 0,
2195
+ intervals: schedule.every || 0,
2196
+ start_at: startAt,
2197
+ });
2198
+ }
2199
+ const jobInput = {
2200
+ product: data.product,
2201
+ env: data.env,
2202
+ event: jobTag,
2203
+ input: data.input,
2204
+ retries: data.retries || 0,
2205
+ start_at: startAt,
2206
+ session: data.session,
2207
+ cache: data.cache,
2208
+ repeat: schedule.cron || schedule.every ? {
2209
+ cron: schedule.cron,
2210
+ every: schedule.every,
2211
+ limit: schedule.limit,
2212
+ endDate: schedule.endDate,
2213
+ tz: schedule.tz,
2214
+ } : undefined,
2215
+ };
2216
+ await processorService.processJob(jobInput);
2217
+ const isRecurring = !!(schedule.cron || schedule.every);
2218
+ let nextRunAt;
2219
+ if (isRecurring && schedule.every) {
2220
+ nextRunAt = startAt + schedule.every;
2221
+ }
2222
+ const job_id = (0, crypto_1.randomUUID)();
2223
+ const end = Date.now();
2224
+ (_c = this.logService) === null || _c === void 0 ? void 0 : _c.add(Object.assign(Object.assign({}, baseLogs), { start,
2225
+ end, message: 'Database dispatch - success', successful_execution: true, data: { database: data.database, operation: data.operation, job_id }, status: logs_types_1.LogEventStatus.SUCCESS }));
2226
+ (_d = this.logService) === null || _d === void 0 ? void 0 : _d.publish();
2227
+ return {
2228
+ job_id,
2229
+ status: startAt > Date.now() ? 'scheduled' : 'queued',
2230
+ scheduled_at: startAt,
2231
+ recurring: isRecurring,
2232
+ next_run_at: nextRunAt,
2233
+ };
2234
+ }
2235
+ catch (error) {
2236
+ const end = Date.now();
2237
+ (_e = this.logService) === null || _e === void 0 ? void 0 : _e.add(Object.assign(Object.assign({}, baseLogs), { start,
2238
+ end, message: 'Database dispatch - failed', failed_execution: true, data: { database: data.database, operation: data.operation, error: String(error) }, status: logs_types_1.LogEventStatus.FAIL }));
2239
+ await ((_f = this.logService) === null || _f === void 0 ? void 0 : _f.publish());
2240
+ throw error;
2241
+ }
2242
+ }
2243
+ // ==================== HELPER METHODS ====================
2244
+ /**
2245
+ * Get the appropriate adapter for the operation
2246
+ */
2247
+ getAdapter(options) {
2248
+ // If options specify env and database, use those
2249
+ if ((options === null || options === void 0 ? void 0 : options.env) && (options === null || options === void 0 ? void 0 : options.database)) {
2250
+ const contextKey = this.buildContextKey(options.database, options.env);
2251
+ const adapter = this.adapters.get(contextKey);
2252
+ if (!adapter) {
2253
+ throw new database_error_1.DatabaseError(`No adapter found for database '${options.database}' in environment '${options.env}'`, enums_1.DatabaseErrorType.NOT_FOUND);
2254
+ }
2255
+ return adapter;
2256
+ }
2257
+ // Otherwise use current context
2258
+ if (!this.currentContext) {
2259
+ throw new database_error_1.DatabaseError('No database connection established. Call connect() first or provide env and database options.', enums_1.DatabaseErrorType.CONNECTION_ERROR);
2260
+ }
2261
+ const contextKey = this.buildContextKey(this.currentContext.database, this.currentContext.env);
2262
+ const adapter = this.adapters.get(contextKey);
2263
+ if (!adapter) {
2264
+ throw new database_error_1.DatabaseError('No adapter found for current connection context', enums_1.DatabaseErrorType.CONNECTION_ERROR);
2265
+ }
2266
+ return adapter;
2267
+ }
2268
+ /**
2269
+ * Get the current connection context
2270
+ */
2271
+ getCurrentContext() {
2272
+ return this.currentContext;
2273
+ }
2274
+ /**
2275
+ * Get a connection-scoped interface for a specific database/environment.
2276
+ * This ensures schema operations are isolated to a specific connection.
2277
+ *
2278
+ * @example
2279
+ * const usersDb = db.connection('users-db', 'dev');
2280
+ * await usersDb.schema.create('users', { ... });
2281
+ *
2282
+ * const ordersDb = db.connection('orders-db', 'dev');
2283
+ * await ordersDb.schema.create('orders', { ... }); // Different connection
2284
+ */
2285
+ connection(database, env, product = '') {
2286
+ return new DatabaseConnection(this, database, env, product);
2287
+ }
2288
+ /**
2289
+ * Build a context key from database and environment
2290
+ */
2291
+ buildContextKey(database, env) {
2292
+ return `${database}:${env}`;
2293
+ }
2294
+ /**
2295
+ * Convert DatabaseTypes (from product API) to DatabaseType (ORM internal)
2296
+ */
2297
+ convertDatabaseType(type) {
2298
+ // Map from DatabaseTypes enum values to DatabaseType enum
2299
+ const typeMap = {
2300
+ 'postgresql': enums_1.DatabaseType.POSTGRESQL,
2301
+ 'mongodb': enums_1.DatabaseType.MONGODB,
2302
+ 'mysql': enums_1.DatabaseType.MYSQL,
2303
+ 'dynamodb': enums_1.DatabaseType.DYNAMODB,
2304
+ 'mariadb': enums_1.DatabaseType.MARIADB,
2305
+ 'cassandra': enums_1.DatabaseType.CASSANDRA,
2306
+ };
2307
+ const normalizedType = String(type).toLowerCase();
2308
+ const mappedType = typeMap[normalizedType];
2309
+ if (!mappedType) {
2310
+ throw new database_error_1.DatabaseError(`Unsupported database type: ${type}. Supported types: ${Object.keys(typeMap).join(', ')}`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
2311
+ }
2312
+ return mappedType;
2313
+ }
2314
+ // ==================== SIMPLIFIED SCHEMA API ====================
2315
+ /**
2316
+ * Simplified schema operations API (Mongoose-style)
2317
+ *
2318
+ * @example
2319
+ * await db.connect({ env: 'dev', product: 'my-app', database: 'users-db' });
2320
+ *
2321
+ * // Create a table with Mongoose-style schema
2322
+ * await db.schema.create('users', {
2323
+ * id: { type: 'uuid', primaryKey: true },
2324
+ * email: { type: 'string', length: 255, required: true, unique: true },
2325
+ * name: { type: 'string', length: 100 },
2326
+ * age: 'integer', // Shorthand
2327
+ * status: { type: 'enum', enum: ['active', 'inactive'], default: 'active' },
2328
+ * }, { timestamps: true });
2329
+ */
2330
+ get schema() {
2331
+ return {
2332
+ /**
2333
+ * Create a collection/table with Mongoose-style schema definition
2334
+ */
2335
+ create: (name, definition, options) => this.schemaCreate(name, definition, options),
2336
+ /**
2337
+ * Drop a collection/table
2338
+ */
2339
+ drop: (name, options) => this.schemaDrop(name, options),
2340
+ /**
2341
+ * Add a field to a collection
2342
+ */
2343
+ addField: (collection, fieldName, definition) => this.schemaAddField(collection, fieldName, definition),
2344
+ /**
2345
+ * Drop a field from a collection
2346
+ */
2347
+ dropField: (collection, fieldName) => this.schemaDropField(collection, fieldName),
2348
+ /**
2349
+ * Rename a field in a collection
2350
+ */
2351
+ renameField: (collection, oldName, newName) => this.schemaRenameField(collection, oldName, newName),
2352
+ /**
2353
+ * Modify a field's definition
2354
+ */
2355
+ modifyField: (collection, fieldName, changes) => this.schemaModifyField(collection, fieldName, changes),
2356
+ /**
2357
+ * Create an index on a collection
2358
+ */
2359
+ createIndex: (collection, fields, options) => this.schemaCreateIndex(collection, fields, options),
2360
+ /**
2361
+ * Drop an index from a collection
2362
+ */
2363
+ dropIndex: (collection, indexName) => this.schemaDropIndex(collection, indexName),
2364
+ /**
2365
+ * Add a constraint (SQL databases only)
2366
+ */
2367
+ addConstraint: (collection, constraint) => this.schemaAddConstraint(collection, constraint),
2368
+ /**
2369
+ * Drop a constraint (SQL databases only)
2370
+ */
2371
+ dropConstraint: (collection, constraintName) => this.schemaDropConstraint(collection, constraintName),
2372
+ /**
2373
+ * Rename a collection/table
2374
+ */
2375
+ rename: (oldName, newName) => this.schemaRename(oldName, newName),
2376
+ /**
2377
+ * Check if a collection/table exists
2378
+ */
2379
+ exists: (name) => this.schemaExists(name),
2380
+ /**
2381
+ * List all collections/tables
2382
+ */
2383
+ list: (schemaName) => this.schemaList(schemaName),
2384
+ /**
2385
+ * Get detailed schema information for a collection
2386
+ */
2387
+ describe: (name) => this.schemaDescribe(name),
2388
+ /**
2389
+ * List indexes on a collection
2390
+ */
2391
+ indexes: (collection) => this.schemaListIndexes(collection),
2392
+ };
2393
+ }
2394
+ // ==================== PRIVATE SCHEMA IMPLEMENTATION ====================
2395
+ /**
2396
+ * Create a collection with Mongoose-style definition
2397
+ */
2398
+ async schemaCreate(name, definition, options) {
2399
+ var _a;
2400
+ const schemaManager = this.getSchemaManager();
2401
+ const fields = this.convertToFieldDefinitions(definition, options === null || options === void 0 ? void 0 : options.timestamps);
2402
+ // Convert simple index definitions to the expected format
2403
+ const indexes = (_a = options === null || options === void 0 ? void 0 : options.indexes) === null || _a === void 0 ? void 0 : _a.map(idx => ({
2404
+ name: idx.name || `idx_${name}_${Array.isArray(idx.fields) ? (typeof idx.fields[0] === 'string' ? idx.fields.join('_') : idx.fields.map((f) => f.name).join('_')) : idx.fields}`,
2405
+ fields: this.normalizeIndexFields(idx.fields),
2406
+ unique: idx.unique,
2407
+ }));
2408
+ return schemaManager.createCollection(name, fields, {
2409
+ autoApply: true,
2410
+ indexes,
2411
+ sqlOptions: options === null || options === void 0 ? void 0 : options.sqlOptions,
2412
+ mongoOptions: options === null || options === void 0 ? void 0 : options.mongoOptions,
2413
+ dynamoOptions: options === null || options === void 0 ? void 0 : options.dynamoOptions,
2414
+ cassandraOptions: options === null || options === void 0 ? void 0 : options.cassandraOptions,
2415
+ });
2416
+ }
2417
+ /**
2418
+ * Drop a collection
2419
+ */
2420
+ async schemaDrop(name, options) {
2421
+ const schemaManager = this.getSchemaManager();
2422
+ return schemaManager.dropCollection(name, {
2423
+ autoApply: true,
2424
+ ifExists: options === null || options === void 0 ? void 0 : options.ifExists,
2425
+ cascade: options === null || options === void 0 ? void 0 : options.cascade,
2426
+ });
2427
+ }
2428
+ /**
2429
+ * Add a field to a collection
2430
+ */
2431
+ async schemaAddField(collection, fieldName, definition) {
2432
+ const schemaManager = this.getSchemaManager();
2433
+ const field = this.convertFieldDefinition(fieldName, definition);
2434
+ return schemaManager.addField(collection, field, { autoApply: true });
2435
+ }
2436
+ /**
2437
+ * Drop a field from a collection
2438
+ */
2439
+ async schemaDropField(collection, fieldName) {
2440
+ const schemaManager = this.getSchemaManager();
2441
+ return schemaManager.dropField(collection, fieldName, { autoApply: true });
2442
+ }
2443
+ /**
2444
+ * Rename a field
2445
+ */
2446
+ async schemaRenameField(collection, oldName, newName) {
2447
+ const schemaManager = this.getSchemaManager();
2448
+ return schemaManager.renameField(collection, oldName, newName, { autoApply: true });
2449
+ }
2450
+ /**
2451
+ * Modify a field's definition
2452
+ */
2453
+ async schemaModifyField(collection, fieldName, changes) {
2454
+ const schemaManager = this.getSchemaManager();
2455
+ const fieldChanges = {};
2456
+ if (changes.type) {
2457
+ fieldChanges.type = this.normalizeFieldType(changes.type);
2458
+ }
2459
+ if (changes.minLength !== undefined) {
2460
+ fieldChanges.minLength = changes.minLength;
2461
+ }
2462
+ if (changes.maxLength !== undefined) {
2463
+ fieldChanges.maxLength = changes.maxLength;
2464
+ }
2465
+ if (changes.precision !== undefined) {
2466
+ fieldChanges.precision = changes.precision;
2467
+ }
2468
+ if (changes.scale !== undefined) {
2469
+ fieldChanges.scale = changes.scale;
2470
+ }
2471
+ if (changes.required !== undefined) {
2472
+ fieldChanges.nullable = !changes.required;
2473
+ }
2474
+ if (changes.unique !== undefined) {
2475
+ fieldChanges.unique = changes.unique;
2476
+ }
2477
+ if (changes.default !== undefined) {
2478
+ fieldChanges.defaultValue = changes.default;
2479
+ }
2480
+ if (changes.enum !== undefined) {
2481
+ fieldChanges.enumValues = changes.enum;
2482
+ }
2483
+ return schemaManager.modifyField(collection, fieldName, fieldChanges, { autoApply: true });
2484
+ }
2485
+ /**
2486
+ * Create an index
2487
+ */
2488
+ async schemaCreateIndex(collection, fields, options) {
2489
+ const schemaManager = this.getSchemaManager();
2490
+ const normalizedFields = this.normalizeIndexFields(fields);
2491
+ const indexName = (options === null || options === void 0 ? void 0 : options.name) || `idx_${collection}_${normalizedFields.map(f => f.name).join('_')}`;
2492
+ return schemaManager.createIndex(collection, indexName, normalizedFields, {
2493
+ autoApply: true,
2494
+ unique: options === null || options === void 0 ? void 0 : options.unique,
2495
+ sparse: options === null || options === void 0 ? void 0 : options.sparse,
2496
+ sqlOptions: (options === null || options === void 0 ? void 0 : options.where) ? { where: options.where } : undefined,
2497
+ mongoOptions: (options === null || options === void 0 ? void 0 : options.expireAfterSeconds) ? { expireAfterSeconds: options.expireAfterSeconds } : undefined,
2498
+ });
2499
+ }
2500
+ /**
2501
+ * Drop an index
2502
+ */
2503
+ async schemaDropIndex(collection, indexName) {
2504
+ const schemaManager = this.getSchemaManager();
2505
+ return schemaManager.dropIndex(collection, indexName, { autoApply: true, ifExists: true });
2506
+ }
2507
+ /**
2508
+ * Add a constraint (SQL only)
2509
+ */
2510
+ async schemaAddConstraint(collection, constraint) {
2511
+ const schemaManager = this.getSchemaManager();
2512
+ return schemaManager.addConstraint(collection, constraint, { autoApply: true });
2513
+ }
2514
+ /**
2515
+ * Drop a constraint (SQL only)
2516
+ */
2517
+ async schemaDropConstraint(collection, constraintName) {
2518
+ const schemaManager = this.getSchemaManager();
2519
+ return schemaManager.dropConstraint(collection, constraintName, { autoApply: true });
2520
+ }
2521
+ /**
2522
+ * Rename a collection
2523
+ */
2524
+ async schemaRename(oldName, newName) {
2525
+ const schemaManager = this.getSchemaManager();
2526
+ return schemaManager.renameCollection(oldName, newName, { autoApply: true });
2527
+ }
2528
+ /**
2529
+ * Check if collection exists
2530
+ */
2531
+ async schemaExists(name) {
2532
+ const schemaManager = this.getSchemaManager();
2533
+ return schemaManager.collectionExists(name);
2534
+ }
2535
+ /**
2536
+ * List all collections
2537
+ */
2538
+ async schemaList(schemaName) {
2539
+ const schemaManager = this.getSchemaManager();
2540
+ return schemaManager.listCollections(schemaName);
2541
+ }
2542
+ /**
2543
+ * Describe a collection's schema
2544
+ */
2545
+ async schemaDescribe(name) {
2546
+ const schemaManager = this.getSchemaManager();
2547
+ return schemaManager.getCollectionSchema(name);
2548
+ }
2549
+ /**
2550
+ * List indexes on a collection
2551
+ */
2552
+ async schemaListIndexes(collection) {
2553
+ const schemaManager = this.getSchemaManager();
2554
+ return schemaManager.listIndexes(collection);
2555
+ }
2556
+ // ==================== SCHEMA CONVERSION HELPERS ====================
2557
+ /**
2558
+ * Convert Mongoose-style schema definition to IFieldDefinition array
2559
+ */
2560
+ convertToFieldDefinitions(definition, timestamps) {
2561
+ const fields = [];
2562
+ for (const [name, config] of Object.entries(definition)) {
2563
+ fields.push(this.convertFieldDefinition(name, config));
2564
+ }
2565
+ if (timestamps) {
2566
+ fields.push({ name: 'created_at', type: 'timestamp', defaultValue: 'NOW()', nullable: false }, { name: 'updated_at', type: 'timestamp', defaultValue: 'NOW()', nullable: false });
2567
+ }
2568
+ return fields;
2569
+ }
2570
+ /**
2571
+ * Convert a single field definition
2572
+ */
2573
+ convertFieldDefinition(name, config) {
2574
+ // Handle shorthand: { name: 'string' }
2575
+ if (typeof config === 'string') {
2576
+ return { name, type: this.normalizeFieldType(config) };
2577
+ }
2578
+ // Validate autoIncrement only works with numeric types
2579
+ if (config.autoIncrement) {
2580
+ const normalizedType = this.normalizeFieldType(config.type);
2581
+ const numericTypes = ['integer', 'int', 'bigint', 'smallint', 'number', 'float', 'double', 'decimal'];
2582
+ if (!numericTypes.includes(normalizedType.toLowerCase())) {
2583
+ throw new database_error_1.DatabaseError(`autoIncrement can only be used with numeric types (integer, bigint, number, etc.), but field '${name}' has type '${config.type}'`, enums_1.DatabaseErrorType.VALIDATION_ERROR);
2584
+ }
2585
+ }
2586
+ // Handle full definition
2587
+ return {
2588
+ name,
2589
+ type: this.normalizeFieldType(config.type),
2590
+ nullable: config.required === undefined ? true : !config.required,
2591
+ unique: config.unique,
2592
+ primaryKey: config.primaryKey,
2593
+ autoGenerate: config.autoIncrement,
2594
+ defaultValue: config.default,
2595
+ minLength: config.minLength,
2596
+ maxLength: config.maxLength,
2597
+ precision: config.precision,
2598
+ scale: config.scale,
2599
+ enumValues: config.enum,
2600
+ comment: config.comment,
2601
+ };
2602
+ }
2603
+ /**
2604
+ * Normalize Mongoose-style type names to FieldType
2605
+ */
2606
+ normalizeFieldType(type) {
2607
+ const typeMap = {
2608
+ // String types
2609
+ 'String': 'string',
2610
+ // Numeric types
2611
+ 'Number': 'double', // JS number is 64-bit float
2612
+ 'Integer': 'integer', // 32-bit signed integer
2613
+ 'BigInt': 'bigint', // 64-bit signed integer
2614
+ 'Float': 'float', // 32-bit floating point
2615
+ 'Double': 'double', // 64-bit floating point
2616
+ 'Decimal': 'decimal', // Exact precision (for money)
2617
+ // Other types
2618
+ 'Boolean': 'boolean',
2619
+ 'Date': 'datetime',
2620
+ 'ObjectId': 'uuid',
2621
+ 'Array': 'array',
2622
+ 'Object': 'json',
2623
+ 'Mixed': 'json',
2624
+ };
2625
+ return typeMap[type] || type;
2626
+ }
2627
+ /**
2628
+ * Normalize index fields to IIndexFieldDefinition array
2629
+ */
2630
+ normalizeIndexFields(fields) {
2631
+ if (fields.length === 0) {
2632
+ return [];
2633
+ }
2634
+ // Check if first element is a string
2635
+ if (typeof fields[0] === 'string') {
2636
+ return fields.map(name => ({ name }));
2637
+ }
2638
+ return fields;
2639
+ }
2640
+ /**
2641
+ * Get adapter by context key (used by DatabaseConnection)
2642
+ * @internal
2643
+ */
2644
+ getAdapterByContextKey(contextKey) {
2645
+ const adapter = this.adapters.get(contextKey);
2646
+ if (!adapter) {
2647
+ throw new database_error_1.DatabaseError(`No adapter found for context '${contextKey}'. Call connect() first.`, enums_1.DatabaseErrorType.CONNECTION_ERROR);
2648
+ }
2649
+ return adapter;
2650
+ }
2651
+ // ==================== DASHBOARD ====================
2652
+ /**
2653
+ * Fetch database dashboard metrics from logs
2654
+ *
2655
+ * @example
2656
+ * ```ts
2657
+ * const dashboard = await databases.fetchDashboard({
2658
+ * product: 'my-product',
2659
+ * database: 'my-database',
2660
+ * env: 'production',
2661
+ * });
2662
+ * console.log(dashboard.dau, dashboard.activityTimeline);
2663
+ * ```
2664
+ */
2665
+ async fetchDashboard(options) {
2666
+ if (!this.config) {
2667
+ throw new database_error_1.DatabaseError('DatabaseService not configured. Please provide config when initializing.', enums_1.DatabaseErrorType.CONFIGURATION_ERROR);
2668
+ }
2669
+ const { product, database, env } = options;
2670
+ const { LogApiService } = await Promise.resolve().then(() => __importStar(require('../api/services/logsApi.service')));
2671
+ const logsApi = new LogApiService(this.config.env_type);
2672
+ try {
2673
+ const dashboard = await logsApi.fetchDatabaseDashboard({
2674
+ product_tag: product,
2675
+ database_tag: database,
2676
+ env,
2677
+ }, {
2678
+ workspace_id: this.config.workspace_id,
2679
+ user_id: this.config.user_id,
2680
+ public_key: this.config.public_key,
2681
+ token: this.config.token,
2682
+ });
2683
+ return {
2684
+ dau: dashboard.dau || { current: 0, previous: 0, change: 0 },
2685
+ wau: dashboard.wau || { current: 0, previous: 0, change: 0 },
2686
+ mau: dashboard.mau || { current: 0, previous: 0, change: 0 },
2687
+ totalOperations: dashboard.totalOperations || 0,
2688
+ successfulOperations: dashboard.successfulOperations || 0,
2689
+ failedOperations: dashboard.failedOperations || 0,
2690
+ newOperationsThisWeek: dashboard.newOperationsThisWeek || 0,
2691
+ avgExecutionTime: dashboard.avgExecutionTime || { current: '0ms', previous: '0ms', change: 0 },
2692
+ activityTimeline: dashboard.activityTimeline || [],
2693
+ peakHours: dashboard.peakHours || [],
2694
+ environmentBreakdown: dashboard.environmentBreakdown || [],
2695
+ methodBreakdown: dashboard.methodBreakdown || [],
2696
+ };
2697
+ }
2698
+ catch (error) {
2699
+ throw new database_error_1.DatabaseError(`Failed to fetch database dashboard: ${error}`, enums_1.DatabaseErrorType.QUERY_ERROR);
2700
+ }
2701
+ }
2702
+ }
2703
+ exports.DatabaseService = DatabaseService;
2704
+ /**
2705
+ * Connection-scoped database interface.
2706
+ * Provides isolated schema, query, and aggregation operations for a specific database/environment.
2707
+ */
2708
+ class DatabaseConnection {
2709
+ constructor(service, database, env, product) {
2710
+ this.service = service;
2711
+ this._database = database;
2712
+ this._env = env;
2713
+ this._product = product;
2714
+ this.contextKey = `${database}:${env}`;
2715
+ this.triggerProcessor = new trigger_processor_1.TriggerProcessor({}, null);
2716
+ }
2717
+ /** Database tag */
2718
+ get database() {
2719
+ return this._database;
2720
+ }
2721
+ /** Environment slug */
2722
+ get env() {
2723
+ return this._env;
2724
+ }
2725
+ /** Product tag */
2726
+ get product() {
2727
+ return this._product;
2728
+ }
2729
+ /** Get the adapter for this connection */
2730
+ getAdapter() {
2731
+ return this.service.getAdapterByContextKey(this.contextKey);
2732
+ }
2733
+ /**
2734
+ * Schema operations scoped to this connection
2735
+ */
2736
+ get schema() {
2737
+ const adapter = () => this.getAdapter();
2738
+ const service = this.service;
2739
+ return {
2740
+ create: async (name, definition, options) => {
2741
+ var _a;
2742
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2743
+ const fields = service.convertToFieldDefinitions(definition, options === null || options === void 0 ? void 0 : options.timestamps);
2744
+ const indexes = (_a = options === null || options === void 0 ? void 0 : options.indexes) === null || _a === void 0 ? void 0 : _a.map(idx => ({
2745
+ name: idx.name || `idx_${name}_${Array.isArray(idx.fields) ? (typeof idx.fields[0] === 'string' ? idx.fields.join('_') : idx.fields.map((f) => f.name).join('_')) : idx.fields}`,
2746
+ fields: service.normalizeIndexFields(idx.fields),
2747
+ unique: idx.unique,
2748
+ }));
2749
+ return schemaManager.createCollection(name, fields, {
2750
+ autoApply: true,
2751
+ indexes,
2752
+ sqlOptions: options === null || options === void 0 ? void 0 : options.sqlOptions,
2753
+ mongoOptions: options === null || options === void 0 ? void 0 : options.mongoOptions,
2754
+ dynamoOptions: options === null || options === void 0 ? void 0 : options.dynamoOptions,
2755
+ cassandraOptions: options === null || options === void 0 ? void 0 : options.cassandraOptions,
2756
+ });
2757
+ },
2758
+ drop: async (name, options) => {
2759
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2760
+ return schemaManager.dropCollection(name, {
2761
+ autoApply: true,
2762
+ ifExists: options === null || options === void 0 ? void 0 : options.ifExists,
2763
+ cascade: options === null || options === void 0 ? void 0 : options.cascade,
2764
+ });
2765
+ },
2766
+ addField: async (collection, fieldName, definition) => {
2767
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2768
+ const field = service.convertFieldDefinition(fieldName, definition);
2769
+ return schemaManager.addField(collection, field, { autoApply: true });
2770
+ },
2771
+ dropField: async (collection, fieldName) => {
2772
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2773
+ return schemaManager.dropField(collection, fieldName, { autoApply: true });
2774
+ },
2775
+ renameField: async (collection, oldName, newName) => {
2776
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2777
+ return schemaManager.renameField(collection, oldName, newName, { autoApply: true });
2778
+ },
2779
+ modifyField: async (collection, fieldName, changes) => {
2780
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2781
+ const fieldChanges = {};
2782
+ if (changes.type)
2783
+ fieldChanges.type = service.normalizeFieldType(changes.type);
2784
+ if (changes.minLength !== undefined)
2785
+ fieldChanges.minLength = changes.minLength;
2786
+ if (changes.maxLength !== undefined)
2787
+ fieldChanges.maxLength = changes.maxLength;
2788
+ if (changes.precision !== undefined)
2789
+ fieldChanges.precision = changes.precision;
2790
+ if (changes.scale !== undefined)
2791
+ fieldChanges.scale = changes.scale;
2792
+ if (changes.required !== undefined)
2793
+ fieldChanges.nullable = !changes.required;
2794
+ if (changes.unique !== undefined)
2795
+ fieldChanges.unique = changes.unique;
2796
+ if (changes.default !== undefined)
2797
+ fieldChanges.defaultValue = changes.default;
2798
+ if (changes.enum !== undefined)
2799
+ fieldChanges.enumValues = changes.enum;
2800
+ return schemaManager.modifyField(collection, fieldName, fieldChanges, { autoApply: true });
2801
+ },
2802
+ createIndex: async (collection, fields, options) => {
2803
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2804
+ const normalizedFields = service.normalizeIndexFields(fields);
2805
+ const indexName = (options === null || options === void 0 ? void 0 : options.name) || `idx_${collection}_${normalizedFields.map((f) => f.name).join('_')}`;
2806
+ return schemaManager.createIndex(collection, indexName, normalizedFields, {
2807
+ autoApply: true,
2808
+ unique: options === null || options === void 0 ? void 0 : options.unique,
2809
+ sparse: options === null || options === void 0 ? void 0 : options.sparse,
2810
+ sqlOptions: (options === null || options === void 0 ? void 0 : options.where) ? { where: options.where } : undefined,
2811
+ mongoOptions: (options === null || options === void 0 ? void 0 : options.expireAfterSeconds) ? { expireAfterSeconds: options.expireAfterSeconds } : undefined,
2812
+ });
2813
+ },
2814
+ dropIndex: async (collection, indexName) => {
2815
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2816
+ return schemaManager.dropIndex(collection, indexName, { autoApply: true, ifExists: true });
2817
+ },
2818
+ addConstraint: async (collection, constraint) => {
2819
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2820
+ return schemaManager.addConstraint(collection, constraint, { autoApply: true });
2821
+ },
2822
+ dropConstraint: async (collection, constraintName) => {
2823
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2824
+ return schemaManager.dropConstraint(collection, constraintName, { autoApply: true });
2825
+ },
2826
+ rename: async (oldName, newName) => {
2827
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2828
+ return schemaManager.renameCollection(oldName, newName, { autoApply: true });
2829
+ },
2830
+ exists: async (name) => {
2831
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2832
+ return schemaManager.collectionExists(name);
2833
+ },
2834
+ list: async (schemaName) => {
2835
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2836
+ return schemaManager.listCollections(schemaName);
2837
+ },
2838
+ describe: async (name) => {
2839
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2840
+ return schemaManager.getCollectionSchema(name);
2841
+ },
2842
+ indexes: async (collection) => {
2843
+ const schemaManager = new schema_manager_1.SchemaManager(adapter());
2844
+ return schemaManager.listIndexes(collection);
2845
+ },
2846
+ };
2847
+ }
2848
+ // Query operations scoped to this connection
2849
+ query(options) {
2850
+ return this.service.query(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2851
+ }
2852
+ insert(options) {
2853
+ return this.service.insert(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2854
+ }
2855
+ update(options) {
2856
+ return this.service.update(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2857
+ }
2858
+ delete(options) {
2859
+ return this.service.delete(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2860
+ }
2861
+ upsert(options) {
2862
+ return this.service.upsert(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2863
+ }
2864
+ raw(options) {
2865
+ return this.service.raw(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2866
+ }
2867
+ // Aggregation operations scoped to this connection
2868
+ count(options) {
2869
+ return this.service.count(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2870
+ }
2871
+ sum(options) {
2872
+ return this.service.sum(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2873
+ }
2874
+ avg(options) {
2875
+ return this.service.avg(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2876
+ }
2877
+ min(options) {
2878
+ return this.service.min(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2879
+ }
2880
+ max(options) {
2881
+ return this.service.max(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2882
+ }
2883
+ aggregate(options) {
2884
+ return this.service.aggregate(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2885
+ }
2886
+ groupBy(options) {
2887
+ return this.service.groupBy(Object.assign(Object.assign({}, options), { database: this._database, env: this._env }));
2888
+ }
2889
+ /**
2890
+ * Trigger operations scoped to this connection
2891
+ */
2892
+ get triggers() {
2893
+ const connection = this;
2894
+ return {
2895
+ /**
2896
+ * Create a trigger and store it on the backend
2897
+ * @param data - Trigger configuration (tag should be just the trigger name, database tag is added automatically)
2898
+ */
2899
+ create: async (data) => {
2900
+ var _a;
2901
+ if (!connection._product) {
2902
+ throw new Error('Product tag is required to create triggers. Use connect() with product parameter.');
2903
+ }
2904
+ // Auto-prefix with database tag if not already prefixed
2905
+ const tag = ((_a = data.tag) === null || _a === void 0 ? void 0 : _a.includes(':')) ? data.tag : `${connection._database}:${data.tag}`;
2906
+ return connection.service.createTrigger(connection._product, Object.assign(Object.assign({}, data), { tag }));
2907
+ },
2908
+ /**
2909
+ * Update an existing trigger on the backend
2910
+ * @param data - Trigger configuration
2911
+ */
2912
+ update: async (data) => {
2913
+ var _a;
2914
+ if (!connection._product) {
2915
+ throw new Error('Product tag is required to update triggers. Use connect() with product parameter.');
2916
+ }
2917
+ const tag = ((_a = data.tag) === null || _a === void 0 ? void 0 : _a.includes(':')) ? data.tag : `${connection._database}:${data.tag}`;
2918
+ return connection.service.updateTrigger(connection._product, Object.assign(Object.assign({}, data), { tag }));
2919
+ },
2920
+ /**
2921
+ * Fetch a specific trigger from the backend
2922
+ * @param triggerTag - The trigger tag (without database prefix)
2923
+ */
2924
+ fetch: async (triggerTag) => {
2925
+ if (!connection._product) {
2926
+ throw new Error('Product tag is required to fetch triggers. Use connect() with product parameter.');
2927
+ }
2928
+ const tag = triggerTag.includes(':') ? triggerTag : `${connection._database}:${triggerTag}`;
2929
+ return connection.service.fetchTrigger(connection._product, tag);
2930
+ },
2931
+ /**
2932
+ * Fetch all triggers for this database from the backend
2933
+ * @deprecated Use list() instead
2934
+ */
2935
+ fetchAll: async () => {
2936
+ if (!connection._product) {
2937
+ throw new Error('Product tag is required to fetch triggers. Use connect() with product parameter.');
2938
+ }
2939
+ return connection.service.fetchTriggers(connection._product, connection._database);
2940
+ },
2941
+ /**
2942
+ * List all triggers for this database from the backend
2943
+ * @param options - Optional filters (table, event, enabled)
2944
+ */
2945
+ list: async (options) => {
2946
+ if (!connection._product) {
2947
+ throw new Error('Product tag is required to list triggers. Use connect() with product parameter.');
2948
+ }
2949
+ let triggers = await connection.service.fetchTriggers(connection._product, connection._database);
2950
+ // Apply filters if provided
2951
+ if (options === null || options === void 0 ? void 0 : options.table) {
2952
+ triggers = triggers.filter(t => { var _a; return (_a = t.tables) === null || _a === void 0 ? void 0 : _a.includes(options.table); });
2953
+ }
2954
+ if (options === null || options === void 0 ? void 0 : options.event) {
2955
+ triggers = triggers.filter(t => { var _a; return (_a = t.events) === null || _a === void 0 ? void 0 : _a.includes(options.event); });
2956
+ }
2957
+ if ((options === null || options === void 0 ? void 0 : options.enabled) !== undefined) {
2958
+ triggers = triggers.filter(t => t.enabled === options.enabled);
2959
+ }
2960
+ return triggers;
2961
+ },
2962
+ /**
2963
+ * Delete a trigger from the backend
2964
+ * @param triggerTag - The trigger tag (without database prefix)
2965
+ */
2966
+ delete: async (triggerTag) => {
2967
+ if (!connection._product) {
2968
+ throw new Error('Product tag is required to delete triggers. Use connect() with product parameter.');
2969
+ }
2970
+ const tag = triggerTag.includes(':') ? triggerTag : `${connection._database}:${triggerTag}`;
2971
+ await connection.service.deleteTrigger(connection._product, tag);
2972
+ return true;
2973
+ },
2974
+ /**
2975
+ * Register a trigger in memory for the current session (does not persist to backend)
2976
+ * @deprecated Use create() for persistent triggers
2977
+ */
2978
+ register: (table, trigger) => {
2979
+ connection.triggerProcessor.register(table, trigger);
2980
+ },
2981
+ /**
2982
+ * Register multiple triggers in memory (does not persist to backend)
2983
+ * @deprecated Use create() for persistent triggers
2984
+ */
2985
+ registerAll: (triggers) => {
2986
+ connection.triggerProcessor.registerAll(triggers);
2987
+ },
2988
+ /**
2989
+ * Unregister a trigger from memory
2990
+ */
2991
+ unregister: (table, triggerName) => {
2992
+ return connection.triggerProcessor.unregister(table, triggerName);
2993
+ },
2994
+ /**
2995
+ * Get all triggers for a table and event
2996
+ */
2997
+ getTriggersForEvent: (table, event) => {
2998
+ return connection.triggerProcessor.getTriggersForEvent(table, event);
2999
+ },
3000
+ /**
3001
+ * Execute all triggers for an event
3002
+ */
3003
+ execute: async (event, context) => {
3004
+ return connection.triggerProcessor.executeTriggers(event, Object.assign(Object.assign({}, context), { database: connection._database, env: connection._env }));
3005
+ },
3006
+ /**
3007
+ * Load triggers from the backend and register them in memory
3008
+ */
3009
+ load: async () => {
3010
+ if (!connection._product) {
3011
+ throw new Error('Product tag is required to load triggers. Use connect() with product parameter.');
3012
+ }
3013
+ const backendTriggers = await connection.service.fetchTriggers(connection._product, connection._database);
3014
+ for (const trigger of backendTriggers) {
3015
+ // Convert backend trigger format to ITriggerDefinition
3016
+ const definition = {
3017
+ name: trigger.tag,
3018
+ description: trigger.description,
3019
+ events: trigger.events, // TriggerEventType maps to TriggerEvent
3020
+ tables: trigger.tables,
3021
+ condition: trigger.condition,
3022
+ actions: trigger.actions.map(action => (Object.assign(Object.assign({}, action.config), { type: action.type, name: action.name, condition: action.condition, timing: action.timing, retry: action.retry, timeout: action.timeout, continueOnError: action.continueOnError }))),
3023
+ enabled: trigger.enabled,
3024
+ priority: trigger.priority,
3025
+ tags: trigger.tags,
3026
+ };
3027
+ // Register for all tables specified, or use '*' for all
3028
+ const tables = trigger.tables && trigger.tables.length > 0 ? trigger.tables : ['*'];
3029
+ for (const table of tables) {
3030
+ connection.triggerProcessor.register(table, definition);
3031
+ }
3032
+ }
3033
+ },
3034
+ /**
3035
+ * Set the Ductape instance for trigger actions
3036
+ */
3037
+ setDuctapeInstance: (instance) => {
3038
+ connection.triggerProcessor.setDuctapeInstance(instance);
3039
+ },
3040
+ /**
3041
+ * Get the trigger processor instance
3042
+ */
3043
+ getProcessor: () => {
3044
+ return connection.triggerProcessor;
3045
+ },
3046
+ /**
3047
+ * Trigger action builders
3048
+ */
3049
+ Trigger: trigger_processor_1.Trigger,
3050
+ /**
3051
+ * Trigger events enum
3052
+ */
3053
+ TriggerEvent: trigger_interface_1.TriggerEvent,
3054
+ /**
3055
+ * Trigger timing enum
3056
+ */
3057
+ TriggerTiming: trigger_interface_1.TriggerTiming,
3058
+ /**
3059
+ * Trigger action types enum
3060
+ */
3061
+ TriggerActionType: trigger_interface_1.TriggerActionType,
3062
+ };
3063
+ }
3064
+ }
3065
+ exports.DatabaseConnection = DatabaseConnection;
3066
+ // Export singleton instance for convenience
3067
+ exports.databaseService = new DatabaseService();
3068
+ //# sourceMappingURL=databases.service.js.map