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

115 lines
3.4 KiB
TypeScript

import fs from "fs";
import path from "path";
import grabDirNames from "../../../../../utils/backend/names/grab-dir-names";
import { APIResponseObject, UserType } from "../../../../../types";
import { DSQL_DATASQUIREL_BACKUPS } from "../../../../../types/dsql";
import importMariadbDatabase from "../../../../../utils/backend/import-mariadb-database";
type Params = {
user: UserType;
backup: DSQL_DATASQUIREL_BACKUPS;
};
export default async function suRestoreBackup({
user,
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 existingBackupDir = path.join(
backup.user_id && userBackupDir ? userBackupDir : mainBackupDir,
backup.uuid
);
const userDatabases = fs.readdirSync(
path.join(existingBackupDir, sqlBackupDirName)
);
const databasesToRestore = userDatabases?.map(
(db) => db.split(".")[0]
) || [process.env.DSQL_DB_NAME || "datasquirel"];
for (let i = 0; i < databasesToRestore.length; i++) {
const dbToBackup = databasesToRestore[i];
if (!dbToBackup) continue;
const dbFileName = `${dbToBackup}.sql`;
const dbFilePath = path.join(
existingBackupDir,
sqlBackupDirName,
dbFileName
);
importMariadbDatabase({
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(
existingBackupDir,
schemasBackupDirName,
schemaFileName
);
const destinationSchemaFilePath = path.join(
backup.user_id && targetUserPrivateDir
? targetUserPrivateDir
: oldSchemasDir,
schemaFileName
);
fs.copyFileSync(originSchemaFilePath, destinationSchemaFilePath);
}
return { success: true };
} catch (error: any) {
return {
success: false,
msg: `Failed to write backup files`,
error: error.message,
};
}
}