@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
JavaScript
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
;