split uploaded and generated backups

This commit is contained in:
Julian Krauser 2025-02-03 11:03:31 +01:00
parent 542a77fbef
commit 0d6103170a
6 changed files with 122 additions and 15 deletions

View file

@ -4,6 +4,8 @@ import { EntityManager } from "typeorm";
import uniqBy from "lodash.uniqby";
import InternalException from "../exceptions/internalException";
import UserService from "../service/user/userService";
import { BACKUP_COPIES, BACKUP_INTERVAL } from "../env.defaults";
import DatabaseActionException from "../exceptions/databaseActionException";
export type BackupSection =
| "member"
@ -97,7 +99,26 @@ export default abstract class BackupHelper {
FileSystemHelper.writeFile(path, filename + ".json", JSON.stringify(json, null, 2));
// TODO: delete older backups by copies env
let files = FileSystemHelper.getFilesInDirectory("backup", ".json");
let sorted = files.sort((a, b) => new Date(b.split(".")[0]).getTime() - new Date(a.split(".")[0]).getTime());
const filesToDelete = sorted.slice(BACKUP_COPIES);
for (const file of filesToDelete) {
FileSystemHelper.deleteFile("backup", file);
}
}
static async createBackupOnInterval() {
let files = FileSystemHelper.getFilesInDirectory("backup", ".json");
let newestFile = files.sort((a, b) => new Date(b.split(".")[0]).getTime() - new Date(a.split(".")[0]).getTime())[0];
let lastBackup = new Date(newestFile.split(".")[0]);
let diffInMs = new Date().getTime() - lastBackup.getTime();
let diffInDays = diffInMs / (1000 * 60 * 60 * 24);
if (diffInDays >= BACKUP_INTERVAL) {
await this.createBackup({});
}
}
static async loadBackup({
@ -105,11 +126,13 @@ export default abstract class BackupHelper {
path = "/backup",
include = [],
partial = false,
overwrite = false,
}: {
filename: string;
path?: string;
partial?: boolean;
include?: Array<BackupSection>;
overwrite?: boolean;
}): Promise<void> {
this.transactionManager = undefined;
@ -127,10 +150,12 @@ export default abstract class BackupHelper {
const sections = this.backupSection
.filter((bs) => (partial ? include.includes(bs.type) : true))
.sort((a, b) => a.orderOnClear - b.orderOnClear);
for (const section of sections.filter((s) => Object.keys(backup).includes(s.type))) {
let refered = this.backupSectionRefered[section.type];
for (const ref of refered) {
await this.transactionManager.getRepository(ref).delete({});
if (!overwrite) {
for (const section of sections.filter((s) => Object.keys(backup).includes(s.type))) {
let refered = this.backupSectionRefered[section.type];
for (const ref of refered) {
await this.transactionManager.getRepository(ref).delete({});
}
}
}
@ -144,7 +169,7 @@ export default abstract class BackupHelper {
})
.catch((err) => {
this.transactionManager = undefined;
throw new InternalException("failed to restore backup - rolling back actions", err);
throw new DatabaseActionException("BACKUP RESTORE", include.join(", "), err);
});
}