UNPKG

@topgroup/diginext

Version:

A BUILD SERVER & CLI to deploy apps to any Kubernetes clusters.

115 lines (114 loc) 5.33 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.restore = exports.backup = exports.checkConnection = exports.getConnectionString = void 0; const makeDaySlug_1 = require("diginext-utils/dist/string/makeDaySlug"); const log_1 = require("diginext-utils/dist/xconsole/log"); const fs_1 = require("fs"); const path_1 = __importDefault(require("path")); const const_1 = require("../../config/const"); const getConnectionString = (options) => { if (options.url) return options.url; if (!options.host) throw new Error(`Param "host" is required.`); if (!options.pass) throw new Error(`Param "pass" is required.`); return `postgresql://${options.user || "root"}:${options.pass}@${options.host}:${options.port}/${options.dbName || options.authDb || ""}`; }; exports.getConnectionString = getConnectionString; const checkConnection = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); if (options.isDebugging) console.log("[POSTGRES] checkConnection > options :>> ", options); try { const connectionStr = (0, exports.getConnectionString)(options); const { stdout, stderr } = execaSync(`psql`, [connectionStr, "-c", "SELECT version();"]); if (options.isDebugging) console.log("[POSTGRES] Connected :>> ", stdout); return true; } catch (e) { console.error("[POSTGRES]", e); return false; } }; exports.checkConnection = checkConnection; const backup = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); const bkName = `postgresql-backup-${(0, makeDaySlug_1.makeDaySlug)()}.${options.dbName ? "dump" : "sql"}`; if (!options.outDir) options.outDir = path_1.default.resolve(const_1.STORAGE_DIR, `postgresql`); if (!(0, fs_1.existsSync)(options.outDir)) (0, fs_1.mkdirSync)(options.outDir, { recursive: true }); const outPath = path_1.default.resolve(options.outDir, bkName); const connectionStr = (0, exports.getConnectionString)(options); if (options.dbName) { const { stdout, stderr } = await execa(`pg_dump`, [connectionStr, "-F", "c", "-f", outPath]); if (options.isDebugging) console.log(`[POSTGRES] Backup database "${options.dbName}" successfully :>> `, stdout); if (stderr) (0, log_1.logError)(stderr); } else { const { stdout, stderr } = await execa(`pg_dumpall`, ["-d", connectionStr, "-f", outPath], { env: { PGPASSWORD: options.pass } }); if (options.isDebugging) console.log("[POSTGRES] Backup all databases successfully :>> ", stdout); if (stderr) (0, log_1.logError)(stderr); } return { name: bkName, path: outPath }; }; exports.backup = backup; const restore = async (options) => { const { execa, execaCommand, execaSync } = await Promise.resolve().then(() => __importStar(require("execa"))); if (!options.path) throw new Error(`Input "dir" path to ".dump" file is required.`); try { if (!options.path.endsWith(".sql")) throw new Error(`Invalid backup path, must end with ".sql"`); const connectionStr = (0, exports.getConnectionString)(options); if (!options.dbName) { const { stdout, stderr } = execaSync(`psql`, [connectionStr, "-f", options.path]); if (options.isDebugging) console.log("[POSTGRES] Restore all databases successfully :>> ", stdout); } else { const { stdout, stderr } = execaSync(`pg_restore`, ["-d", connectionStr, "-c", options.path]); if (options.isDebugging) console.log(`[POSTGRES] Restore "${options.dbName}" database successfully :>> `, stdout); } return true; } catch (e) { return false; } }; exports.restore = restore; const PostgreSQL = { checkConnection: exports.checkConnection, backup: exports.backup, restore: exports.restore }; exports.default = PostgreSQL;