@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,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"}
|