feat: add cloud backup upload and universal restore script

This commit is contained in:
Erik
2025-11-29 12:44:47 -03:00
parent 1600cc8267
commit 932caf1b6c
4 changed files with 587 additions and 0 deletions

View File

@@ -151,6 +151,32 @@ export function BackupManager() {
}
};
const uploadBackupToCloud = async (filename: string) => {
try {
setRestoreLoading(filename);
const response = await fetch('/api/backup/upload', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ filename })
});
const data = await response.json();
if (response.ok) {
success('Backup enviado para cloud com sucesso!');
} else {
showError(data.error || 'Erro ao enviar backup');
}
} catch (err) {
showError('Erro ao enviar backup: ' + (err as Error).message);
} finally {
setRestoreLoading(null);
}
};
const formatSize = (bytes: number) => {
if (bytes === 0) return '0 B';
const k = 1024;
@@ -247,6 +273,18 @@ export function BackupManager() {
</div>
<div className="flex items-center gap-2 shrink-0">
<button
onClick={() => uploadBackupToCloud(backup.filename)}
disabled={restoreLoading === backup.filename}
title="Enviar para cloud"
className="p-2 hover:bg-purple-100 dark:hover:bg-purple-900/20 rounded-lg transition-colors text-purple-600 dark:text-purple-400 disabled:opacity-50 disabled:cursor-not-allowed"
>
{restoreLoading === backup.filename ? (
<i className="ri-loader-4-line animate-spin text-xl"></i>
) : (
<i className="ri-cloud-upload-line text-xl"></i>
)}
</button>
<button
onClick={() => restoreBackup(backup.filename)}
disabled={restoreLoading === backup.filename}