@wildo-ai/platform-config-lib 1.0.1

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 (230) hide show
  1. package/dist/esm/bootstrap/application-backend-env.contracts.d.ts +2 -0
  2. package/dist/esm/bootstrap/application-backend-env.contracts.d.ts.map +1 -0
  3. package/dist/esm/bootstrap/application-backend-env.contracts.js +2 -0
  4. package/dist/esm/bootstrap/application-backend-env.contracts.js.map +1 -0
  5. package/dist/esm/bootstrap/bootstrap-planner.d.ts +20 -0
  6. package/dist/esm/bootstrap/bootstrap-planner.d.ts.map +1 -0
  7. package/dist/esm/bootstrap/bootstrap-planner.js +26 -0
  8. package/dist/esm/bootstrap/bootstrap-planner.js.map +1 -0
  9. package/dist/esm/bootstrap/bootstrap.contracts.d.ts +120 -0
  10. package/dist/esm/bootstrap/bootstrap.contracts.d.ts.map +1 -0
  11. package/dist/esm/bootstrap/bootstrap.contracts.js +117 -0
  12. package/dist/esm/bootstrap/bootstrap.contracts.js.map +1 -0
  13. package/dist/esm/bootstrap/bootstrap.schemas.d.ts +485 -0
  14. package/dist/esm/bootstrap/bootstrap.schemas.d.ts.map +1 -0
  15. package/dist/esm/bootstrap/bootstrap.schemas.js +130 -0
  16. package/dist/esm/bootstrap/bootstrap.schemas.js.map +1 -0
  17. package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts +78 -0
  18. package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts.map +1 -0
  19. package/dist/esm/bootstrap/platform-runtime-env.contracts.js +98 -0
  20. package/dist/esm/bootstrap/platform-runtime-env.contracts.js.map +1 -0
  21. package/dist/esm/bootstrap/runtime-topology.contracts.d.ts +17 -0
  22. package/dist/esm/bootstrap/runtime-topology.contracts.d.ts.map +1 -0
  23. package/dist/esm/bootstrap/runtime-topology.contracts.js +60 -0
  24. package/dist/esm/bootstrap/runtime-topology.contracts.js.map +1 -0
  25. package/dist/esm/credentials/credential-generator.service.d.ts +11 -0
  26. package/dist/esm/credentials/credential-generator.service.d.ts.map +1 -0
  27. package/dist/esm/credentials/credential-generator.service.js +31 -0
  28. package/dist/esm/credentials/credential-generator.service.js.map +1 -0
  29. package/dist/esm/credentials/credentials-provisioner.service.d.ts +190 -0
  30. package/dist/esm/credentials/credentials-provisioner.service.d.ts.map +1 -0
  31. package/dist/esm/credentials/credentials-provisioner.service.js +278 -0
  32. package/dist/esm/credentials/credentials-provisioner.service.js.map +1 -0
  33. package/dist/esm/index.d.ts +16 -0
  34. package/dist/esm/index.d.ts.map +1 -0
  35. package/dist/esm/index.js +16 -0
  36. package/dist/esm/index.js.map +1 -0
  37. package/dist/esm/infra-managers/infra-manager.models.d.ts +146 -0
  38. package/dist/esm/infra-managers/infra-manager.models.d.ts.map +1 -0
  39. package/dist/esm/infra-managers/infra-manager.models.js +2 -0
  40. package/dist/esm/infra-managers/infra-manager.models.js.map +1 -0
  41. package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts +64 -0
  42. package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts.map +1 -0
  43. package/dist/esm/infra-managers/mongo-atlas-manager.service.js +307 -0
  44. package/dist/esm/infra-managers/mongo-atlas-manager.service.js.map +1 -0
  45. package/dist/esm/infra-managers/postgresql-manager.service.d.ts +115 -0
  46. package/dist/esm/infra-managers/postgresql-manager.service.d.ts.map +1 -0
  47. package/dist/esm/infra-managers/postgresql-manager.service.js +403 -0
  48. package/dist/esm/infra-managers/postgresql-manager.service.js.map +1 -0
  49. package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts +64 -0
  50. package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts.map +1 -0
  51. package/dist/esm/infra-managers/rabbitmq-manager.service.js +288 -0
  52. package/dist/esm/infra-managers/rabbitmq-manager.service.js.map +1 -0
  53. package/dist/esm/infra-managers/redis-manager.service.d.ts +78 -0
  54. package/dist/esm/infra-managers/redis-manager.service.d.ts.map +1 -0
  55. package/dist/esm/infra-managers/redis-manager.service.js +326 -0
  56. package/dist/esm/infra-managers/redis-manager.service.js.map +1 -0
  57. package/dist/esm/project-config/define-framework-config.d.ts +36 -0
  58. package/dist/esm/project-config/define-framework-config.d.ts.map +1 -0
  59. package/dist/esm/project-config/define-framework-config.js +30 -0
  60. package/dist/esm/project-config/define-framework-config.js.map +1 -0
  61. package/dist/esm/project-config/define-infra-config.d.ts +128 -0
  62. package/dist/esm/project-config/define-infra-config.d.ts.map +1 -0
  63. package/dist/esm/project-config/define-infra-config.js +87 -0
  64. package/dist/esm/project-config/define-infra-config.js.map +1 -0
  65. package/dist/esm/project-config/define-minion-config.d.ts +41 -0
  66. package/dist/esm/project-config/define-minion-config.d.ts.map +1 -0
  67. package/dist/esm/project-config/define-minion-config.js +24 -0
  68. package/dist/esm/project-config/define-minion-config.js.map +1 -0
  69. package/dist/esm/project-config/define-platform-config.d.ts +65 -0
  70. package/dist/esm/project-config/define-platform-config.d.ts.map +1 -0
  71. package/dist/esm/project-config/define-platform-config.js +22 -0
  72. package/dist/esm/project-config/define-platform-config.js.map +1 -0
  73. package/dist/esm/project-config/define-platform-env-config.d.ts +41 -0
  74. package/dist/esm/project-config/define-platform-env-config.d.ts.map +1 -0
  75. package/dist/esm/project-config/define-platform-env-config.js +45 -0
  76. package/dist/esm/project-config/define-platform-env-config.js.map +1 -0
  77. package/dist/esm/project-config/define-project-config.d.ts +38 -0
  78. package/dist/esm/project-config/define-project-config.d.ts.map +1 -0
  79. package/dist/esm/project-config/define-project-config.js +57 -0
  80. package/dist/esm/project-config/define-project-config.js.map +1 -0
  81. package/dist/esm/project-config/define-saas-config.d.ts +252 -0
  82. package/dist/esm/project-config/define-saas-config.d.ts.map +1 -0
  83. package/dist/esm/project-config/define-saas-config.js +137 -0
  84. package/dist/esm/project-config/define-saas-config.js.map +1 -0
  85. package/dist/esm/project-config/define-sharing-policy.d.ts +35 -0
  86. package/dist/esm/project-config/define-sharing-policy.d.ts.map +1 -0
  87. package/dist/esm/project-config/define-sharing-policy.js +30 -0
  88. package/dist/esm/project-config/define-sharing-policy.js.map +1 -0
  89. package/dist/esm/project-config/define-worker-config.d.ts +42 -0
  90. package/dist/esm/project-config/define-worker-config.d.ts.map +1 -0
  91. package/dist/esm/project-config/define-worker-config.js +24 -0
  92. package/dist/esm/project-config/define-worker-config.js.map +1 -0
  93. package/dist/esm/project-config/index.d.ts +22 -0
  94. package/dist/esm/project-config/index.d.ts.map +1 -0
  95. package/dist/esm/project-config/index.js +22 -0
  96. package/dist/esm/project-config/index.js.map +1 -0
  97. package/dist/esm/project-config/loader.d.ts +42 -0
  98. package/dist/esm/project-config/loader.d.ts.map +1 -0
  99. package/dist/esm/project-config/loader.js +164 -0
  100. package/dist/esm/project-config/loader.js.map +1 -0
  101. package/dist/esm/project-config/shared/application-modules.schemas.d.ts +10 -0
  102. package/dist/esm/project-config/shared/application-modules.schemas.d.ts.map +1 -0
  103. package/dist/esm/project-config/shared/application-modules.schemas.js +6 -0
  104. package/dist/esm/project-config/shared/application-modules.schemas.js.map +1 -0
  105. package/dist/esm/project-config/shared/application-modules.utils.d.ts +6 -0
  106. package/dist/esm/project-config/shared/application-modules.utils.d.ts.map +1 -0
  107. package/dist/esm/project-config/shared/application-modules.utils.js +26 -0
  108. package/dist/esm/project-config/shared/application-modules.utils.js.map +1 -0
  109. package/dist/esm/project-config/shared/backing-services.schemas.d.ts +68 -0
  110. package/dist/esm/project-config/shared/backing-services.schemas.d.ts.map +1 -0
  111. package/dist/esm/project-config/shared/backing-services.schemas.js +49 -0
  112. package/dist/esm/project-config/shared/backing-services.schemas.js.map +1 -0
  113. package/dist/esm/project-config/shared/data-services.schemas.d.ts +33 -0
  114. package/dist/esm/project-config/shared/data-services.schemas.d.ts.map +1 -0
  115. package/dist/esm/project-config/shared/data-services.schemas.js +47 -0
  116. package/dist/esm/project-config/shared/data-services.schemas.js.map +1 -0
  117. package/dist/esm/project-config/shared/env-example-defaults.d.ts +27 -0
  118. package/dist/esm/project-config/shared/env-example-defaults.d.ts.map +1 -0
  119. package/dist/esm/project-config/shared/env-example-defaults.js +30 -0
  120. package/dist/esm/project-config/shared/env-example-defaults.js.map +1 -0
  121. package/dist/esm/project-config/shared/environment.schemas.d.ts +106 -0
  122. package/dist/esm/project-config/shared/environment.schemas.d.ts.map +1 -0
  123. package/dist/esm/project-config/shared/environment.schemas.js +111 -0
  124. package/dist/esm/project-config/shared/environment.schemas.js.map +1 -0
  125. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts +42 -0
  126. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts.map +1 -0
  127. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js +42 -0
  128. package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js.map +1 -0
  129. package/dist/esm/project-config/shared/k8s-utils.d.ts +36 -0
  130. package/dist/esm/project-config/shared/k8s-utils.d.ts.map +1 -0
  131. package/dist/esm/project-config/shared/k8s-utils.js +50 -0
  132. package/dist/esm/project-config/shared/k8s-utils.js.map +1 -0
  133. package/dist/esm/project-config/shared/platform-services.schemas.d.ts +30 -0
  134. package/dist/esm/project-config/shared/platform-services.schemas.d.ts.map +1 -0
  135. package/dist/esm/project-config/shared/platform-services.schemas.js +27 -0
  136. package/dist/esm/project-config/shared/platform-services.schemas.js.map +1 -0
  137. package/dist/esm/project-config/shared/service-definitions.schemas.d.ts +42 -0
  138. package/dist/esm/project-config/shared/service-definitions.schemas.d.ts.map +1 -0
  139. package/dist/esm/project-config/shared/service-definitions.schemas.js +29 -0
  140. package/dist/esm/project-config/shared/service-definitions.schemas.js.map +1 -0
  141. package/dist/esm/project-config/sharing-policy-validation.d.ts +40 -0
  142. package/dist/esm/project-config/sharing-policy-validation.d.ts.map +1 -0
  143. package/dist/esm/project-config/sharing-policy-validation.js +143 -0
  144. package/dist/esm/project-config/sharing-policy-validation.js.map +1 -0
  145. package/dist/esm/release/framework-release.constants.d.ts +3 -0
  146. package/dist/esm/release/framework-release.constants.d.ts.map +1 -0
  147. package/dist/esm/release/framework-release.constants.js +3 -0
  148. package/dist/esm/release/framework-release.constants.js.map +1 -0
  149. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts +23 -0
  150. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts.map +1 -0
  151. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js +13 -0
  152. package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js.map +1 -0
  153. package/dist/esm/schemas/framework-info.schemas.d.ts +8 -0
  154. package/dist/esm/schemas/framework-info.schemas.d.ts.map +1 -0
  155. package/dist/esm/schemas/framework-info.schemas.js +8 -0
  156. package/dist/esm/schemas/framework-info.schemas.js.map +1 -0
  157. package/dist/esm/schemas/framework-secrets.schemas.d.ts +22 -0
  158. package/dist/esm/schemas/framework-secrets.schemas.d.ts.map +1 -0
  159. package/dist/esm/schemas/framework-secrets.schemas.js +14 -0
  160. package/dist/esm/schemas/framework-secrets.schemas.js.map +1 -0
  161. package/dist/esm/schemas/platform-application-config.schemas.d.ts +20 -0
  162. package/dist/esm/schemas/platform-application-config.schemas.d.ts.map +1 -0
  163. package/dist/esm/schemas/platform-application-config.schemas.js +19 -0
  164. package/dist/esm/schemas/platform-application-config.schemas.js.map +1 -0
  165. package/dist/esm/schemas/platform-application-secrets.schemas.d.ts +54 -0
  166. package/dist/esm/schemas/platform-application-secrets.schemas.d.ts.map +1 -0
  167. package/dist/esm/schemas/platform-application-secrets.schemas.js +67 -0
  168. package/dist/esm/schemas/platform-application-secrets.schemas.js.map +1 -0
  169. package/dist/esm/schemas/platform-config.schemas.d.ts +66 -0
  170. package/dist/esm/schemas/platform-config.schemas.d.ts.map +1 -0
  171. package/dist/esm/schemas/platform-config.schemas.js +28 -0
  172. package/dist/esm/schemas/platform-config.schemas.js.map +1 -0
  173. package/dist/esm/workspace-scope/index.d.ts +3 -0
  174. package/dist/esm/workspace-scope/index.d.ts.map +1 -0
  175. package/dist/esm/workspace-scope/index.js +3 -0
  176. package/dist/esm/workspace-scope/index.js.map +1 -0
  177. package/dist/esm/workspace-scope/workspace-scope-detector.d.ts +15 -0
  178. package/dist/esm/workspace-scope/workspace-scope-detector.d.ts.map +1 -0
  179. package/dist/esm/workspace-scope/workspace-scope-detector.js +87 -0
  180. package/dist/esm/workspace-scope/workspace-scope-detector.js.map +1 -0
  181. package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts +118 -0
  182. package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts.map +1 -0
  183. package/dist/esm/workspace-scope/workspace-scope.schemas.js +157 -0
  184. package/dist/esm/workspace-scope/workspace-scope.schemas.js.map +1 -0
  185. package/dist/tsconfig.build.tsbuildinfo +1 -0
  186. package/package.json +52 -0
  187. package/src/bootstrap/application-backend-env.contracts.ts +17 -0
  188. package/src/bootstrap/bootstrap-planner.ts +46 -0
  189. package/src/bootstrap/bootstrap.contracts.ts +251 -0
  190. package/src/bootstrap/bootstrap.schemas.ts +164 -0
  191. package/src/bootstrap/platform-runtime-env.contracts.ts +99 -0
  192. package/src/bootstrap/runtime-topology.contracts.ts +102 -0
  193. package/src/credentials/credential-generator.service.ts +39 -0
  194. package/src/index.ts +16 -0
  195. package/src/project-config/__tests__/application-modules.utils.test.ts +53 -0
  196. package/src/project-config/__tests__/define-framework-config.test.ts +43 -0
  197. package/src/project-config/__tests__/define-saas-config.test.ts +210 -0
  198. package/src/project-config/__tests__/loader.test.ts +100 -0
  199. package/src/project-config/define-framework-config.ts +44 -0
  200. package/src/project-config/define-infra-config.ts +168 -0
  201. package/src/project-config/define-minion-config.ts +27 -0
  202. package/src/project-config/define-platform-config.ts +28 -0
  203. package/src/project-config/define-platform-env-config.ts +59 -0
  204. package/src/project-config/define-project-config.ts +63 -0
  205. package/src/project-config/define-saas-config.ts +171 -0
  206. package/src/project-config/define-sharing-policy.ts +36 -0
  207. package/src/project-config/define-worker-config.ts +27 -0
  208. package/src/project-config/index.ts +23 -0
  209. package/src/project-config/loader.ts +220 -0
  210. package/src/project-config/shared/application-modules.schemas.ts +12 -0
  211. package/src/project-config/shared/application-modules.utils.ts +65 -0
  212. package/src/project-config/shared/backing-services.schemas.ts +59 -0
  213. package/src/project-config/shared/data-services.schemas.ts +58 -0
  214. package/src/project-config/shared/env-example-defaults.ts +50 -0
  215. package/src/project-config/shared/environment.schemas.ts +136 -0
  216. package/src/project-config/shared/infrastructure-defaults.schemas.ts +47 -0
  217. package/src/project-config/shared/k8s-utils.ts +56 -0
  218. package/src/project-config/shared/platform-services.schemas.ts +33 -0
  219. package/src/project-config/shared/service-definitions.schemas.ts +38 -0
  220. package/src/project-config/sharing-policy-validation.ts +159 -0
  221. package/src/release/framework-release.constants.ts +2 -0
  222. package/src/schemas/__tests__/platform-config.schemas.test.ts +90 -0
  223. package/src/schemas/framework-info.schemas.ts +13 -0
  224. package/src/schemas/framework-secrets.schemas.ts +19 -0
  225. package/src/schemas/platform-application-config.schemas.ts +25 -0
  226. package/src/schemas/platform-application-secrets.schemas.ts +78 -0
  227. package/src/schemas/platform-config.schemas.ts +45 -0
  228. package/src/workspace-scope/index.ts +2 -0
  229. package/src/workspace-scope/workspace-scope-detector.ts +98 -0
  230. package/src/workspace-scope/workspace-scope.schemas.ts +224 -0
@@ -0,0 +1,403 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
11
+ return function (target, key) { decorator(target, key, paramIndex); }
12
+ };
13
+ import { injectable, inject } from 'inversify';
14
+ import { Pool } from 'pg';
15
+ import { buildPostgreSQLConnectionUrl, PostgreSQLSSLMode } from '@wildo-ai/saas-models';
16
+ import { PLATFORM_RUNTIME_BRIDGE_TYPES, } from '../runtime-bridge/platform-runtime-bridge.contracts.js';
17
+ /**
18
+ * PostgreSQL Connection Manager Service
19
+ *
20
+ * Manages PostgreSQL connections and database provisioning for applications.
21
+ * Used by the PlatformInfrastructureManagerService to create databases for
22
+ * applications that opt into PostgreSQL as their persistence adapter.
23
+ *
24
+ * Key Features:
25
+ * - Admin connection management with retry logic
26
+ * - Database creation (CREATE DATABASE, CREATE USER, GRANT)
27
+ * - Database deletion (terminate connections, DROP DATABASE/USER)
28
+ * - Idempotent operations (safe to call multiple times)
29
+ * - URL-encoded password handling for special characters
30
+ *
31
+ * @see DATABASE_AGNOSTIC_REPOSITORY_ANALYSIS.md Section 19.2
32
+ */
33
+ let PostgreSQLConnectionManagerService = class PostgreSQLConnectionManagerService {
34
+ logger;
35
+ adminPool = null;
36
+ adminConfig = null;
37
+ logDebug;
38
+ constructor(logger) {
39
+ this.logger = logger;
40
+ this.logDebug = this.logger.debugByType('PostgreSQLConnectionManagerService');
41
+ this.logger.setDebugTypeLogging('PostgreSQLConnectionManagerService', true);
42
+ this.logDebug('PostgreSQL connection manager service initialized');
43
+ }
44
+ // =====================
45
+ // ADMIN CONNECTION
46
+ // =====================
47
+ /**
48
+ * Check if PostgreSQL admin is initialized and ready to use
49
+ * @returns true if initializeAdmin() has been called successfully
50
+ */
51
+ isAdminInitialized() {
52
+ return this.adminPool !== null;
53
+ }
54
+ /**
55
+ * Initialize PostgreSQL admin connection with retry logic.
56
+ * Waits for PostgreSQL to be ready before returning.
57
+ *
58
+ * @param config - PostgreSQL admin configuration
59
+ * @param maxRetries - Maximum number of retry attempts (default: 10)
60
+ * @param retryDelayMs - Delay between retries in milliseconds (default: 3000)
61
+ * @throws Error if connection cannot be established after all retries
62
+ */
63
+ async initializeAdmin(config, maxRetries = 10, retryDelayMs = 3000) {
64
+ if (this.adminPool)
65
+ return;
66
+ this.logDebug('Initializing PostgreSQL admin connection');
67
+ this.adminConfig = config;
68
+ const poolConfig = {
69
+ connectionString: config.adminUrl,
70
+ max: 5, // Admin pool doesn't need many connections
71
+ idleTimeoutMillis: 30000,
72
+ connectionTimeoutMillis: 10000,
73
+ // SSL config based on sslMode
74
+ ...(config.sslMode && config.sslMode !== PostgreSQLSSLMode.DISABLE ? {
75
+ ssl: config.sslMode === PostgreSQLSSLMode.REQUIRE
76
+ ? { rejectUnauthorized: false }
77
+ : { rejectUnauthorized: true }
78
+ } : {}),
79
+ };
80
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
81
+ try {
82
+ this.adminPool = new Pool(poolConfig);
83
+ // Attach error handler to prevent unhandled errors during restarts
84
+ this.adminPool.on('error', (err) => {
85
+ this.logger.error('PostgreSQL admin pool error', { error: err.message });
86
+ });
87
+ // Verify connection
88
+ const client = await this.adminPool.connect();
89
+ try {
90
+ await client.query('SELECT 1');
91
+ this.logDebug('PostgreSQL admin connection verified', { attempt });
92
+ return;
93
+ }
94
+ finally {
95
+ client.release();
96
+ }
97
+ }
98
+ catch (error) {
99
+ const errorMsg = error instanceof Error ? error.message : String(error);
100
+ const isConnectionError = errorMsg.includes('ECONNREFUSED') ||
101
+ errorMsg.includes('ETIMEDOUT') ||
102
+ errorMsg.includes('Connection terminated');
103
+ // Clean up failed connection
104
+ if (this.adminPool) {
105
+ try {
106
+ await this.adminPool.end();
107
+ }
108
+ catch { }
109
+ this.adminPool = null;
110
+ }
111
+ if (attempt === maxRetries) {
112
+ throw new Error(`PostgreSQL admin connection failed after ${maxRetries} attempts: ${errorMsg}`);
113
+ }
114
+ if (isConnectionError) {
115
+ this.logDebug(`PostgreSQL not ready (attempt ${attempt}/${maxRetries}), retrying in ${retryDelayMs}ms...`, { error: errorMsg });
116
+ await this.sleep(retryDelayMs);
117
+ }
118
+ else {
119
+ // Non-connection error (e.g., auth failure) - fail immediately
120
+ throw new Error(`PostgreSQL admin connection error: ${errorMsg}`);
121
+ }
122
+ }
123
+ }
124
+ }
125
+ sleep(ms) {
126
+ return new Promise(resolve => setTimeout(resolve, ms));
127
+ }
128
+ // =====================
129
+ // DATABASE PROVISIONING
130
+ // =====================
131
+ /**
132
+ * Create a new application database with dedicated user.
133
+ *
134
+ * Operations performed:
135
+ * 1. CREATE USER with LOGIN privilege
136
+ * 2. CREATE DATABASE owned by user
137
+ * 3. GRANT all privileges on database to user
138
+ *
139
+ * This operation is idempotent - if database/user already exist,
140
+ * it will verify ownership and update password if needed.
141
+ *
142
+ * @param input - Database creation parameters
143
+ * @returns Result including connection URL
144
+ */
145
+ async createApplicationDatabase(input) {
146
+ if (!this.adminPool || !this.adminConfig) {
147
+ throw new Error('PostgreSQL admin not initialized');
148
+ }
149
+ const { databaseName, username, password, sslMode } = input;
150
+ this.logDebug('Creating application database', { databaseName, username });
151
+ const client = await this.adminPool.connect();
152
+ try {
153
+ // Step 1: Create or update user
154
+ // Note: Using format() would be better but pg doesn't support it directly
155
+ // We validate inputs to prevent SQL injection
156
+ this.validateIdentifier(username, 'username');
157
+ this.validateIdentifier(databaseName, 'databaseName');
158
+ // Check if user exists
159
+ const userExists = await this.userExists(client, username);
160
+ if (userExists) {
161
+ // Update password for existing user
162
+ await client.query(`ALTER USER ${this.quoteIdentifier(username)} WITH PASSWORD $1`, [password]);
163
+ this.logDebug('Updated password for existing user', { username });
164
+ }
165
+ else {
166
+ // Create new user
167
+ await client.query(`CREATE USER ${this.quoteIdentifier(username)} WITH LOGIN PASSWORD $1`, [password]);
168
+ this.logDebug('Created new user', { username });
169
+ }
170
+ // Step 2: Create database if not exists
171
+ const dbExists = await this.databaseExists(client, databaseName);
172
+ if (!dbExists) {
173
+ await client.query(`CREATE DATABASE ${this.quoteIdentifier(databaseName)} OWNER ${this.quoteIdentifier(username)}`);
174
+ this.logDebug('Created new database', { databaseName, owner: username });
175
+ }
176
+ else {
177
+ // Ensure correct ownership
178
+ await client.query(`ALTER DATABASE ${this.quoteIdentifier(databaseName)} OWNER TO ${this.quoteIdentifier(username)}`);
179
+ this.logDebug('Verified database ownership', { databaseName, owner: username });
180
+ }
181
+ // Step 3: Grant privileges
182
+ await client.query(`GRANT ALL PRIVILEGES ON DATABASE ${this.quoteIdentifier(databaseName)} TO ${this.quoteIdentifier(username)}`);
183
+ this.logDebug('Granted privileges on database', { databaseName, username });
184
+ // Build connection URL
185
+ const host = this.adminConfig.host;
186
+ const port = this.adminConfig.port || 5432;
187
+ const connectionUrl = buildPostgreSQLConnectionUrl({
188
+ host,
189
+ port,
190
+ database: databaseName,
191
+ username,
192
+ password,
193
+ sslMode: sslMode || this.adminConfig.sslMode,
194
+ });
195
+ return {
196
+ databaseName,
197
+ username,
198
+ connectionUrl,
199
+ created: !dbExists,
200
+ };
201
+ }
202
+ finally {
203
+ client.release();
204
+ }
205
+ }
206
+ /**
207
+ * Delete an application database and its user.
208
+ *
209
+ * Operations performed:
210
+ * 1. Terminate all connections to the database
211
+ * 2. DROP DATABASE
212
+ * 3. DROP USER
213
+ *
214
+ * This operation is idempotent - if database/user don't exist,
215
+ * it will return successfully.
216
+ *
217
+ * @param input - Database deletion parameters
218
+ * @returns Result indicating what was deleted
219
+ */
220
+ async deleteApplicationDatabase(input) {
221
+ if (!this.adminPool) {
222
+ throw new Error('PostgreSQL admin not initialized');
223
+ }
224
+ const { databaseName, username } = input;
225
+ this.logDebug('Deleting application database', { databaseName, username });
226
+ const client = await this.adminPool.connect();
227
+ try {
228
+ this.validateIdentifier(username, 'username');
229
+ this.validateIdentifier(databaseName, 'databaseName');
230
+ let databaseDeleted = false;
231
+ let userDeleted = false;
232
+ // Step 1: Check if database exists and terminate connections
233
+ const dbExists = await this.databaseExists(client, databaseName);
234
+ if (dbExists) {
235
+ // Terminate all connections to the database
236
+ await client.query(`
237
+ SELECT pg_terminate_backend(pg_stat_activity.pid)
238
+ FROM pg_stat_activity
239
+ WHERE pg_stat_activity.datname = $1
240
+ AND pid <> pg_backend_pid()
241
+ `, [databaseName]);
242
+ this.logDebug('Terminated connections to database', { databaseName });
243
+ // Drop the database
244
+ await client.query(`DROP DATABASE IF EXISTS ${this.quoteIdentifier(databaseName)}`);
245
+ databaseDeleted = true;
246
+ this.logDebug('Dropped database', { databaseName });
247
+ }
248
+ // Step 2: Drop user if exists
249
+ const userExists = await this.userExists(client, username);
250
+ if (userExists) {
251
+ // Revoke any remaining privileges before dropping
252
+ try {
253
+ await client.query(`REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM ${this.quoteIdentifier(username)}`);
254
+ await client.query(`REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM ${this.quoteIdentifier(username)}`);
255
+ }
256
+ catch {
257
+ // Ignore errors from revoking non-existent privileges
258
+ }
259
+ await client.query(`DROP USER IF EXISTS ${this.quoteIdentifier(username)}`);
260
+ userDeleted = true;
261
+ this.logDebug('Dropped user', { username });
262
+ }
263
+ return {
264
+ databaseName,
265
+ username,
266
+ databaseDeleted,
267
+ userDeleted,
268
+ };
269
+ }
270
+ finally {
271
+ client.release();
272
+ }
273
+ }
274
+ /**
275
+ * Run Prisma migrations on a database.
276
+ *
277
+ * This spawns a child process to run `npx prisma migrate deploy`
278
+ * with the provided connection URL and schema path.
279
+ *
280
+ * @param connectionUrl - PostgreSQL connection URL
281
+ * @param schemaPath - Path to Prisma schema file
282
+ * @returns Promise that resolves when migrations complete
283
+ */
284
+ async runMigrations(connectionUrl, schemaPath) {
285
+ const { spawn } = await import('child_process');
286
+ return new Promise((resolve) => {
287
+ this.logDebug('Running Prisma migrations', { schemaPath });
288
+ const env = {
289
+ ...process.env,
290
+ DATABASE_URL: connectionUrl,
291
+ };
292
+ const child = spawn('npx', ['prisma', 'migrate', 'deploy', '--schema', schemaPath], {
293
+ env,
294
+ cwd: process.cwd(),
295
+ stdio: ['ignore', 'pipe', 'pipe'],
296
+ });
297
+ let stdout = '';
298
+ let stderr = '';
299
+ child.stdout.on('data', (data) => {
300
+ stdout += data.toString();
301
+ });
302
+ child.stderr.on('data', (data) => {
303
+ stderr += data.toString();
304
+ });
305
+ child.on('close', (code) => {
306
+ const output = stdout + stderr;
307
+ if (code === 0) {
308
+ this.logDebug('Prisma migrations completed successfully');
309
+ resolve({ success: true, output });
310
+ }
311
+ else {
312
+ this.logger.error('Prisma migrations failed', { code, output });
313
+ resolve({ success: false, output });
314
+ }
315
+ });
316
+ child.on('error', (error) => {
317
+ this.logger.error('Failed to spawn Prisma migrate', { error: error.message });
318
+ resolve({ success: false, output: error.message });
319
+ });
320
+ });
321
+ }
322
+ // =====================
323
+ // HELPER METHODS
324
+ // =====================
325
+ /**
326
+ * Check if a database exists
327
+ */
328
+ async databaseExists(client, databaseName) {
329
+ const result = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [databaseName]);
330
+ return result.rowCount !== null && result.rowCount > 0;
331
+ }
332
+ /**
333
+ * Check if a user exists
334
+ */
335
+ async userExists(client, username) {
336
+ const result = await client.query('SELECT 1 FROM pg_roles WHERE rolname = $1', [username]);
337
+ return result.rowCount !== null && result.rowCount > 0;
338
+ }
339
+ /**
340
+ * Validate a SQL identifier to prevent injection
341
+ * Only allows alphanumeric characters and underscores
342
+ */
343
+ validateIdentifier(value, fieldName) {
344
+ if (!value || !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(value)) {
345
+ throw new Error(`Invalid ${fieldName}: must start with letter/underscore and contain only alphanumeric/underscore characters`);
346
+ }
347
+ if (value.length > 63) {
348
+ throw new Error(`Invalid ${fieldName}: must be 63 characters or less`);
349
+ }
350
+ }
351
+ /**
352
+ * Quote an identifier for safe use in SQL
353
+ * This is a simple implementation - pg library handles most escaping
354
+ */
355
+ quoteIdentifier(identifier) {
356
+ // Double-quote the identifier and escape any internal double quotes
357
+ return `"${identifier.replace(/"/g, '""')}"`;
358
+ }
359
+ // =====================
360
+ // CONNECTION POOL HEALTH
361
+ // =====================
362
+ /**
363
+ * Get the current health status of the admin connection
364
+ */
365
+ async getAdminHealth() {
366
+ if (!this.adminPool) {
367
+ return { status: 'disconnected' };
368
+ }
369
+ try {
370
+ const start = Date.now();
371
+ const client = await this.adminPool.connect();
372
+ try {
373
+ await client.query('SELECT 1');
374
+ const latency = Date.now() - start;
375
+ return { status: 'connected', latency };
376
+ }
377
+ finally {
378
+ client.release();
379
+ }
380
+ }
381
+ catch {
382
+ return { status: 'disconnected' };
383
+ }
384
+ }
385
+ /**
386
+ * Close the admin connection pool
387
+ */
388
+ async closeAdmin() {
389
+ if (this.adminPool) {
390
+ await this.adminPool.end();
391
+ this.adminPool = null;
392
+ this.adminConfig = null;
393
+ this.logDebug('PostgreSQL admin connection pool closed');
394
+ }
395
+ }
396
+ };
397
+ PostgreSQLConnectionManagerService = __decorate([
398
+ injectable(),
399
+ __param(0, inject(PLATFORM_RUNTIME_BRIDGE_TYPES.Logger)),
400
+ __metadata("design:paramtypes", [Object])
401
+ ], PostgreSQLConnectionManagerService);
402
+ export { PostgreSQLConnectionManagerService };
403
+ //# sourceMappingURL=postgresql-manager.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql-manager.service.js","sourceRoot":"","sources":["../../../src/infra-managers/postgresql-manager.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ import * as amqp from 'amqplib';
2
+ import { type PlatformRuntimeLogger } from '../runtime-bridge/platform-runtime-bridge.contracts.js';
3
+ import { RabbitMQAdminConfig, RabbitMQDeleteUserResult, RabbitMQUserPermissionsInput, RabbitMQUserPermissionsResult } from './infra-manager.models.js';
4
+ /**
5
+ * RabbitMQ Connection Manager Service
6
+ * Manages RabbitMQ connections for different applications and platform services
7
+ */
8
+ export declare class RabbitMQConnectionManagerService {
9
+ private logger;
10
+ private connections;
11
+ private channels;
12
+ private adminClient;
13
+ protected logDebug: (message: string, context?: Record<string, unknown>) => void;
14
+ constructor(logger: PlatformRuntimeLogger);
15
+ /**
16
+ * Check if RabbitMQ admin client is initialized and ready to use
17
+ * @returns true if initializeAdmin() has been called successfully
18
+ */
19
+ isAdminInitialized(): boolean;
20
+ /**
21
+ * Initialize RabbitMQ admin client and verify connection with retry logic.
22
+ * Waits for RabbitMQ to be ready before returning.
23
+ * @param config - RabbitMQ admin configuration
24
+ * @param maxRetries - Maximum number of retry attempts (default: 10)
25
+ * @param retryDelayMs - Delay between retries in milliseconds (default: 3000)
26
+ * @throws Error if connection cannot be established after all retries
27
+ */
28
+ initializeAdmin(config: RabbitMQAdminConfig, maxRetries?: number, retryDelayMs?: number): Promise<void>;
29
+ private sleep;
30
+ upsertTenantUserPermissions(input: RabbitMQUserPermissionsInput): Promise<RabbitMQUserPermissionsResult>;
31
+ deleteUser(username: string): Promise<RabbitMQDeleteUserResult>;
32
+ /**
33
+ * Create a new RabbitMQ connection
34
+ */
35
+ createConnection(connectionName: string, amqpUrl: string, options?: amqp.Options.Connect): Promise<amqp.ChannelModel>;
36
+ /**
37
+ * Create a new channel for a connection
38
+ */
39
+ createChannel(connectionName: string, channelName?: string): Promise<amqp.Channel>;
40
+ /**
41
+ * Get an existing connection
42
+ */
43
+ getConnection(connectionName: string): amqp.ChannelModel | undefined;
44
+ /**
45
+ * Get an existing channel
46
+ */
47
+ getChannel(channelName: string): amqp.Channel | undefined;
48
+ /**
49
+ * Close a specific connection and its channels
50
+ */
51
+ closeConnection(connectionName: string): Promise<void>;
52
+ /**
53
+ * Close all connections and channels
54
+ */
55
+ closeAll(): Promise<void>;
56
+ /**
57
+ * Get connection status
58
+ */
59
+ getConnectionStatus(): {
60
+ connections: string[];
61
+ channels: string[];
62
+ };
63
+ }
64
+ //# sourceMappingURL=rabbitmq-manager.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rabbitmq-manager.service.d.ts","sourceRoot":"","sources":["../../../src/infra-managers/rabbitmq-manager.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAIhC,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AAEpJ;;;GAGG;AACH,qBACa,gCAAgC;IAOK,OAAO,CAAC,MAAM;IAN9D,OAAO,CAAC,WAAW,CAA6C;IAChE,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,WAAW,CAA8B;IACjD,SAAS,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBAGzB,MAAM,EAAE,qBAAqB;IAWrF;;;OAGG;IACI,kBAAkB,IAAI,OAAO;IAIpC;;;;;;;OAOG;IACU,eAAe,CAC1B,MAAM,EAAE,mBAAmB,EAC3B,UAAU,GAAE,MAAW,EACvB,YAAY,GAAE,MAAa,GAC1B,OAAO,CAAC,IAAI,CAAC;IAsChB,OAAO,CAAC,KAAK;IAIA,2BAA2B,CAAC,KAAK,EAAE,4BAA4B,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAwBxG,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAM5E;;OAEG;IACG,gBAAgB,CACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,GAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;IAoC7B;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;IA2CxF;;OAEG;IACH,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,SAAS;IAIpE;;OAEG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC,OAAO,GAAG,SAAS;IAIzD;;OAEG;IACG,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiC5D;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B/B;;OAEG;IACH,mBAAmB,IAAI;QAAE,WAAW,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE;CAMrE"}