datasquirel/package-shared/functions/backend/backups/su/add-backup/write-backup-files.ts
Benjamin Toby 382da38bb0 Updates
2025-07-09 20:42:01 +01:00

125 lines
3.8 KiB
TypeScript

import fs from "fs";
import path from "path";
import { DSQL_DATASQUIREL_BACKUPS } from "../../../../../types/dsql";
import { APIResponseObject } from "../../../../../types";
import grabDirNames from "../../../../../utils/backend/names/grab-dir-names";
import { AppNames } from "../../../../../dict/app-names";
import dbHandler from "../../../dbHandler";
import exportMariadbDatabase from "../../../../../utils/backend/export-mariadb-database";
type Params = {
backup: DSQL_DATASQUIREL_BACKUPS;
};
export default async function writeBackupFiles({
backup,
}: Params): Promise<APIResponseObject> {
try {
const {
mainBackupDir,
userBackupDir,
sqlBackupDirName,
schemasBackupDirName,
targetUserPrivateDir,
oldSchemasDir,
} = grabDirNames({
userId: backup.user_id,
});
if (backup.user_id && !userBackupDir) {
return {
success: false,
msg: `Error grabbing user backup directory`,
};
}
if (!backup.uuid) {
return {
success: false,
msg: `No UUID found for backup`,
};
}
const newBackupDir = path.join(
backup.user_id && userBackupDir ? userBackupDir : mainBackupDir,
backup.uuid
);
fs.mkdirSync(newBackupDir, { recursive: true });
fs.mkdirSync(path.join(newBackupDir, sqlBackupDirName), {
recursive: true,
});
fs.mkdirSync(path.join(newBackupDir, schemasBackupDirName), {
recursive: true,
});
const userDatabases = backup.user_id
? ((await dbHandler({
query: `SHOW DATABASES LIKE '${AppNames["DsqlDbPrefix"]}${backup.user_id}_%'`,
})) as { [k: string]: string }[])
: undefined;
const databasesToBackup = userDatabases?.map(
(db) => Object.values(db)[0]
) || [process.env.DSQL_DB_NAME || "datasquirel"];
for (let i = 0; i < databasesToBackup.length; i++) {
const dbToBackup = databasesToBackup[i];
if (!dbToBackup) continue;
const dbFileName = `${dbToBackup}.sql`;
const dbFilePath = path.join(
newBackupDir,
sqlBackupDirName,
dbFileName
);
exportMariadbDatabase({
dbFullName: dbToBackup,
targetFilePath: dbFilePath,
});
}
const userSchemaDirFiles = targetUserPrivateDir
? fs
.readdirSync(targetUserPrivateDir)
.filter((dirName) => dirName.match(/^\d+\.json$/))
: undefined;
const appSchemaDirFiles = fs
.readdirSync(oldSchemasDir)
.filter((dirName) => dirName.match(/^\d+\.json$/));
const schemaFilesToWrite =
backup.user_id && userSchemaDirFiles
? userSchemaDirFiles
: appSchemaDirFiles;
for (let i = 0; i < schemaFilesToWrite.length; i++) {
const schemaFileName = schemaFilesToWrite[i];
const originSchemaFilePath = path.join(
backup.user_id && targetUserPrivateDir
? targetUserPrivateDir
: oldSchemasDir,
schemaFileName
);
const destinationSchemaFilePath = path.join(
newBackupDir,
schemasBackupDirName,
schemaFileName
);
fs.copyFileSync(originSchemaFilePath, destinationSchemaFilePath);
}
return { success: true };
} catch (error: any) {
return {
success: false,
msg: `Failed to write backup files`,
error: error.message,
};
}
}