@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.
- package/dist/esm/bootstrap/application-backend-env.contracts.d.ts +2 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.js +2 -0
- package/dist/esm/bootstrap/application-backend-env.contracts.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap-planner.d.ts +20 -0
- package/dist/esm/bootstrap/bootstrap-planner.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap-planner.js +26 -0
- package/dist/esm/bootstrap/bootstrap-planner.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap.contracts.d.ts +120 -0
- package/dist/esm/bootstrap/bootstrap.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap.contracts.js +117 -0
- package/dist/esm/bootstrap/bootstrap.contracts.js.map +1 -0
- package/dist/esm/bootstrap/bootstrap.schemas.d.ts +485 -0
- package/dist/esm/bootstrap/bootstrap.schemas.d.ts.map +1 -0
- package/dist/esm/bootstrap/bootstrap.schemas.js +130 -0
- package/dist/esm/bootstrap/bootstrap.schemas.js.map +1 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts +78 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.js +98 -0
- package/dist/esm/bootstrap/platform-runtime-env.contracts.js.map +1 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.d.ts +17 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.d.ts.map +1 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.js +60 -0
- package/dist/esm/bootstrap/runtime-topology.contracts.js.map +1 -0
- package/dist/esm/credentials/credential-generator.service.d.ts +11 -0
- package/dist/esm/credentials/credential-generator.service.d.ts.map +1 -0
- package/dist/esm/credentials/credential-generator.service.js +31 -0
- package/dist/esm/credentials/credential-generator.service.js.map +1 -0
- package/dist/esm/credentials/credentials-provisioner.service.d.ts +190 -0
- package/dist/esm/credentials/credentials-provisioner.service.d.ts.map +1 -0
- package/dist/esm/credentials/credentials-provisioner.service.js +278 -0
- package/dist/esm/credentials/credentials-provisioner.service.js.map +1 -0
- package/dist/esm/index.d.ts +16 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +16 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/infra-managers/infra-manager.models.d.ts +146 -0
- package/dist/esm/infra-managers/infra-manager.models.d.ts.map +1 -0
- package/dist/esm/infra-managers/infra-manager.models.js +2 -0
- package/dist/esm/infra-managers/infra-manager.models.js.map +1 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts +64 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.js +307 -0
- package/dist/esm/infra-managers/mongo-atlas-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/postgresql-manager.service.d.ts +115 -0
- package/dist/esm/infra-managers/postgresql-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/postgresql-manager.service.js +403 -0
- package/dist/esm/infra-managers/postgresql-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts +64 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.js +288 -0
- package/dist/esm/infra-managers/rabbitmq-manager.service.js.map +1 -0
- package/dist/esm/infra-managers/redis-manager.service.d.ts +78 -0
- package/dist/esm/infra-managers/redis-manager.service.d.ts.map +1 -0
- package/dist/esm/infra-managers/redis-manager.service.js +326 -0
- package/dist/esm/infra-managers/redis-manager.service.js.map +1 -0
- package/dist/esm/project-config/define-framework-config.d.ts +36 -0
- package/dist/esm/project-config/define-framework-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-framework-config.js +30 -0
- package/dist/esm/project-config/define-framework-config.js.map +1 -0
- package/dist/esm/project-config/define-infra-config.d.ts +128 -0
- package/dist/esm/project-config/define-infra-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-infra-config.js +87 -0
- package/dist/esm/project-config/define-infra-config.js.map +1 -0
- package/dist/esm/project-config/define-minion-config.d.ts +41 -0
- package/dist/esm/project-config/define-minion-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-minion-config.js +24 -0
- package/dist/esm/project-config/define-minion-config.js.map +1 -0
- package/dist/esm/project-config/define-platform-config.d.ts +65 -0
- package/dist/esm/project-config/define-platform-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-platform-config.js +22 -0
- package/dist/esm/project-config/define-platform-config.js.map +1 -0
- package/dist/esm/project-config/define-platform-env-config.d.ts +41 -0
- package/dist/esm/project-config/define-platform-env-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-platform-env-config.js +45 -0
- package/dist/esm/project-config/define-platform-env-config.js.map +1 -0
- package/dist/esm/project-config/define-project-config.d.ts +38 -0
- package/dist/esm/project-config/define-project-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-project-config.js +57 -0
- package/dist/esm/project-config/define-project-config.js.map +1 -0
- package/dist/esm/project-config/define-saas-config.d.ts +252 -0
- package/dist/esm/project-config/define-saas-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-saas-config.js +137 -0
- package/dist/esm/project-config/define-saas-config.js.map +1 -0
- package/dist/esm/project-config/define-sharing-policy.d.ts +35 -0
- package/dist/esm/project-config/define-sharing-policy.d.ts.map +1 -0
- package/dist/esm/project-config/define-sharing-policy.js +30 -0
- package/dist/esm/project-config/define-sharing-policy.js.map +1 -0
- package/dist/esm/project-config/define-worker-config.d.ts +42 -0
- package/dist/esm/project-config/define-worker-config.d.ts.map +1 -0
- package/dist/esm/project-config/define-worker-config.js +24 -0
- package/dist/esm/project-config/define-worker-config.js.map +1 -0
- package/dist/esm/project-config/index.d.ts +22 -0
- package/dist/esm/project-config/index.d.ts.map +1 -0
- package/dist/esm/project-config/index.js +22 -0
- package/dist/esm/project-config/index.js.map +1 -0
- package/dist/esm/project-config/loader.d.ts +42 -0
- package/dist/esm/project-config/loader.d.ts.map +1 -0
- package/dist/esm/project-config/loader.js +164 -0
- package/dist/esm/project-config/loader.js.map +1 -0
- package/dist/esm/project-config/shared/application-modules.schemas.d.ts +10 -0
- package/dist/esm/project-config/shared/application-modules.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/application-modules.schemas.js +6 -0
- package/dist/esm/project-config/shared/application-modules.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/application-modules.utils.d.ts +6 -0
- package/dist/esm/project-config/shared/application-modules.utils.d.ts.map +1 -0
- package/dist/esm/project-config/shared/application-modules.utils.js +26 -0
- package/dist/esm/project-config/shared/application-modules.utils.js.map +1 -0
- package/dist/esm/project-config/shared/backing-services.schemas.d.ts +68 -0
- package/dist/esm/project-config/shared/backing-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/backing-services.schemas.js +49 -0
- package/dist/esm/project-config/shared/backing-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/data-services.schemas.d.ts +33 -0
- package/dist/esm/project-config/shared/data-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/data-services.schemas.js +47 -0
- package/dist/esm/project-config/shared/data-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/env-example-defaults.d.ts +27 -0
- package/dist/esm/project-config/shared/env-example-defaults.d.ts.map +1 -0
- package/dist/esm/project-config/shared/env-example-defaults.js +30 -0
- package/dist/esm/project-config/shared/env-example-defaults.js.map +1 -0
- package/dist/esm/project-config/shared/environment.schemas.d.ts +106 -0
- package/dist/esm/project-config/shared/environment.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/environment.schemas.js +111 -0
- package/dist/esm/project-config/shared/environment.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts +42 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js +42 -0
- package/dist/esm/project-config/shared/infrastructure-defaults.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/k8s-utils.d.ts +36 -0
- package/dist/esm/project-config/shared/k8s-utils.d.ts.map +1 -0
- package/dist/esm/project-config/shared/k8s-utils.js +50 -0
- package/dist/esm/project-config/shared/k8s-utils.js.map +1 -0
- package/dist/esm/project-config/shared/platform-services.schemas.d.ts +30 -0
- package/dist/esm/project-config/shared/platform-services.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/platform-services.schemas.js +27 -0
- package/dist/esm/project-config/shared/platform-services.schemas.js.map +1 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.d.ts +42 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.d.ts.map +1 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.js +29 -0
- package/dist/esm/project-config/shared/service-definitions.schemas.js.map +1 -0
- package/dist/esm/project-config/sharing-policy-validation.d.ts +40 -0
- package/dist/esm/project-config/sharing-policy-validation.d.ts.map +1 -0
- package/dist/esm/project-config/sharing-policy-validation.js +143 -0
- package/dist/esm/project-config/sharing-policy-validation.js.map +1 -0
- package/dist/esm/release/framework-release.constants.d.ts +3 -0
- package/dist/esm/release/framework-release.constants.d.ts.map +1 -0
- package/dist/esm/release/framework-release.constants.js +3 -0
- package/dist/esm/release/framework-release.constants.js.map +1 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts +23 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.d.ts.map +1 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js +13 -0
- package/dist/esm/runtime-bridge/platform-runtime-bridge.contracts.js.map +1 -0
- package/dist/esm/schemas/framework-info.schemas.d.ts +8 -0
- package/dist/esm/schemas/framework-info.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/framework-info.schemas.js +8 -0
- package/dist/esm/schemas/framework-info.schemas.js.map +1 -0
- package/dist/esm/schemas/framework-secrets.schemas.d.ts +22 -0
- package/dist/esm/schemas/framework-secrets.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/framework-secrets.schemas.js +14 -0
- package/dist/esm/schemas/framework-secrets.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-application-config.schemas.d.ts +20 -0
- package/dist/esm/schemas/platform-application-config.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-application-config.schemas.js +19 -0
- package/dist/esm/schemas/platform-application-config.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.d.ts +54 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.js +67 -0
- package/dist/esm/schemas/platform-application-secrets.schemas.js.map +1 -0
- package/dist/esm/schemas/platform-config.schemas.d.ts +66 -0
- package/dist/esm/schemas/platform-config.schemas.d.ts.map +1 -0
- package/dist/esm/schemas/platform-config.schemas.js +28 -0
- package/dist/esm/schemas/platform-config.schemas.js.map +1 -0
- package/dist/esm/workspace-scope/index.d.ts +3 -0
- package/dist/esm/workspace-scope/index.d.ts.map +1 -0
- package/dist/esm/workspace-scope/index.js +3 -0
- package/dist/esm/workspace-scope/index.js.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.d.ts +15 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.d.ts.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.js +87 -0
- package/dist/esm/workspace-scope/workspace-scope-detector.js.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts +118 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.d.ts.map +1 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.js +157 -0
- package/dist/esm/workspace-scope/workspace-scope.schemas.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/package.json +52 -0
- package/src/bootstrap/application-backend-env.contracts.ts +17 -0
- package/src/bootstrap/bootstrap-planner.ts +46 -0
- package/src/bootstrap/bootstrap.contracts.ts +251 -0
- package/src/bootstrap/bootstrap.schemas.ts +164 -0
- package/src/bootstrap/platform-runtime-env.contracts.ts +99 -0
- package/src/bootstrap/runtime-topology.contracts.ts +102 -0
- package/src/credentials/credential-generator.service.ts +39 -0
- package/src/index.ts +16 -0
- package/src/project-config/__tests__/application-modules.utils.test.ts +53 -0
- package/src/project-config/__tests__/define-framework-config.test.ts +43 -0
- package/src/project-config/__tests__/define-saas-config.test.ts +210 -0
- package/src/project-config/__tests__/loader.test.ts +100 -0
- package/src/project-config/define-framework-config.ts +44 -0
- package/src/project-config/define-infra-config.ts +168 -0
- package/src/project-config/define-minion-config.ts +27 -0
- package/src/project-config/define-platform-config.ts +28 -0
- package/src/project-config/define-platform-env-config.ts +59 -0
- package/src/project-config/define-project-config.ts +63 -0
- package/src/project-config/define-saas-config.ts +171 -0
- package/src/project-config/define-sharing-policy.ts +36 -0
- package/src/project-config/define-worker-config.ts +27 -0
- package/src/project-config/index.ts +23 -0
- package/src/project-config/loader.ts +220 -0
- package/src/project-config/shared/application-modules.schemas.ts +12 -0
- package/src/project-config/shared/application-modules.utils.ts +65 -0
- package/src/project-config/shared/backing-services.schemas.ts +59 -0
- package/src/project-config/shared/data-services.schemas.ts +58 -0
- package/src/project-config/shared/env-example-defaults.ts +50 -0
- package/src/project-config/shared/environment.schemas.ts +136 -0
- package/src/project-config/shared/infrastructure-defaults.schemas.ts +47 -0
- package/src/project-config/shared/k8s-utils.ts +56 -0
- package/src/project-config/shared/platform-services.schemas.ts +33 -0
- package/src/project-config/shared/service-definitions.schemas.ts +38 -0
- package/src/project-config/sharing-policy-validation.ts +159 -0
- package/src/release/framework-release.constants.ts +2 -0
- package/src/schemas/__tests__/platform-config.schemas.test.ts +90 -0
- package/src/schemas/framework-info.schemas.ts +13 -0
- package/src/schemas/framework-secrets.schemas.ts +19 -0
- package/src/schemas/platform-application-config.schemas.ts +25 -0
- package/src/schemas/platform-application-secrets.schemas.ts +78 -0
- package/src/schemas/platform-config.schemas.ts +45 -0
- package/src/workspace-scope/index.ts +2 -0
- package/src/workspace-scope/workspace-scope-detector.ts +98 -0
- 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"}
|