UNPKG

database-backup

Version:

A NestJS dynamic module for backing up PostgreSQL databases using pg_dump.

91 lines 4.16 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var BackupService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.BackupService = void 0; const common_1 = require("@nestjs/common"); const child_process_1 = require("child_process"); const events_1 = require("events"); const path = require("path"); const pg_1 = require("pg"); let BackupService = BackupService_1 = class BackupService { backupConfig; logger = new common_1.Logger(BackupService_1.name); constructor(backupConfig) { this.backupConfig = backupConfig; } async backupSingleDatabase(databaseName) { try { if (!this.backupConfig.databaseUsername || !this.backupConfig.databasePassword || !this.backupConfig.host) { throw new Error('Database config variables are missing'); } const client = new pg_1.Client({ host: this.backupConfig.host, user: this.backupConfig.databaseUsername, password: this.backupConfig.databasePassword, port: this.backupConfig.port, database: databaseName, }); await client.connect(); const result = await client.query('SELECT 1 FROM pg_database WHERE datname = $1', [databaseName]); await client.end(); if (result.rowCount === 0) { throw new Error(`Database "${databaseName}" does not exist`); } this.logger.log(`Database "${databaseName}" found. Starting backup...`); const env = { PGPASSWORD: this.backupConfig.databasePassword, }; const backupFilename = `${databaseName}-backup-${Date.now()}.sql`; const backupDir = this.backupConfig.backupDir || process.cwd(); const filePath = path.join(backupDir, backupFilename); const args = [ '-U', this.backupConfig.databaseUsername, '-h', this.backupConfig.host, '-p', this.backupConfig.port, '-d', databaseName, '-f', backupFilename, ]; const pgDumpCommand = this.backupConfig.pgDumpPath || 'pg_dump'; const dump = (0, child_process_1.spawn)(pgDumpCommand, args, { env }); let errorOutput = ''; dump.stderr.on('data', (data) => { errorOutput += data.toString(); }); const [exitCode] = await (0, events_1.once)(dump, 'close'); if (exitCode !== 0) { throw new Error(`pg_dump failed: ${errorOutput}`); } this.logger.log(`Backup completed for Database "${databaseName}"`); return { filePath, databaseName: databaseName, success: true }; } catch (error) { throw new Error(error); } } }; exports.BackupService = BackupService; exports.BackupService = BackupService = BackupService_1 = __decorate([ (0, common_1.Injectable)(), __param(0, (0, common_1.Inject)('BACKUP_CONFIG')), __metadata("design:paramtypes", [Object]) ], BackupService); //# sourceMappingURL=backup.service.js.map