feat: backup schedule creation form

This commit is contained in:
Nicolas Meienberger
2025-10-28 22:34:56 +01:00
parent 37a22b260f
commit d1c1adaba7
14 changed files with 746 additions and 610 deletions

View File

@@ -28,6 +28,7 @@ import {
deleteBackupSchedule,
getBackupSchedule,
updateBackupSchedule,
getBackupScheduleForVolume,
runBackupNow,
} from "../sdk.gen";
import { queryOptions, type UseMutationOptions, type DefaultError } from "@tanstack/react-query";
@@ -73,6 +74,7 @@ import type {
GetBackupScheduleData,
UpdateBackupScheduleData,
UpdateBackupScheduleResponse,
GetBackupScheduleForVolumeData,
RunBackupNowData,
RunBackupNowResponse,
} from "../types.gen";
@@ -842,6 +844,27 @@ export const updateBackupScheduleMutation = (
return mutationOptions;
};
export const getBackupScheduleForVolumeQueryKey = (options: Options<GetBackupScheduleForVolumeData>) =>
createQueryKey("getBackupScheduleForVolume", options);
/**
* Get a backup schedule for a specific volume
*/
export const getBackupScheduleForVolumeOptions = (options: Options<GetBackupScheduleForVolumeData>) => {
return queryOptions({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getBackupScheduleForVolume({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getBackupScheduleForVolumeQueryKey(options),
});
};
export const runBackupNowQueryKey = (options: Options<RunBackupNowData>) => createQueryKey("runBackupNow", options);
/**

View File

@@ -64,6 +64,8 @@ import type {
GetBackupScheduleResponses,
UpdateBackupScheduleData,
UpdateBackupScheduleResponses,
GetBackupScheduleForVolumeData,
GetBackupScheduleForVolumeResponses,
RunBackupNowData,
RunBackupNowResponses,
} from "./types.gen";
@@ -416,6 +418,18 @@ export const updateBackupSchedule = <ThrowOnError extends boolean = false>(
});
};
/**
* Get a backup schedule for a specific volume
*/
export const getBackupScheduleForVolume = <ThrowOnError extends boolean = false>(
options: Options<GetBackupScheduleForVolumeData, ThrowOnError>,
) => {
return (options.client ?? _heyApiClient).get<GetBackupScheduleForVolumeResponses, unknown, ThrowOnError>({
url: "/api/v1/backups/volume/{volumeId}",
...options,
});
};
/**
* Trigger a backup immediately for a schedule
*/

View File

@@ -174,6 +174,7 @@ export type ListVolumesResponses = {
username?: string;
};
createdAt: number;
id: number;
lastError: string | null;
lastHealthCheck: number;
name: string;
@@ -370,6 +371,7 @@ export type GetVolumeResponses = {
username?: string;
};
createdAt: number;
id: number;
lastError: string | null;
lastHealthCheck: number;
name: string;
@@ -470,6 +472,7 @@ export type UpdateVolumeResponses = {
username?: string;
};
createdAt: number;
id: number;
lastError: string | null;
lastHealthCheck: number;
name: string;
@@ -820,15 +823,14 @@ export type ListBackupSchedulesResponses = {
createdAt: number;
cronExpression: string;
enabled: boolean;
excludePatterns: Array<string>;
excludePatterns: Array<string> | null;
id: number;
includePatterns: Array<string>;
includePatterns: Array<string> | null;
lastBackupAt: number | null;
lastBackupError: string | null;
lastBackupStatus: "error" | "success" | null;
nextBackupAt: number | null;
repositoryId: string;
repositoryName: string;
retentionPolicy: {
keepDaily?: number;
keepHourly?: number;
@@ -840,7 +842,6 @@ export type ListBackupSchedulesResponses = {
} | null;
updatedAt: number;
volumeId: number;
volumeName: string;
}>;
};
};
@@ -881,15 +882,14 @@ export type CreateBackupScheduleResponses = {
createdAt: number;
cronExpression: string;
enabled: boolean;
excludePatterns: Array<string>;
excludePatterns: Array<string> | null;
id: number;
includePatterns: Array<string>;
includePatterns: Array<string> | null;
lastBackupAt: number | null;
lastBackupError: string | null;
lastBackupStatus: "error" | "success" | null;
nextBackupAt: number | null;
repositoryId: string;
repositoryName: string;
retentionPolicy: {
keepDaily?: number;
keepHourly?: number;
@@ -901,7 +901,6 @@ export type CreateBackupScheduleResponses = {
} | null;
updatedAt: number;
volumeId: number;
volumeName: string;
};
};
};
@@ -946,15 +945,14 @@ export type GetBackupScheduleResponses = {
createdAt: number;
cronExpression: string;
enabled: boolean;
excludePatterns: Array<string>;
excludePatterns: Array<string> | null;
id: number;
includePatterns: Array<string>;
includePatterns: Array<string> | null;
lastBackupAt: number | null;
lastBackupError: string | null;
lastBackupStatus: "error" | "success" | null;
nextBackupAt: number | null;
repositoryId: string;
repositoryName: string;
retentionPolicy: {
keepDaily?: number;
keepHourly?: number;
@@ -966,7 +964,6 @@ export type GetBackupScheduleResponses = {
} | null;
updatedAt: number;
volumeId: number;
volumeName: string;
};
};
};
@@ -1008,15 +1005,14 @@ export type UpdateBackupScheduleResponses = {
createdAt: number;
cronExpression: string;
enabled: boolean;
excludePatterns: Array<string>;
excludePatterns: Array<string> | null;
id: number;
includePatterns: Array<string>;
includePatterns: Array<string> | null;
lastBackupAt: number | null;
lastBackupError: string | null;
lastBackupStatus: "error" | "success" | null;
nextBackupAt: number | null;
repositoryId: string;
repositoryName: string;
retentionPolicy: {
keepDaily?: number;
keepHourly?: number;
@@ -1028,13 +1024,54 @@ export type UpdateBackupScheduleResponses = {
} | null;
updatedAt: number;
volumeId: number;
volumeName: string;
};
};
};
export type UpdateBackupScheduleResponse = UpdateBackupScheduleResponses[keyof UpdateBackupScheduleResponses];
export type GetBackupScheduleForVolumeData = {
body?: never;
path: {
volumeId: string;
};
query?: never;
url: "/api/v1/backups/volume/{volumeId}";
};
export type GetBackupScheduleForVolumeResponses = {
/**
* Backup schedule details for the volume
*/
200: {
createdAt: number;
cronExpression: string;
enabled: boolean;
excludePatterns: Array<string> | null;
id: number;
includePatterns: Array<string> | null;
lastBackupAt: number | null;
lastBackupError: string | null;
lastBackupStatus: "error" | "success" | null;
nextBackupAt: number | null;
repositoryId: string;
retentionPolicy: {
keepDaily?: number;
keepHourly?: number;
keepLast?: number;
keepMonthly?: number;
keepWeekly?: number;
keepWithinDuration?: string;
keepYearly?: number;
} | null;
updatedAt: number;
volumeId: number;
} | null;
};
export type GetBackupScheduleForVolumeResponse =
GetBackupScheduleForVolumeResponses[keyof GetBackupScheduleForVolumeResponses];
export type RunBackupNowData = {
body?: never;
path: {