feat: manual backup button
This commit is contained in:
@@ -5,8 +5,10 @@ export function createBackupsStore({ api, onToast, at }) {
|
||||
archives: [],
|
||||
backupDir: "",
|
||||
backupsLoading: false,
|
||||
backupsCreating: false,
|
||||
backupsUploading: false,
|
||||
backupsRestoring: false,
|
||||
lastCreated: null,
|
||||
lastRestore: null,
|
||||
});
|
||||
|
||||
@@ -21,13 +23,38 @@ export function createBackupsStore({ api, onToast, at }) {
|
||||
backupDir: data.backup_dir || "",
|
||||
}));
|
||||
} else {
|
||||
onToast(data?.message || data?.error || at("backups_load_failed", {}, "Не удалось загрузить бэкапы"));
|
||||
onToast(
|
||||
data?.message ||
|
||||
data?.error ||
|
||||
at("backups_load_failed", {}, "Не удалось загрузить бэкапы")
|
||||
);
|
||||
}
|
||||
} finally {
|
||||
state.update((s) => ({ ...s, backupsLoading: false }));
|
||||
}
|
||||
}
|
||||
|
||||
async function createBackup() {
|
||||
state.update((s) => ({ ...s, backupsCreating: true, lastCreated: null }));
|
||||
try {
|
||||
const data = await api("/admin/backups/create", {
|
||||
method: "POST",
|
||||
});
|
||||
if (data?.ok) {
|
||||
state.update((s) => ({ ...s, lastCreated: data.result || null }));
|
||||
onToast(at("backups_create_done", {}, "Бэкап создан"));
|
||||
await loadArchives();
|
||||
return data.archive || null;
|
||||
}
|
||||
onToast(
|
||||
data?.message || data?.error || at("backups_create_failed", {}, "Не удалось создать бэкап")
|
||||
);
|
||||
return null;
|
||||
} finally {
|
||||
state.update((s) => ({ ...s, backupsCreating: false }));
|
||||
}
|
||||
}
|
||||
|
||||
async function uploadArchive(file) {
|
||||
if (!file) return null;
|
||||
state.update((s) => ({ ...s, backupsUploading: true }));
|
||||
@@ -43,7 +70,11 @@ export function createBackupsStore({ api, onToast, at }) {
|
||||
await loadArchives();
|
||||
return data.archive || null;
|
||||
}
|
||||
onToast(data?.message || data?.error || at("backups_upload_failed", {}, "Не удалось загрузить архив"));
|
||||
onToast(
|
||||
data?.message ||
|
||||
data?.error ||
|
||||
at("backups_upload_failed", {}, "Не удалось загрузить архив")
|
||||
);
|
||||
return null;
|
||||
} finally {
|
||||
state.update((s) => ({ ...s, backupsUploading: false }));
|
||||
@@ -77,7 +108,9 @@ export function createBackupsStore({ api, onToast, at }) {
|
||||
onToast(at("backups_restore_done", {}, "Восстановление завершено"));
|
||||
return true;
|
||||
}
|
||||
onToast(data?.message || data?.error || at("backups_restore_failed", {}, "Не удалось восстановить"));
|
||||
onToast(
|
||||
data?.message || data?.error || at("backups_restore_failed", {}, "Не удалось восстановить")
|
||||
);
|
||||
return false;
|
||||
} finally {
|
||||
state.update((s) => ({ ...s, backupsRestoring: false }));
|
||||
@@ -87,6 +120,7 @@ export function createBackupsStore({ api, onToast, at }) {
|
||||
return {
|
||||
subscribe: state.subscribe,
|
||||
loadArchives,
|
||||
createBackup,
|
||||
uploadArchive,
|
||||
restoreArchive,
|
||||
};
|
||||
|
||||
@@ -475,6 +475,35 @@ export async function mockApi(path, options = {}, context = {}) {
|
||||
archives: clone(mockBackups),
|
||||
};
|
||||
}
|
||||
if (path === "/admin/backups/create") {
|
||||
const createdAt = new Date();
|
||||
const stamp = createdAt
|
||||
.toISOString()
|
||||
.replace(/[-:]/g, "")
|
||||
.replace("T", "-")
|
||||
.replace(/\.\d{3}Z$/, "+0000");
|
||||
const archive = {
|
||||
...mockBackups[0],
|
||||
name: `remnawave-minishop-backup-${stamp}.zip`,
|
||||
modified_at: createdAt.toISOString(),
|
||||
created_at: createdAt.toISOString(),
|
||||
created_at_local: createdAt.toISOString(),
|
||||
};
|
||||
return {
|
||||
ok: true,
|
||||
archive,
|
||||
result: {
|
||||
archive_name: archive.name,
|
||||
archive_path: `data/backups/${archive.name}`,
|
||||
started_at: createdAt.toISOString(),
|
||||
completed_at: createdAt.toISOString(),
|
||||
db_dump_included: true,
|
||||
compose_files_count: archive.compose_files_count,
|
||||
size_bytes: archive.size_bytes,
|
||||
warnings: [],
|
||||
},
|
||||
};
|
||||
}
|
||||
if (path === "/admin/backups/upload") {
|
||||
return {
|
||||
ok: true,
|
||||
|
||||
Reference in New Issue
Block a user