refactor: use schema constants

This commit is contained in:
Nicolas Meienberger
2025-10-23 19:25:12 +02:00
parent 8b1438ea62
commit 4ae738ce41
14 changed files with 661 additions and 35 deletions

View File

@@ -18,6 +18,10 @@ import {
unmountVolume,
healthCheckVolume,
listFiles,
listRepositories,
createRepository,
deleteRepository,
getRepository,
} from "../sdk.gen";
import { queryOptions, type UseMutationOptions, type DefaultError } from "@tanstack/react-query";
import type {
@@ -47,6 +51,12 @@ import type {
HealthCheckVolumeData,
HealthCheckVolumeResponse,
ListFilesData,
ListRepositoriesData,
CreateRepositoryData,
CreateRepositoryResponse,
DeleteRepositoryData,
DeleteRepositoryResponse,
GetRepositoryData,
} from "../types.gen";
import { client as _heyApiClient } from "../client.gen";
@@ -561,3 +571,103 @@ export const listFilesOptions = (options: Options<ListFilesData>) => {
queryKey: listFilesQueryKey(options),
});
};
export const listRepositoriesQueryKey = (options?: Options<ListRepositoriesData>) =>
createQueryKey("listRepositories", options);
/**
* List all repositories
*/
export const listRepositoriesOptions = (options?: Options<ListRepositoriesData>) => {
return queryOptions({
queryFn: async ({ queryKey, signal }) => {
const { data } = await listRepositories({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: listRepositoriesQueryKey(options),
});
};
export const createRepositoryQueryKey = (options?: Options<CreateRepositoryData>) =>
createQueryKey("createRepository", options);
/**
* Create a new restic repository
*/
export const createRepositoryOptions = (options?: Options<CreateRepositoryData>) => {
return queryOptions({
queryFn: async ({ queryKey, signal }) => {
const { data } = await createRepository({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: createRepositoryQueryKey(options),
});
};
/**
* Create a new restic repository
*/
export const createRepositoryMutation = (
options?: Partial<Options<CreateRepositoryData>>,
): UseMutationOptions<CreateRepositoryResponse, DefaultError, Options<CreateRepositoryData>> => {
const mutationOptions: UseMutationOptions<CreateRepositoryResponse, DefaultError, Options<CreateRepositoryData>> = {
mutationFn: async (localOptions) => {
const { data } = await createRepository({
...options,
...localOptions,
throwOnError: true,
});
return data;
},
};
return mutationOptions;
};
/**
* Delete a repository
*/
export const deleteRepositoryMutation = (
options?: Partial<Options<DeleteRepositoryData>>,
): UseMutationOptions<DeleteRepositoryResponse, DefaultError, Options<DeleteRepositoryData>> => {
const mutationOptions: UseMutationOptions<DeleteRepositoryResponse, DefaultError, Options<DeleteRepositoryData>> = {
mutationFn: async (localOptions) => {
const { data } = await deleteRepository({
...options,
...localOptions,
throwOnError: true,
});
return data;
},
};
return mutationOptions;
};
export const getRepositoryQueryKey = (options: Options<GetRepositoryData>) => createQueryKey("getRepository", options);
/**
* Get a single repository by name
*/
export const getRepositoryOptions = (options: Options<GetRepositoryData>) => {
return queryOptions({
queryFn: async ({ queryKey, signal }) => {
const { data } = await getRepository({
...options,
...queryKey[0],
signal,
throwOnError: true,
});
return data;
},
queryKey: getRepositoryQueryKey(options),
});
};

View File

@@ -17,6 +17,6 @@ export type CreateClientConfig<T extends DefaultClientOptions = ClientOptions> =
export const client = createClient(
createConfig<ClientOptions>({
baseUrl: "http://localhost:4096",
baseUrl: "http://192.168.2.42:4096",
}),
);

View File

@@ -44,6 +44,14 @@ import type {
ListFilesData,
ListFilesResponses,
ListFilesErrors,
ListRepositoriesData,
ListRepositoriesResponses,
CreateRepositoryData,
CreateRepositoryResponses,
DeleteRepositoryData,
DeleteRepositoryResponses,
GetRepositoryData,
GetRepositoryResponses,
} from "./types.gen";
import { client as _heyApiClient } from "./client.gen";
@@ -261,3 +269,55 @@ export const listFiles = <ThrowOnError extends boolean = false>(options: Options
...options,
});
};
/**
* List all repositories
*/
export const listRepositories = <ThrowOnError extends boolean = false>(
options?: Options<ListRepositoriesData, ThrowOnError>,
) => {
return (options?.client ?? _heyApiClient).get<ListRepositoriesResponses, unknown, ThrowOnError>({
url: "/api/v1/repositories",
...options,
});
};
/**
* Create a new restic repository
*/
export const createRepository = <ThrowOnError extends boolean = false>(
options?: Options<CreateRepositoryData, ThrowOnError>,
) => {
return (options?.client ?? _heyApiClient).post<CreateRepositoryResponses, unknown, ThrowOnError>({
url: "/api/v1/repositories",
...options,
headers: {
"Content-Type": "application/json",
...options?.headers,
},
});
};
/**
* Delete a repository
*/
export const deleteRepository = <ThrowOnError extends boolean = false>(
options: Options<DeleteRepositoryData, ThrowOnError>,
) => {
return (options.client ?? _heyApiClient).delete<DeleteRepositoryResponses, unknown, ThrowOnError>({
url: "/api/v1/repositories/{name}",
...options,
});
};
/**
* Get a single repository by name
*/
export const getRepository = <ThrowOnError extends boolean = false>(
options: Options<GetRepositoryData, ThrowOnError>,
) => {
return (options.client ?? _heyApiClient).get<GetRepositoryResponses, unknown, ThrowOnError>({
url: "/api/v1/repositories/{name}",
...options,
});
};

View File

@@ -178,7 +178,7 @@ export type ListVolumesResponses = {
lastHealthCheck: number;
name: string;
path: string;
status: "error" | "mounted" | "unknown" | "unmounted";
status: "error" | "mounted" | "unmounted";
type: "directory" | "nfs" | "smb" | "webdav";
updatedAt: number;
}>;
@@ -374,7 +374,7 @@ export type GetVolumeResponses = {
lastHealthCheck: number;
name: string;
path: string;
status: "error" | "mounted" | "unknown" | "unmounted";
status: "error" | "mounted" | "unmounted";
type: "directory" | "nfs" | "smb" | "webdav";
updatedAt: number;
};
@@ -474,7 +474,7 @@ export type UpdateVolumeResponses = {
lastHealthCheck: number;
name: string;
path: string;
status: "error" | "mounted" | "unknown" | "unmounted";
status: "error" | "mounted" | "unmounted";
type: "directory" | "nfs" | "smb" | "webdav";
updatedAt: number;
};
@@ -639,6 +639,145 @@ export type ListFilesResponses = {
export type ListFilesResponse = ListFilesResponses[keyof ListFilesResponses];
export type ClientOptions = {
baseUrl: "http://localhost:4096" | (string & {});
export type ListRepositoriesData = {
body?: never;
path?: never;
query?: never;
url: "/api/v1/repositories";
};
export type ListRepositoriesResponses = {
/**
* List of repositories
*/
200: {
repositories: Array<{
compressionMode: "auto" | "better" | "fastest" | "max" | "off" | null;
config:
| {
accessKeyId: string;
backend: "s3";
bucket: string;
endpoint: string;
secretAccessKey: string;
}
| {
backend: "local";
path: string;
};
createdAt: number;
id: string;
lastChecked: number | null;
lastError: string | null;
name: string;
status: "error" | "healthy" | "unknown" | null;
type: "local" | "s3";
updatedAt: number;
}>;
};
};
export type ListRepositoriesResponse = ListRepositoriesResponses[keyof ListRepositoriesResponses];
export type CreateRepositoryData = {
body?: {
config:
| {
accessKeyId: string;
backend: "s3";
bucket: string;
endpoint: string;
secretAccessKey: string;
}
| {
backend: "local";
path: string;
};
name: string;
compressionMode?: "auto" | "better" | "fastest" | "max" | "off";
};
path?: never;
query?: never;
url: "/api/v1/repositories";
};
export type CreateRepositoryResponses = {
/**
* Repository created successfully
*/
201: {
message: string;
repository: {
id: string;
name: string;
};
};
};
export type CreateRepositoryResponse = CreateRepositoryResponses[keyof CreateRepositoryResponses];
export type DeleteRepositoryData = {
body?: never;
path: {
name: string;
};
query?: never;
url: "/api/v1/repositories/{name}";
};
export type DeleteRepositoryResponses = {
/**
* Repository deleted successfully
*/
200: {
message: string;
};
};
export type DeleteRepositoryResponse = DeleteRepositoryResponses[keyof DeleteRepositoryResponses];
export type GetRepositoryData = {
body?: never;
path: {
name: string;
};
query?: never;
url: "/api/v1/repositories/{name}";
};
export type GetRepositoryResponses = {
/**
* Repository details
*/
200: {
repository: {
compressionMode: "auto" | "better" | "fastest" | "max" | "off" | null;
config:
| {
accessKeyId: string;
backend: "s3";
bucket: string;
endpoint: string;
secretAccessKey: string;
}
| {
backend: "local";
path: string;
};
createdAt: number;
id: string;
lastChecked: number | null;
lastError: string | null;
name: string;
status: "error" | "healthy" | "unknown" | null;
type: "local" | "s3";
updatedAt: number;
};
};
};
export type GetRepositoryResponse = GetRepositoryResponses[keyof GetRepositoryResponses];
export type ClientOptions = {
baseUrl: "http://192.168.2.42:4096" | (string & {});
};