@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,307 @@
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 { WildoHeaderKeys } from '@wildo-ai/saas-models';
15
+ import axios from 'axios';
16
+ import crypto from 'crypto';
17
+ import { PLATFORM_RUNTIME_BRIDGE_TYPES, } from '../runtime-bridge/platform-runtime-bridge.contracts.js';
18
+ /**
19
+ * MongoDB Atlas Manager Service
20
+ * Manages MongoDB Atlas clusters, databases, and users via Atlas API
21
+ */
22
+ let MongoAtlasManagerService = class MongoAtlasManagerService {
23
+ logger;
24
+ apiClient;
25
+ config = null;
26
+ logDebug;
27
+ constructor(logger) {
28
+ this.logger = logger;
29
+ this.logDebug = this.logger.debugByType('MongoAtlasManagerService');
30
+ this.logger.setDebugTypeLogging('MongoAtlasManagerService', true);
31
+ this.logDebug('MongoDB Atlas manager service initialized');
32
+ this.apiClient = axios.create({
33
+ timeout: 30000,
34
+ headers: {
35
+ [WildoHeaderKeys.CONTENT_TYPE]: 'application/json',
36
+ [WildoHeaderKeys.ACCEPT]: 'application/json'
37
+ }
38
+ });
39
+ }
40
+ /**
41
+ * Initialize Atlas API configuration
42
+ */
43
+ initialize(config) {
44
+ this.config = config;
45
+ // Atlas API uses HTTP Digest auth; we'll implement per-request digest
46
+ this.apiClient.defaults.baseURL = config.baseUrl;
47
+ this.logDebug('MongoDB Atlas API configured', {
48
+ baseUrl: config.baseUrl,
49
+ projectId: config.projectId,
50
+ hasCredentials: !!(config.publicKey && config.privateKey)
51
+ });
52
+ }
53
+ /**
54
+ * Check if Atlas API is configured and ready to use
55
+ * @returns true if initialize() has been called with valid config
56
+ */
57
+ isConfigured() {
58
+ return this.config !== null && !!this.config.publicKey && !!this.config.privateKey;
59
+ }
60
+ /**
61
+ * Get cluster information
62
+ */
63
+ async getCluster(clusterName) {
64
+ if (!this.config)
65
+ throw new Error('Atlas API not configured. Call initialize() first.');
66
+ this.logDebug('Getting MongoDB Atlas cluster info', { clusterName });
67
+ const data = await this.digestRequest('GET', `/groups/${this.config.projectId}/clusters/${encodeURIComponent(clusterName)}`);
68
+ return data;
69
+ }
70
+ /**
71
+ * List clusters in the Atlas project
72
+ */
73
+ async listClusters() {
74
+ if (!this.config)
75
+ throw new Error('Atlas API not configured. Call initialize() first.');
76
+ this.logDebug('Listing MongoDB Atlas clusters');
77
+ const data = await this.digestRequest('GET', `/groups/${this.config.projectId}/clusters`);
78
+ return (data?.results || []);
79
+ }
80
+ /**
81
+ * Create a database-scoped user with readWrite role on a specific database
82
+ */
83
+ async createDatabaseUser(input) {
84
+ if (!this.config)
85
+ throw new Error('Atlas API not configured. Call initialize() first.');
86
+ const payload = {
87
+ databaseName: 'admin',
88
+ username: input.username,
89
+ password: input.password,
90
+ roles: [
91
+ {
92
+ roleName: 'readWrite',
93
+ databaseName: input.databaseName,
94
+ },
95
+ ],
96
+ scopes: [
97
+ {
98
+ name: input.clusterName,
99
+ type: 'CLUSTER',
100
+ },
101
+ ],
102
+ };
103
+ this.logDebug('Creating Atlas DB user', { username: input.username, db: input.databaseName, cluster: input.clusterName });
104
+ try {
105
+ const response = await this.digestRequest('POST', `/groups/${this.config.projectId}/databaseUsers`, payload);
106
+ // Ensure roles/scopes are set as expected (idempotent)
107
+ await this.ensureUserRoleOnDb(input.username, input.databaseName, input.clusterName);
108
+ return response;
109
+ }
110
+ catch (e) {
111
+ // If user already exists or POST fails, try to update (idempotent behavior)
112
+ this.logDebug('Create user failed, attempting to update existing Atlas DB user', { username: input.username });
113
+ const updatePath = `/groups/${this.config.projectId}/databaseUsers/admin/${encodeURIComponent(input.username)}`;
114
+ const updatePayload = {
115
+ roles: payload.roles,
116
+ scopes: payload.scopes,
117
+ // password is optional on update; include only if provided in input
118
+ ...(input.password ? { password: input.password } : {})
119
+ };
120
+ const patched = await this.digestRequest('PATCH', updatePath, updatePayload);
121
+ // Ensure roles/scopes are set as expected (idempotent)
122
+ await this.ensureUserRoleOnDb(input.username, input.databaseName, input.clusterName);
123
+ return patched;
124
+ }
125
+ }
126
+ async ensureUserRoleOnDb(username, databaseName, clusterName) {
127
+ if (!this.config)
128
+ throw new Error('Atlas API not configured. Call initialize() first.');
129
+ const path = `/groups/${this.config.projectId}/databaseUsers/admin/${encodeURIComponent(username)}`;
130
+ const user = await this.digestRequest('GET', path);
131
+ const hasRole = Array.isArray(user?.roles) && user.roles.some((r) => r?.roleName === 'readWrite' && r?.databaseName === databaseName);
132
+ const hasScope = Array.isArray(user?.scopes) && user.scopes.some((s) => s?.type === 'CLUSTER' && s?.name === clusterName);
133
+ if (!hasRole || !hasScope) {
134
+ const updatePayload = {
135
+ roles: [{ roleName: 'readWrite', databaseName }],
136
+ scopes: [{ name: clusterName, type: 'CLUSTER' }]
137
+ };
138
+ await this.digestRequest('PATCH', path, updatePayload);
139
+ }
140
+ }
141
+ /**
142
+ * Delete a database user
143
+ */
144
+ async deleteDatabaseUser(username) {
145
+ if (!this.config)
146
+ throw new Error('Atlas API not configured. Call initialize() first.');
147
+ this.logDebug('Deleting Atlas DB user', { username });
148
+ await this.digestRequest('DELETE', `/groups/${this.config.projectId}/databaseUsers/admin/${encodeURIComponent(username)}`);
149
+ }
150
+ /**
151
+ * Get connection string for a cluster
152
+ */
153
+ async getConnectionString(input) {
154
+ const cluster = await this.getCluster(input.clusterName);
155
+ if (input.type === 'standard') {
156
+ const conn = cluster.mongoURI || cluster.mongoURIWithOptions;
157
+ if (!conn)
158
+ throw new Error('Standard connection string not available');
159
+ return { connectionString: conn };
160
+ }
161
+ const conn = cluster.srvAddress || cluster.mongoURIWithOptions;
162
+ if (!conn)
163
+ throw new Error('SRV connection string not available');
164
+ return { connectionString: conn };
165
+ }
166
+ /**
167
+ * Check cluster status
168
+ */
169
+ async getClusterStatus(clusterName) {
170
+ try {
171
+ const cluster = await this.getCluster(clusterName);
172
+ const state = cluster.stateName;
173
+ const healthy = state === 'IDLE' || state === 'UPDATING' || state === 'CREATING';
174
+ return { state, healthy };
175
+ }
176
+ catch (error) {
177
+ this.logger.error('Failed to check MongoDB Atlas cluster status:', {
178
+ clusterName,
179
+ error: error instanceof Error ? error.message : 'Unknown error',
180
+ });
181
+ return { state: 'UNKNOWN', healthy: false };
182
+ }
183
+ }
184
+ /**
185
+ * High-level helper: create per-application database user and return connection string
186
+ * Atlas does not require an explicit DB create; creating a collection or inserting first document creates it.
187
+ * Here we only create the user scoped to the cluster and database.
188
+ */
189
+ async createApplicationDatabase(input) {
190
+ await this.createDatabaseUser({
191
+ clusterName: input.clusterName,
192
+ databaseName: input.databaseName,
193
+ username: input.username,
194
+ password: input.password,
195
+ });
196
+ const { connectionString } = await this.getConnectionString({ clusterName: input.clusterName, type: 'srv' });
197
+ // Ensure the returned SRV URI targets the intended database (avoid defaulting to 'test')
198
+ let connectionStringWithDb = connectionString;
199
+ if (!/mongodb\+srv:\/\/[^/]+\/.+/.test(connectionString)) {
200
+ connectionStringWithDb = connectionString.includes('?')
201
+ ? connectionString.replace('?', `/${encodeURIComponent(input.databaseName)}?`)
202
+ : `${connectionString}/${encodeURIComponent(input.databaseName)}`;
203
+ }
204
+ // Inject credentials (username:password) and ensure authSource=admin
205
+ let credentialed = connectionStringWithDb;
206
+ if (!/^mongodb\+srv:\/\/[^@]+@/i.test(credentialed)) {
207
+ credentialed = credentialed.replace(/^mongodb\+srv:\/\//i, `mongodb+srv://${encodeURIComponent(input.username)}:${encodeURIComponent(input.password)}@`);
208
+ }
209
+ if (!/[?&]authSource=/.test(credentialed)) {
210
+ credentialed += credentialed.includes('?') ? '&authSource=admin' : '?authSource=admin';
211
+ }
212
+ return {
213
+ databaseName: input.databaseName,
214
+ username: input.username,
215
+ connectionString: credentialed,
216
+ };
217
+ }
218
+ };
219
+ MongoAtlasManagerService = __decorate([
220
+ injectable(),
221
+ __param(0, inject(PLATFORM_RUNTIME_BRIDGE_TYPES.Logger)),
222
+ __metadata("design:paramtypes", [Object])
223
+ ], MongoAtlasManagerService);
224
+ export { MongoAtlasManagerService };
225
+ // =============================
226
+ // HTTP Digest helper methods
227
+ // =============================
228
+ function md5Hex(value) {
229
+ return crypto.createHash('md5').update(value).digest('hex');
230
+ }
231
+ function parseDigestChallenge(header) {
232
+ // header format: Digest realm="...", nonce="...", qop="auth", opaque="..."
233
+ const challenge = { realm: '', nonce: '' };
234
+ const parts = header.replace(/^Digest\s+/i, '').split(/,\s*/);
235
+ for (const part of parts) {
236
+ const [k, v] = part.split('=');
237
+ const val = v?.replace(/^"|"$/g, '') || '';
238
+ if (k === 'realm')
239
+ challenge.realm = val;
240
+ if (k === 'nonce')
241
+ challenge.nonce = val;
242
+ if (k === 'qop')
243
+ challenge.qop = val;
244
+ if (k === 'opaque')
245
+ challenge.opaque = val;
246
+ if (k === 'algorithm')
247
+ challenge.algorithm = val;
248
+ }
249
+ if (!challenge.realm || !challenge.nonce)
250
+ return null;
251
+ return challenge;
252
+ }
253
+ function buildDigestHeader({ method, uri, username, password, challenge, cnonce, nc }) {
254
+ const ha1 = md5Hex(`${username}:${challenge.realm}:${password}`);
255
+ const ha2 = md5Hex(`${method}:${uri}`);
256
+ const response = md5Hex(`${ha1}:${challenge.nonce}:${nc}:${cnonce}:${challenge.qop || 'auth'}:${ha2}`);
257
+ const hdr = [
258
+ `Digest username="${username}"`,
259
+ `realm="${challenge.realm}"`,
260
+ `nonce="${challenge.nonce}"`,
261
+ `uri="${uri}"`,
262
+ `qop=${challenge.qop || 'auth'}`,
263
+ `nc=${nc}`,
264
+ `cnonce="${cnonce}"`,
265
+ `response="${response}"`,
266
+ ];
267
+ if (challenge.opaque)
268
+ hdr.push(`opaque="${challenge.opaque}"`);
269
+ if (challenge.algorithm)
270
+ hdr.push(`algorithm=${challenge.algorithm}`);
271
+ return hdr.join(', ');
272
+ }
273
+ MongoAtlasManagerService.prototype.digestRequest = async function (method, path, body) {
274
+ if (!this.config)
275
+ throw new Error('Atlas API not configured. Call initialize() first.');
276
+ // 1) Probe request to get challenge
277
+ const probe = await this.apiClient.request({ method, url: path, data: body, validateStatus: () => true });
278
+ const www = probe.headers[WildoHeaderKeys.WWW_AUTHENTICATE];
279
+ const challenge = www ? parseDigestChallenge(www) : null;
280
+ if (!challenge) {
281
+ if (probe.status >= 200 && probe.status < 300)
282
+ return probe.data;
283
+ throw new Error(`Atlas auth challenge not received: status ${probe.status}`);
284
+ }
285
+ // 2) Build digest header
286
+ const cnonce = crypto.randomBytes(8).toString('hex');
287
+ const nc = '00000001';
288
+ const authHeader = buildDigestHeader({
289
+ method,
290
+ uri: path,
291
+ username: this.config.publicKey,
292
+ password: this.config.privateKey,
293
+ challenge,
294
+ cnonce,
295
+ nc,
296
+ });
297
+ const resp = await this.apiClient.request({
298
+ method,
299
+ url: path,
300
+ data: body,
301
+ headers: { Authorization: authHeader }
302
+ });
303
+ if (resp.status >= 200 && resp.status < 300)
304
+ return resp.data;
305
+ throw new Error(`Atlas request failed: status ${resp.status}`);
306
+ };
307
+ //# sourceMappingURL=mongo-atlas-manager.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongo-atlas-manager.service.js","sourceRoot":"","sources":["../../../src/infra-managers/mongo-atlas-manager.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ import { type PlatformRuntimeLogger } from '../runtime-bridge/platform-runtime-bridge.contracts.js';
2
+ import { PostgreSQLAdminConfig, PostgreSQLCreateDatabaseInput, PostgreSQLCreateDatabaseResult, PostgreSQLDeleteDatabaseInput, PostgreSQLDeleteDatabaseResult } from './infra-manager.models.js';
3
+ /**
4
+ * PostgreSQL Connection Manager Service
5
+ *
6
+ * Manages PostgreSQL connections and database provisioning for applications.
7
+ * Used by the PlatformInfrastructureManagerService to create databases for
8
+ * applications that opt into PostgreSQL as their persistence adapter.
9
+ *
10
+ * Key Features:
11
+ * - Admin connection management with retry logic
12
+ * - Database creation (CREATE DATABASE, CREATE USER, GRANT)
13
+ * - Database deletion (terminate connections, DROP DATABASE/USER)
14
+ * - Idempotent operations (safe to call multiple times)
15
+ * - URL-encoded password handling for special characters
16
+ *
17
+ * @see DATABASE_AGNOSTIC_REPOSITORY_ANALYSIS.md Section 19.2
18
+ */
19
+ export declare class PostgreSQLConnectionManagerService {
20
+ private logger;
21
+ private adminPool;
22
+ private adminConfig;
23
+ protected logDebug: (message: string, context?: Record<string, unknown>) => void;
24
+ constructor(logger: PlatformRuntimeLogger);
25
+ /**
26
+ * Check if PostgreSQL admin is initialized and ready to use
27
+ * @returns true if initializeAdmin() has been called successfully
28
+ */
29
+ isAdminInitialized(): boolean;
30
+ /**
31
+ * Initialize PostgreSQL admin connection with retry logic.
32
+ * Waits for PostgreSQL to be ready before returning.
33
+ *
34
+ * @param config - PostgreSQL admin configuration
35
+ * @param maxRetries - Maximum number of retry attempts (default: 10)
36
+ * @param retryDelayMs - Delay between retries in milliseconds (default: 3000)
37
+ * @throws Error if connection cannot be established after all retries
38
+ */
39
+ initializeAdmin(config: PostgreSQLAdminConfig, maxRetries?: number, retryDelayMs?: number): Promise<void>;
40
+ private sleep;
41
+ /**
42
+ * Create a new application database with dedicated user.
43
+ *
44
+ * Operations performed:
45
+ * 1. CREATE USER with LOGIN privilege
46
+ * 2. CREATE DATABASE owned by user
47
+ * 3. GRANT all privileges on database to user
48
+ *
49
+ * This operation is idempotent - if database/user already exist,
50
+ * it will verify ownership and update password if needed.
51
+ *
52
+ * @param input - Database creation parameters
53
+ * @returns Result including connection URL
54
+ */
55
+ createApplicationDatabase(input: PostgreSQLCreateDatabaseInput): Promise<PostgreSQLCreateDatabaseResult>;
56
+ /**
57
+ * Delete an application database and its user.
58
+ *
59
+ * Operations performed:
60
+ * 1. Terminate all connections to the database
61
+ * 2. DROP DATABASE
62
+ * 3. DROP USER
63
+ *
64
+ * This operation is idempotent - if database/user don't exist,
65
+ * it will return successfully.
66
+ *
67
+ * @param input - Database deletion parameters
68
+ * @returns Result indicating what was deleted
69
+ */
70
+ deleteApplicationDatabase(input: PostgreSQLDeleteDatabaseInput): Promise<PostgreSQLDeleteDatabaseResult>;
71
+ /**
72
+ * Run Prisma migrations on a database.
73
+ *
74
+ * This spawns a child process to run `npx prisma migrate deploy`
75
+ * with the provided connection URL and schema path.
76
+ *
77
+ * @param connectionUrl - PostgreSQL connection URL
78
+ * @param schemaPath - Path to Prisma schema file
79
+ * @returns Promise that resolves when migrations complete
80
+ */
81
+ runMigrations(connectionUrl: string, schemaPath: string): Promise<{
82
+ success: boolean;
83
+ output: string;
84
+ }>;
85
+ /**
86
+ * Check if a database exists
87
+ */
88
+ private databaseExists;
89
+ /**
90
+ * Check if a user exists
91
+ */
92
+ private userExists;
93
+ /**
94
+ * Validate a SQL identifier to prevent injection
95
+ * Only allows alphanumeric characters and underscores
96
+ */
97
+ private validateIdentifier;
98
+ /**
99
+ * Quote an identifier for safe use in SQL
100
+ * This is a simple implementation - pg library handles most escaping
101
+ */
102
+ private quoteIdentifier;
103
+ /**
104
+ * Get the current health status of the admin connection
105
+ */
106
+ getAdminHealth(): Promise<{
107
+ status: 'connected' | 'disconnected';
108
+ latency?: number;
109
+ }>;
110
+ /**
111
+ * Close the admin connection pool
112
+ */
113
+ closeAdmin(): Promise<void>;
114
+ }
115
+ //# sourceMappingURL=postgresql-manager.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql-manager.service.d.ts","sourceRoot":"","sources":["../../../src/infra-managers/postgresql-manager.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,qBAAqB,EACrB,6BAA6B,EAC7B,8BAA8B,EAC9B,6BAA6B,EAC7B,8BAA8B,EAC/B,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;;;;GAeG;AACH,qBACa,kCAAkC;IAMG,OAAO,CAAC,MAAM;IAL9D,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,WAAW,CAAsC;IACzD,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;;;;;;;;OAQG;IACU,eAAe,CAC1B,MAAM,EAAE,qBAAqB,EAC7B,UAAU,GAAE,MAAW,EACvB,YAAY,GAAE,MAAa,GAC1B,OAAO,CAAC,IAAI,CAAC;IAkEhB,OAAO,CAAC,KAAK;IAQb;;;;;;;;;;;;;OAaG;IACU,yBAAyB,CACpC,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,8BAA8B,CAAC;IAqE1C;;;;;;;;;;;;;OAaG;IACU,yBAAyB,CACpC,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,8BAA8B,CAAC;IAiE1C;;;;;;;;;OASG;IACU,aAAa,CACxB,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAkDhD;;OAEG;YACW,cAAc;IAQ5B;;OAEG;YACW,UAAU;IAQxB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAS1B;;;OAGG;IACH,OAAO,CAAC,eAAe;IASvB;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,GAAG,cAAc,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBlG;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAQzC"}