UNPKG

@nestjs-mod/docker-compose

Version:

Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. (Generator docker-compose.yml for https://docs.docker.com/compose)

132 lines 7.71 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DockerComposePostgresDatabaseService = void 0; const tslib_1 = require("tslib"); const common_1 = require("@nestjs-mod/common"); const common_2 = require("@nestjs/common"); const connection_string_1 = require("connection-string"); const docker_compose_utils_1 = require("../../docker-compose.utils"); const manual_docker_compose_service_1 = require("../../manual-docker-compose.service"); const docker_compose_postgresql_decorators_1 = require("./docker-compose-postgresql.decorators"); const docker_compose_postgresql_service_1 = require("./docker-compose-postgresql.service"); const docker_compose_postgresql_settings_1 = require("./docker-compose-postgresql.settings"); let DockerComposePostgresDatabaseService = class DockerComposePostgresDatabaseService { constructor(dockerComposePostgresService, manualDockerComposeFeatures, dockerComposePostgresConfiguration, dockerComposePostgresFeatureConfigurations, moduleSettings, wrapApplicationOptionsService, nxProjectJsonService, packageJsonService) { this.dockerComposePostgresService = dockerComposePostgresService; this.manualDockerComposeFeatures = manualDockerComposeFeatures; this.dockerComposePostgresConfiguration = dockerComposePostgresConfiguration; this.dockerComposePostgresFeatureConfigurations = dockerComposePostgresFeatureConfigurations; this.moduleSettings = moduleSettings; this.wrapApplicationOptionsService = wrapApplicationOptionsService; this.nxProjectJsonService = nxProjectJsonService; this.packageJsonService = packageJsonService; } onModuleInit() { if (!this.wrapApplicationOptionsService) { return; } this.addManualDockerComposeFeatureConfiguration(); this.updateNxProjectFile(); this.updatePackageJsonFile(); } updateNxProjectFile() { const { featureDatabaseUrlEnvKeys, rootDatabaseUrlEnvKey } = this.getEnvKeys(); for (let index = 0; index < featureDatabaseUrlEnvKeys.length; index++) { const featureDatabaseUrlEnvKey = featureDatabaseUrlEnvKeys[index]; this.nxProjectJsonService.addRunCommands(featureDatabaseUrlEnvKey.databaseUrlEnvKeys .map((databaseUrlEnvKey) => `./node_modules/.bin/pg-create-db --force-change-username=true --force-change-password=true --root-database-url=\${${rootDatabaseUrlEnvKey}} --app-database-url=\${${databaseUrlEnvKey}}`) .flat(), 'db-create', undefined, featureDatabaseUrlEnvKey.configuration?.nxProjectJsonFile); } this.nxProjectJsonService.addRunCommands(featureDatabaseUrlEnvKeys .filter((k) => !k.configuration) .map((featureDatabaseUrlEnvKey) => featureDatabaseUrlEnvKey.databaseUrlEnvKeys.map((databaseUrlEnvKey) => `./node_modules/.bin/pg-create-db --force-change-username=true --force-change-password=true --root-database-url=\${${rootDatabaseUrlEnvKey}} --app-database-url=\${${databaseUrlEnvKey}}`)) .flat(), 'db-create', undefined, this.dockerComposePostgresConfiguration.nxProjectJsonFile); } addManualDockerComposeFeatureConfiguration() { const serviceName = (0, docker_compose_utils_1.getDockerComposeServiceName)(this.wrapApplicationOptionsService.project?.name, docker_compose_utils_1.DockerComposeServiceType.PostgreSQL); const root = this.parseDatabaseUrl(this.dockerComposePostgresService.getDockerComposePostgresEnvironments().rootDatabaseUrl); this.manualDockerComposeFeatures.addManualDockerComposeFeatureConfiguration({ services: { [serviceName]: { environment: { POSTGRESQL_USERNAME: root.USERNAME || '', POSTGRESQL_PASSWORD: root.PASSWORD || '', POSTGRESQL_DATABASE: root.DATABASE || '', }, }, }, }); } updatePackageJsonFile() { const packageJson = this.packageJsonService.read(); if (packageJson) { this.packageJsonService.addScripts('db', { 'db:create': { commands: ['./node_modules/.bin/nx run-many -t=db-create'], comments: [`Creation all databases of applications and modules`], }, }, packageJson); if (!packageJson.devDependencies) { packageJson.devDependencies = {}; } if (!packageJson.devDependencies['pg-create-db'] && !packageJson.dependencies?.['pg-create-db']) { packageJson.devDependencies['pg-create-db'] = '^1.1.5'; } this.packageJsonService.write(packageJson); } } getEnvKeys() { const rootDatabaseUrlEnvKey = this.moduleSettings.staticEnvironments?.validations['rootDatabaseUrl']?.propertyNameFormatters .filter((f) => f.name === 'dotenv') .map((f) => f.value) .flat()[0]; const featureDatabaseUrlEnvKeys = Object.entries(this.moduleSettings.featureModuleEnvironments ?? {}).map(([featureModuleName, moduleSettingsList]) => { return { featureModuleName, configuration: this.dockerComposePostgresFeatureConfigurations.find((c) => c.featureModuleName === featureModuleName) ?.featureConfiguration || undefined, databaseUrlEnvKeys: moduleSettingsList .map((moduleSettings) => moduleSettings?.validations['databaseUrl']?.propertyNameFormatters .filter((f) => f.name === 'dotenv') .map((f) => f.value) .flat()) .flat(), }; }); return { featureDatabaseUrlEnvKeys, rootDatabaseUrlEnvKey }; } parseDatabaseUrl(databaseUrl) { if (!databaseUrl) { return {}; } try { const cs = new connection_string_1.ConnectionString(databaseUrl); const USERNAME = cs.user; const PASSWORD = cs.password; const PORT = cs.port; const HOST = cs.hosts && cs.hosts[0].toString(); const DATABASE = cs.path && cs.path[0]; const SCHEMA = cs.params && cs.params['schema']; const SCHEMAS = cs.params && cs.params['schemas']; return { USERNAME, PASSWORD, HOST, DATABASE, SCHEMA, SCHEMAS, PORT, PROTOCOL: cs.protocol }; } catch (error) { return {}; } } }; exports.DockerComposePostgresDatabaseService = DockerComposePostgresDatabaseService; exports.DockerComposePostgresDatabaseService = DockerComposePostgresDatabaseService = tslib_1.__decorate([ (0, common_2.Injectable)(), tslib_1.__param(3, (0, docker_compose_postgresql_decorators_1.InjectDockerComposePostgresFeatures)()), tslib_1.__param(4, (0, docker_compose_postgresql_decorators_1.InjectDockerComposePostgresModuleSettings)()), tslib_1.__param(5, (0, common_2.Optional)()), tslib_1.__param(6, (0, common_2.Optional)()), tslib_1.__param(7, (0, common_2.Optional)()), tslib_1.__metadata("design:paramtypes", [docker_compose_postgresql_service_1.DockerComposePostgresService, manual_docker_compose_service_1.ManualDockerComposeFeatures, docker_compose_postgresql_settings_1.DockerComposePostgresConfiguration, Array, Object, common_1.WrapApplicationOptionsService, common_1.NxProjectJsonService, common_1.PackageJsonService]) ], DockerComposePostgresDatabaseService); //# sourceMappingURL=docker-compose-postgresql-database.service.js.map