Create backups via graphql api

Fixes #1022
This commit is contained in:
schroda
2025-10-02 20:04:00 +02:00
parent 6b16cdbf54
commit 60f11a2832
3 changed files with 53 additions and 2 deletions

View File

@@ -1192,7 +1192,11 @@
"backup": {
"action": {
"create": {
"error": {
"failure": "Could not create backup"
},
"label": {
"in_progress": "Creating backup…",
"description": "Back up library as a Tachiyomi backup",
"title": "Create backup"
}

View File

@@ -129,6 +129,36 @@ export function Backup() {
}
};
const createBackup = async () => {
makeToast(t('settings.backup.action.create.label.in_progress'), 'info');
const backupFileResponse = await requestManager.createBackupFile({
includeCategories: true,
includeChapters: true,
includeHistory: true,
includeClientData: true,
includeTracking: true,
includeServerSettings: true,
}).response;
const backupFileUrl = backupFileResponse.data?.createBackup.url;
if (!backupFileUrl) {
makeToast(
t('settings.backup.action.create.error.failure'),
'error',
getErrorMessage(backupFileResponse.errors),
);
return;
}
const link = document.createElement('a');
link.href = backupFileUrl;
link.download = '';
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
};
const validateBackup = async (file: File) => {
try {
const {
@@ -222,7 +252,7 @@ export function Backup() {
return (
<>
<List sx={{ padding: 0 }}>
<ListItemButton component="a" href={requestManager.getExportBackupUrl()} download>
<ListItemButton onClick={createBackup}>
<ListItemText
primary={t('settings.backup.action.create.label.title')}
secondary={t('settings.backup.action.create.label.description')}

View File

@@ -216,6 +216,9 @@ import {
UserLoginMutationVariables,
UserRefreshMutation,
UserRefreshMutationVariables,
CreateBackupInput,
CreateBackupMutation,
CreateBackupMutationVariables,
} from '@/lib/graphql/generated/graphql.ts';
import { GET_GLOBAL_METADATAS } from '@/lib/graphql/queries/GlobalMetadataQuery.ts';
import { DELETE_GLOBAL_METADATA, SET_GLOBAL_METADATA } from '@/lib/graphql/mutations/GlobalMetadataMutation.ts';
@@ -298,7 +301,7 @@ import {
import { STOP_UPDATER, UPDATE_LIBRARY } from '@/lib/graphql/mutations/UpdaterMutation.ts';
import { GET_LAST_UPDATE_TIMESTAMP, GET_UPDATE_STATUS } from '@/lib/graphql/queries/UpdaterQuery.ts';
import { CustomCache } from '@/lib/storage/CustomCache.ts';
import { RESTORE_BACKUP } from '@/lib/graphql/mutations/BackupMutation.ts';
import { CREATE_BACKUP, RESTORE_BACKUP } from '@/lib/graphql/mutations/BackupMutation.ts';
import { GET_RESTORE_STATUS, VALIDATE_BACKUP } from '@/lib/graphql/queries/BackupQuery.ts';
import { DOWNLOAD_STATUS_SUBSCRIPTION } from '@/lib/graphql/subscriptions/DownloaderSubscription.ts';
import { UPDATER_SUBSCRIPTION } from '@/lib/graphql/subscriptions/UpdaterSubscription.ts';
@@ -2702,6 +2705,20 @@ export class RequestManager {
);
}
public createBackupFile(
input: CreateBackupInput,
options?: MutationOptions<CreateBackupMutation, CreateBackupMutationVariables>,
): AbortableApolloMutationResponse<CreateBackupMutation> {
return this.doRequest<CreateBackupMutation, CreateBackupMutationVariables>(
GQLMethod.MUTATION,
CREATE_BACKUP,
{ input },
{
...options,
},
);
}
public restoreBackupFile(
file: File,
options?: MutationOptions<RestoreBackupMutation, RestoreBackupMutationVariables>,