handlers/db/init.js (view raw)
1const chalk = require("chalk");
2const S3Client = require("../../libs/s3/client");
3const execPsqlCommand = require("../../libs/psql/shellCmd");
4const getPsqlConfig = require("../../libs/psql/getConfig");
5const getS3Config = require("../../libs/s3/getConfig");
6const { splitPsqlParts, splitS3Parts } = require("./_utils");
7
8const DUMP_DIR = "/tmp/";
9
10const init = async params => {
11 const { s3Name, fileName } = splitS3Parts(params["s3Name/fileName"]);
12 const { psqlName, dbName } = splitPsqlParts(params["psqlName/dbName"]);
13 const psqlConfig = getPsqlConfig(psqlName);
14 const s3Config = getS3Config(s3Name);
15 const dumpPath = `${DUMP_DIR}${fileName}`;
16
17 try {
18 console.log(
19 chalk.greenBright(`Downloading ${fileName} from ${s3Name} server`)
20 );
21 await downloadDump(s3Config, { dumpPath, fileName });
22 console.log(
23 chalk.greenBright(
24 `Restoring ${dbName} database to ${psqlName} from ${fileName}`
25 )
26 );
27 await restoreDatabase(dumpPath, dbName, psqlConfig);
28 console.log(chalk.greenBright("Done."));
29 } catch (error) {
30 console.error(chalk.redBright(error));
31 }
32};
33
34const downloadDump = async (s3Config, { dumpPath, fileName }) =>
35 S3Client(s3Config).pull({ dumpPath, fileName });
36
37const restoreDatabase = async (dumpPath, dbName, psqlConfig) => {
38 await execPsqlCommand(`psql -c 'CREATE DATABASE ${dbName}'`, psqlConfig);
39
40 if (psqlConfig.timescale) {
41 await execPsqlCommand(
42 `psql -c 'SELECT timescaledb_pre_restore();' -d ${dbName}`,
43 psqlConfig
44 );
45 }
46
47 await execPsqlCommand(
48 `pg_restore -Fc -d ${dbName} "${dumpPath}"`,
49 psqlConfig
50 );
51
52 if (psqlConfig.timescale) {
53 await execPsqlCommand(
54 `psql -c 'SELECT timescaledb_post_restore();' -d ${dbName}`,
55 psqlConfig
56 );
57 }
58};
59
60module.exports = init;