From 5cb68d92ce3f66a6bc3caaccba020e1e24d84c9f Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Mon, 3 Feb 2025 11:03:38 +0100 Subject: [PATCH] split uploaded and generated backups --- .../admin/user/backup/RestoreBackupModal.vue | 6 +++ .../admin/user/backup/UploadBackupModal.vue | 7 ++- src/router/backupGuard.ts | 19 ++++++++ src/router/index.ts | 24 +++++++++- src/stores/admin/user/backup.ts | 11 +++-- .../admin/club/member/membership.models.ts | 3 +- src/viewmodels/admin/user/backup.models.ts | 1 + .../admin/club/members/MemberOverview.vue | 2 +- .../backup/{Backup.vue => BackupRouting.vue} | 40 +++++++++++----- .../admin/user/backup/GeneratedBackup.vue | 48 +++++++++++++++++++ .../admin/user/backup/UploadedBackup.vue | 48 +++++++++++++++++++ 11 files changed, 188 insertions(+), 21 deletions(-) create mode 100644 src/router/backupGuard.ts rename src/views/admin/user/backup/{Backup.vue => BackupRouting.vue} (57%) create mode 100644 src/views/admin/user/backup/GeneratedBackup.vue create mode 100644 src/views/admin/user/backup/UploadedBackup.vue diff --git a/src/components/admin/user/backup/RestoreBackupModal.vue b/src/components/admin/user/backup/RestoreBackupModal.vue index e50a398..c80e026 100644 --- a/src/components/admin/user/backup/RestoreBackupModal.vue +++ b/src/components/admin/user/backup/RestoreBackupModal.vue @@ -15,12 +15,17 @@ +
+ + +

Je nach Auswahl, werden die entsprechenden Bestandsdaten ersetzt. Dadurch können Daten, die seit diesem Backup erstellt wurden, verloren gehen.

+

Das Laden eines vollständigen Backups wird zur Vermeidung von Inkonsistenzen empfohlen.

diff --git a/src/router/backupGuard.ts b/src/router/backupGuard.ts new file mode 100644 index 0000000..a9e6302 --- /dev/null +++ b/src/router/backupGuard.ts @@ -0,0 +1,19 @@ +import { useBackupStore } from "../stores/admin/user/backup"; + +export async function setBackupPage(to: any, from: any, next: any) { + const backup = useBackupStore(); + + let uploadPage = to.name.includes("uploaded"); + + if (uploadPage) { + backup.page = "uploaded"; + backup.backups = []; + } else { + backup.page = "generated"; + backup.backups = []; + } + + backup.fetchBackups(); + + next(); +} diff --git a/src/router/index.ts b/src/router/index.ts index 8011d2a..2d39254 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -10,6 +10,7 @@ import { resetMemberStores, setMemberId } from "./memberGuard"; import { resetProtocolStores, setProtocolId } from "./protocolGuard"; import { resetNewsletterStores, setNewsletterId } from "./newsletterGuard"; import { config } from "../config"; +import { setBackupPage } from "./backupGuard"; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -636,10 +637,29 @@ const router = createRouter({ }, { path: "backup", - name: "admin-user-backup", - component: () => import("@/views/admin/user/backup/Backup.vue"), + name: "admin-user-backup-route", + component: () => import("@/views/admin/user/backup/BackupRouting.vue"), meta: { type: "read", section: "user", module: "backup" }, beforeEnter: [abilityAndNavUpdate], + children: [ + { + path: "", + name: "admin-user-backup", + redirect: { name: "admin-user-backup-generated" }, + }, + { + path: "generated", + name: "admin-user-backup-generated", + component: () => import("@/views/admin/user/backup/GeneratedBackup.vue"), + beforeEnter: [setBackupPage], + }, + { + path: "uploads", + name: "admin-user-backup-uploaded", + component: () => import("@/views/admin/user/backup/UploadedBackup.vue"), + beforeEnter: [setBackupPage], + }, + ], }, ], }, diff --git a/src/stores/admin/user/backup.ts b/src/stores/admin/user/backup.ts index 1f29cf8..1f87652 100644 --- a/src/stores/admin/user/backup.ts +++ b/src/stores/admin/user/backup.ts @@ -8,13 +8,14 @@ export const useBackupStore = defineStore("backup", { return { backups: [] as Array, loading: null as null | "loading" | "success" | "failed", + page: "generated" as "generated" | "uploaded", }; }, actions: { fetchBackups() { this.loading = "loading"; http - .get("/admin/backup") + .get(`/admin/backup/${this.page}`) .then((result) => { this.backups = result.data; this.loading = "success"; @@ -24,16 +25,16 @@ export const useBackupStore = defineStore("backup", { }); }, fetchBackupById(filename: string): Promise> { - return http.get(`/admin/backup/${filename}`); + return http.get(`/admin/backup/${this.page}/${filename}`); + }, + async restoreBackup(backup: BackupRestoreViewModel): Promise> { + return await http.post(`/admin/backup/${this.page}/restore`, backup); }, async triggerBackupCreate(): Promise> { const result = await http.post("/admin/backup"); this.fetchBackups(); return result; }, - async restoreBackup(backup: BackupRestoreViewModel): Promise> { - return await http.post("/admin/backup/restore", backup); - }, async uploadBackup(file: File): Promise> { const formData = new FormData(); formData.append("file", file); diff --git a/src/viewmodels/admin/club/member/membership.models.ts b/src/viewmodels/admin/club/member/membership.models.ts index 0bbdb92..ccf8105 100644 --- a/src/viewmodels/admin/club/member/membership.models.ts +++ b/src/viewmodels/admin/club/member/membership.models.ts @@ -9,7 +9,8 @@ export interface MembershipViewModel { export interface MembershipStatisticsViewModel { durationInDays: number; - durationInYears: string; + durationInYears: number; + exactDuration: string; status: string; statusId: number; memberId: string; diff --git a/src/viewmodels/admin/user/backup.models.ts b/src/viewmodels/admin/user/backup.models.ts index 1d552dc..522c0ff 100644 --- a/src/viewmodels/admin/user/backup.models.ts +++ b/src/viewmodels/admin/user/backup.models.ts @@ -4,4 +4,5 @@ export interface BackupRestoreViewModel { filename: string; partial: boolean; include: Array; + overwrite: boolean; } diff --git a/src/views/admin/club/members/MemberOverview.vue b/src/views/admin/club/members/MemberOverview.vue index db2726c..5bb4ad1 100644 --- a/src/views/admin/club/members/MemberOverview.vue +++ b/src/views/admin/club/members/MemberOverview.vue @@ -34,7 +34,7 @@ >

{{ stat.status }} für gesamt {{ stat.durationInDays }} Tage - ~> {{ stat.durationInYears.replace("_", "") }} Jahre + ~> {{ stat.exactDuration }}

diff --git a/src/views/admin/user/backup/Backup.vue b/src/views/admin/user/backup/BackupRouting.vue similarity index 57% rename from src/views/admin/user/backup/Backup.vue rename to src/views/admin/user/backup/BackupRouting.vue index b238994..477398e 100644 --- a/src/views/admin/user/backup/Backup.vue +++ b/src/views/admin/user/backup/BackupRouting.vue @@ -6,17 +6,27 @@ @@ -35,6 +45,14 @@ import { useAbilityStore } from "@/stores/ability"; + + diff --git a/src/views/admin/user/backup/UploadedBackup.vue b/src/views/admin/user/backup/UploadedBackup.vue new file mode 100644 index 0000000..b5f975c --- /dev/null +++ b/src/views/admin/user/backup/UploadedBackup.vue @@ -0,0 +1,48 @@ + + + + +