refactor(ui): url builders for each router

The MM2 router is at `api/v2/models`. URL builder utils make this a bit easier to manage.
This commit is contained in:
psychedelicious 2024-02-16 21:57:30 +11:00
parent 2e9aa9391d
commit 86a372b02f
12 changed files with 178 additions and 103 deletions

View File

@ -3,27 +3,35 @@ import type { OpenAPIV3_1 } from 'openapi-types';
import type { paths } from 'services/api/schema';
import type { AppConfig, AppDependencyVersions, AppVersion } from 'services/api/types';
import { api } from '..';
import { api, buildV1Url } from '..';
/**
* Builds an endpoint URL for the app router
* @example
* buildAppInfoUrl('some-path')
* // '/api/v1/app/some-path'
*/
const buildAppInfoUrl = (path: string = '') => buildV1Url(`app/${path}`);
export const appInfoApi = api.injectEndpoints({
endpoints: (build) => ({
getAppVersion: build.query<AppVersion, void>({
query: () => ({
url: `app/version`,
url: buildAppInfoUrl('version'),
method: 'GET',
}),
providesTags: ['FetchOnReconnect'],
}),
getAppDeps: build.query<AppDependencyVersions, void>({
query: () => ({
url: `app/app_deps`,
url: buildAppInfoUrl('app_deps'),
method: 'GET',
}),
providesTags: ['FetchOnReconnect'],
}),
getAppConfig: build.query<AppConfig, void>({
query: () => ({
url: `app/config`,
url: buildAppInfoUrl('config'),
method: 'GET',
}),
providesTags: ['FetchOnReconnect'],
@ -33,28 +41,28 @@ export const appInfoApi = api.injectEndpoints({
void
>({
query: () => ({
url: `app/invocation_cache/status`,
url: buildAppInfoUrl('invocation_cache/status'),
method: 'GET',
}),
providesTags: ['InvocationCacheStatus', 'FetchOnReconnect'],
}),
clearInvocationCache: build.mutation<void, void>({
query: () => ({
url: `app/invocation_cache`,
url: buildAppInfoUrl('invocation_cache'),
method: 'DELETE',
}),
invalidatesTags: ['InvocationCacheStatus'],
}),
enableInvocationCache: build.mutation<void, void>({
query: () => ({
url: `app/invocation_cache/enable`,
url: buildAppInfoUrl('invocation_cache/enable'),
method: 'PUT',
}),
invalidatesTags: ['InvocationCacheStatus'],
}),
disableInvocationCache: build.mutation<void, void>({
query: () => ({
url: `app/invocation_cache/disable`,
url: buildAppInfoUrl('invocation_cache/disable'),
method: 'PUT',
}),
invalidatesTags: ['InvocationCacheStatus'],

View File

@ -9,7 +9,15 @@ import type {
import { getListImagesUrl } from 'services/api/util';
import type { ApiTagDescription } from '..';
import { api, LIST_TAG } from '..';
import { api, buildV1Url, LIST_TAG } from '..';
/**
* Builds an endpoint URL for the boards router
* @example
* buildBoardsUrl('some-path')
* // '/api/v1/boards/some-path'
*/
export const buildBoardsUrl = (path: string = '') => buildV1Url(`boards/${path}`);
export const boardsApi = api.injectEndpoints({
endpoints: (build) => ({
@ -17,7 +25,7 @@ export const boardsApi = api.injectEndpoints({
* Boards Queries
*/
listBoards: build.query<OffsetPaginatedResults_BoardDTO_, ListBoardsArg>({
query: (arg) => ({ url: 'boards/', params: arg }),
query: (arg) => ({ url: buildBoardsUrl(), params: arg }),
providesTags: (result) => {
// any list of boards
const tags: ApiTagDescription[] = [{ type: 'Board', id: LIST_TAG }, 'FetchOnReconnect'];
@ -38,7 +46,7 @@ export const boardsApi = api.injectEndpoints({
listAllBoards: build.query<Array<BoardDTO>, void>({
query: () => ({
url: 'boards/',
url: buildBoardsUrl(),
params: { all: true },
}),
providesTags: (result) => {
@ -61,7 +69,7 @@ export const boardsApi = api.injectEndpoints({
listAllImageNamesForBoard: build.query<Array<string>, string>({
query: (board_id) => ({
url: `boards/${board_id}/image_names`,
url: buildBoardsUrl(`${board_id}/image_names`),
}),
providesTags: (result, error, arg) => [{ type: 'ImageNameList', id: arg }, 'FetchOnReconnect'],
keepUnusedDataFor: 0,
@ -107,7 +115,7 @@ export const boardsApi = api.injectEndpoints({
createBoard: build.mutation<BoardDTO, string>({
query: (board_name) => ({
url: `boards/`,
url: buildBoardsUrl(),
method: 'POST',
params: { board_name },
}),
@ -116,7 +124,7 @@ export const boardsApi = api.injectEndpoints({
updateBoard: build.mutation<BoardDTO, UpdateBoardArg>({
query: ({ board_id, changes }) => ({
url: `boards/${board_id}`,
url: buildBoardsUrl(board_id),
method: 'PATCH',
body: changes,
}),

View File

@ -26,8 +26,24 @@ import {
} from 'services/api/util';
import type { ApiTagDescription } from '..';
import { api, LIST_TAG } from '..';
import { boardsApi } from './boards';
import { api, buildV1Url, LIST_TAG } from '..';
import { boardsApi, buildBoardsUrl } from './boards';
/**
* Builds an endpoint URL for the images router
* @example
* buildImagesUrl('some-path')
* // '/api/v1/images/some-path'
*/
const buildImagesUrl = (path: string = '') => buildV1Url(`images/${path}`);
/**
* Builds an endpoint URL for the board_images router
* @example
* buildBoardImagesUrl('some-path')
* // '/api/v1/board_images/some-path'
*/
const buildBoardImagesUrl = (path: string = '') => buildV1Url(`board_images/${path}`);
export const imagesApi = api.injectEndpoints({
endpoints: (build) => ({
@ -90,20 +106,20 @@ export const imagesApi = api.injectEndpoints({
keepUnusedDataFor: 86400,
}),
getIntermediatesCount: build.query<number, void>({
query: () => ({ url: 'images/intermediates' }),
query: () => ({ url: buildImagesUrl('intermediates') }),
providesTags: ['IntermediatesCount', 'FetchOnReconnect'],
}),
clearIntermediates: build.mutation<number, void>({
query: () => ({ url: `images/intermediates`, method: 'DELETE' }),
query: () => ({ url: buildImagesUrl('intermediates'), method: 'DELETE' }),
invalidatesTags: ['IntermediatesCount'],
}),
getImageDTO: build.query<ImageDTO, string>({
query: (image_name) => ({ url: `images/i/${image_name}` }),
query: (image_name) => ({ url: buildImagesUrl(`i/${image_name}`) }),
providesTags: (result, error, image_name) => [{ type: 'Image', id: image_name }],
keepUnusedDataFor: 86400, // 24 hours
}),
getImageMetadata: build.query<CoreMetadata | undefined, string>({
query: (image_name) => ({ url: `images/i/${image_name}/metadata` }),
query: (image_name) => ({ url: buildImagesUrl(`i/${image_name}/metadata`) }),
providesTags: (result, error, image_name) => [{ type: 'ImageMetadata', id: image_name }],
transformResponse: (
response: paths['/api/v1/images/i/{image_name}/metadata']['get']['responses']['200']['content']['application/json']
@ -130,7 +146,7 @@ export const imagesApi = api.injectEndpoints({
}),
deleteImage: build.mutation<void, ImageDTO>({
query: ({ image_name }) => ({
url: `images/i/${image_name}`,
url: buildImagesUrl(`i/${image_name}`),
method: 'DELETE',
}),
async onQueryStarted(imageDTO, { dispatch, queryFulfilled }) {
@ -185,7 +201,7 @@ export const imagesApi = api.injectEndpoints({
query: ({ imageDTOs }) => {
const image_names = imageDTOs.map((imageDTO) => imageDTO.image_name);
return {
url: `images/delete`,
url: buildImagesUrl('delete'),
method: 'POST',
body: {
image_names,
@ -258,7 +274,7 @@ export const imagesApi = api.injectEndpoints({
*/
changeImageIsIntermediate: build.mutation<ImageDTO, { imageDTO: ImageDTO; is_intermediate: boolean }>({
query: ({ imageDTO, is_intermediate }) => ({
url: `images/i/${imageDTO.image_name}`,
url: buildImagesUrl(`i/${imageDTO.image_name}`),
method: 'PATCH',
body: { is_intermediate },
}),
@ -380,7 +396,7 @@ export const imagesApi = api.injectEndpoints({
*/
changeImageSessionId: build.mutation<ImageDTO, { imageDTO: ImageDTO; session_id: string }>({
query: ({ imageDTO, session_id }) => ({
url: `images/i/${imageDTO.image_name}`,
url: buildImagesUrl(`i/${imageDTO.image_name}`),
method: 'PATCH',
body: { session_id },
}),
@ -417,7 +433,7 @@ export const imagesApi = api.injectEndpoints({
{ imageDTOs: ImageDTO[] }
>({
query: ({ imageDTOs: images }) => ({
url: `images/star`,
url: buildImagesUrl('star'),
method: 'POST',
body: { image_names: images.map((img) => img.image_name) },
}),
@ -511,7 +527,7 @@ export const imagesApi = api.injectEndpoints({
{ imageDTOs: ImageDTO[] }
>({
query: ({ imageDTOs: images }) => ({
url: `images/unstar`,
url: buildImagesUrl('unstar'),
method: 'POST',
body: { image_names: images.map((img) => img.image_name) },
}),
@ -611,7 +627,7 @@ export const imagesApi = api.injectEndpoints({
const formData = new FormData();
formData.append('file', file);
return {
url: `images/upload`,
url: buildImagesUrl('upload'),
method: 'POST',
body: formData,
params: {
@ -674,7 +690,7 @@ export const imagesApi = api.injectEndpoints({
}),
deleteBoard: build.mutation<DeleteBoardResult, string>({
query: (board_id) => ({ url: `boards/${board_id}`, method: 'DELETE' }),
query: (board_id) => ({ url: buildBoardsUrl(board_id), method: 'DELETE' }),
invalidatesTags: () => [
{ type: 'Board', id: LIST_TAG },
// invalidate the 'No Board' cache
@ -764,7 +780,7 @@ export const imagesApi = api.injectEndpoints({
deleteBoardAndImages: build.mutation<DeleteBoardResult, string>({
query: (board_id) => ({
url: `boards/${board_id}`,
url: buildBoardsUrl(board_id),
method: 'DELETE',
params: { include_images: true },
}),
@ -840,7 +856,7 @@ export const imagesApi = api.injectEndpoints({
query: ({ board_id, imageDTO }) => {
const { image_name } = imageDTO;
return {
url: `board_images/`,
url: buildBoardImagesUrl(),
method: 'POST',
body: { board_id, image_name },
};
@ -961,7 +977,7 @@ export const imagesApi = api.injectEndpoints({
query: ({ imageDTO }) => {
const { image_name } = imageDTO;
return {
url: `board_images/`,
url: buildBoardImagesUrl(),
method: 'DELETE',
body: { image_name },
};
@ -1080,7 +1096,7 @@ export const imagesApi = api.injectEndpoints({
}
>({
query: ({ board_id, imageDTOs }) => ({
url: `board_images/batch`,
url: buildBoardImagesUrl('batch'),
method: 'POST',
body: {
image_names: imageDTOs.map((i) => i.image_name),
@ -1197,7 +1213,7 @@ export const imagesApi = api.injectEndpoints({
}
>({
query: ({ imageDTOs }) => ({
url: `board_images/batch/delete`,
url: buildBoardImagesUrl('batch/delete'),
method: 'POST',
body: {
image_names: imageDTOs.map((i) => i.image_name),
@ -1321,7 +1337,7 @@ export const imagesApi = api.injectEndpoints({
components['schemas']['Body_download_images_from_list']
>({
query: ({ image_names, board_id }) => ({
url: `images/download`,
url: buildImagesUrl('download'),
method: 'POST',
body: {
image_names,

View File

@ -19,7 +19,10 @@ import type {
} from 'services/api/types';
import type { ApiTagDescription, tagTypes } from '..';
import { api, LIST_TAG } from '..';
import { api, buildV2Url, LIST_TAG } from '..';
/* eslint-disable @typescript-eslint/no-explicit-any */
export const getModelId = (input: any): any => input;
type UpdateMainModelArg = {
base_model: BaseModelType;
@ -36,6 +39,8 @@ type UpdateLoRAModelArg = {
type UpdateMainModelResponse =
paths['/api/v2/models/i/{key}']['patch']['responses']['200']['content']['application/json'];
type ListModelsArg = NonNullable<paths['/api/models_v2/']['get']['parameters']['query']>;
type UpdateLoRAModelResponse = UpdateMainModelResponse;
type DeleteMainModelArg = {
@ -152,17 +157,25 @@ const buildTransformResponse =
return adapter.setAll(adapter.getInitialState(), response.models);
};
/**
* Builds an endpoint URL for the models router
* @example
* buildModelsUrl('some-path')
* // '/api/v1/models/some-path'
*/
const buildModelsUrl = (path: string = '') => buildV2Url(`models/${path}`);
export const modelsApi = api.injectEndpoints({
endpoints: (build) => ({
getMainModels: build.query<EntityState<MainModelConfig, string>, BaseModelType[]>({
query: (base_models) => {
const params = {
const params: ListModelsArg = {
model_type: 'main',
base_models,
};
const query = queryString.stringify(params, { arrayFormat: 'none' });
return `models/?${query}`;
return buildModelsUrl(`?${query}`);
},
providesTags: buildProvidesTags<MainModelConfig>('MainModel'),
transformResponse: buildTransformResponse<MainModelConfig>(mainModelsAdapter),
@ -170,7 +183,7 @@ export const modelsApi = api.injectEndpoints({
updateMainModels: build.mutation<UpdateMainModelResponse, UpdateMainModelArg>({
query: ({ base_model, model_name, body }) => {
return {
url: `models/${base_model}/main/${model_name}`,
url: buildModelsUrl(`${base_model}/main/${model_name}`),
method: 'PATCH',
body: body,
};
@ -180,7 +193,7 @@ export const modelsApi = api.injectEndpoints({
importMainModels: build.mutation<ImportMainModelResponse, ImportMainModelArg>({
query: ({ body }) => {
return {
url: `models/import`,
url: buildModelsUrl('import'),
method: 'POST',
body: body,
};
@ -190,7 +203,7 @@ export const modelsApi = api.injectEndpoints({
addMainModels: build.mutation<AddMainModelResponse, AddMainModelArg>({
query: ({ body }) => {
return {
url: `models/add`,
url: buildModelsUrl('add'),
method: 'POST',
body: body,
};
@ -200,7 +213,7 @@ export const modelsApi = api.injectEndpoints({
deleteMainModels: build.mutation<DeleteMainModelResponse, DeleteMainModelArg>({
query: ({ base_model, model_name, model_type }) => {
return {
url: `models/${base_model}/${model_type}/${model_name}`,
url: buildModelsUrl(`${base_model}/${model_type}/${model_name}`),
method: 'DELETE',
};
},
@ -209,7 +222,7 @@ export const modelsApi = api.injectEndpoints({
convertMainModels: build.mutation<ConvertMainModelResponse, ConvertMainModelArg>({
query: ({ base_model, model_name, convert_dest_directory }) => {
return {
url: `models/convert/${base_model}/main/${model_name}`,
url: buildModelsUrl(`convert/${base_model}/main/${model_name}`),
method: 'PUT',
params: { convert_dest_directory },
};
@ -219,7 +232,7 @@ export const modelsApi = api.injectEndpoints({
mergeMainModels: build.mutation<MergeMainModelResponse, MergeMainModelArg>({
query: ({ base_model, body }) => {
return {
url: `models/merge/${base_model}`,
url: buildModelsUrl(`merge/${base_model}`),
method: 'PUT',
body: body,
};
@ -229,21 +242,21 @@ export const modelsApi = api.injectEndpoints({
syncModels: build.mutation<SyncModelsResponse, void>({
query: () => {
return {
url: `models/sync`,
url: buildModelsUrl('sync'),
method: 'POST',
};
},
invalidatesTags: ['Model'],
}),
getLoRAModels: build.query<EntityState<LoRAConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 'lora' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 'lora' } }),
providesTags: buildProvidesTags<LoRAConfig>('LoRAModel'),
transformResponse: buildTransformResponse<LoRAConfig>(loraModelsAdapter),
}),
updateLoRAModels: build.mutation<UpdateLoRAModelResponse, UpdateLoRAModelArg>({
query: ({ base_model, model_name, body }) => {
return {
url: `models/${base_model}/lora/${model_name}`,
url: buildModelsUrl(`${base_model}/lora/${model_name}`),
method: 'PATCH',
body: body,
};
@ -253,34 +266,34 @@ export const modelsApi = api.injectEndpoints({
deleteLoRAModels: build.mutation<DeleteLoRAModelResponse, DeleteLoRAModelArg>({
query: ({ base_model, model_name }) => {
return {
url: `models/${base_model}/lora/${model_name}`,
url: buildModelsUrl(`${base_model}/lora/${model_name}`),
method: 'DELETE',
};
},
invalidatesTags: [{ type: 'LoRAModel', id: LIST_TAG }],
}),
getControlNetModels: build.query<EntityState<ControlNetConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 'controlnet' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 'controlnet' } }),
providesTags: buildProvidesTags<ControlNetConfig>('ControlNetModel'),
transformResponse: buildTransformResponse<ControlNetConfig>(controlNetModelsAdapter),
}),
getIPAdapterModels: build.query<EntityState<IPAdapterConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 'ip_adapter' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 'ip_adapter' } }),
providesTags: buildProvidesTags<IPAdapterConfig>('IPAdapterModel'),
transformResponse: buildTransformResponse<IPAdapterConfig>(ipAdapterModelsAdapter),
}),
getT2IAdapterModels: build.query<EntityState<T2IAdapterConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 't2i_adapter' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 't2i_adapter' } }),
providesTags: buildProvidesTags<T2IAdapterConfig>('T2IAdapterModel'),
transformResponse: buildTransformResponse<T2IAdapterConfig>(t2iAdapterModelsAdapter),
}),
getVaeModels: build.query<EntityState<VAEConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 'vae' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 'vae' } }),
providesTags: buildProvidesTags<VAEConfig>('VaeModel'),
transformResponse: buildTransformResponse<VAEConfig>(vaeModelsAdapter),
}),
getTextualInversionModels: build.query<EntityState<TextualInversionConfig, string>, void>({
query: () => ({ url: 'models/', params: { model_type: 'embedding' } }),
query: () => ({ url: buildModelsUrl(), params: { model_type: 'embedding' } }),
providesTags: buildProvidesTags<TextualInversionConfig>('TextualInversionModel'),
transformResponse: buildTransformResponse<TextualInversionConfig>(textualInversionModelsAdapter),
}),
@ -288,14 +301,14 @@ export const modelsApi = api.injectEndpoints({
query: (arg) => {
const folderQueryStr = queryString.stringify(arg, {});
return {
url: `/models/search?${folderQueryStr}`,
url: buildModelsUrl(`search?${folderQueryStr}`),
};
},
}),
getCheckpointConfigs: build.query<CheckpointConfigsResponse, void>({
query: () => {
return {
url: `/models/ckpt_confs`,
url: buildModelsUrl(`ckpt_confs`),
};
},
}),

View File

@ -7,7 +7,15 @@ import queryString from 'query-string';
import type { components, paths } from 'services/api/schema';
import type { ApiTagDescription } from '..';
import { api } from '..';
import { api, buildV1Url } from '..';
/**
* Builds an endpoint URL for the queue router
* @example
* buildQueueUrl('some-path')
* // '/api/v1/queue/queue_id/some-path'
*/
const buildQueueUrl = (path: string = '') => buildV1Url(`queue/${$queueId.get()}/${path}`);
const getListQueueItemsUrl = (queryArgs?: paths['/api/v1/queue/{queue_id}/list']['get']['parameters']['query']) => {
const query = queryArgs
@ -17,10 +25,10 @@ const getListQueueItemsUrl = (queryArgs?: paths['/api/v1/queue/{queue_id}/list']
: undefined;
if (query) {
return `queue/${$queueId.get()}/list?${query}`;
return buildQueueUrl(`list?${query}`);
}
return `queue/${$queueId.get()}/list`;
return buildQueueUrl('list');
};
export type SessionQueueItemStatus = NonNullable<
@ -58,7 +66,7 @@ export const queueApi = api.injectEndpoints({
paths['/api/v1/queue/{queue_id}/enqueue_batch']['post']['requestBody']['content']['application/json']
>({
query: (arg) => ({
url: `queue/${$queueId.get()}/enqueue_batch`,
url: buildQueueUrl('enqueue_batch'),
body: arg,
method: 'POST',
}),
@ -78,7 +86,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/processor/resume`,
url: buildQueueUrl('processor/resume'),
method: 'PUT',
}),
invalidatesTags: ['CurrentSessionQueueItem', 'SessionQueueStatus'],
@ -88,7 +96,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/processor/pause`,
url: buildQueueUrl('processor/pause'),
method: 'PUT',
}),
invalidatesTags: ['CurrentSessionQueueItem', 'SessionQueueStatus'],
@ -98,7 +106,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/prune`,
url: buildQueueUrl('prune'),
method: 'PUT',
}),
invalidatesTags: ['SessionQueueStatus', 'BatchStatus'],
@ -117,7 +125,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/clear`,
url: buildQueueUrl('clear'),
method: 'PUT',
}),
invalidatesTags: [
@ -142,7 +150,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/current`,
url: buildQueueUrl('current'),
method: 'GET',
}),
providesTags: (result) => {
@ -158,7 +166,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/next`,
url: buildQueueUrl('next'),
method: 'GET',
}),
providesTags: (result) => {
@ -174,7 +182,7 @@ export const queueApi = api.injectEndpoints({
void
>({
query: () => ({
url: `queue/${$queueId.get()}/status`,
url: buildQueueUrl('status'),
method: 'GET',
}),
providesTags: ['SessionQueueStatus', 'FetchOnReconnect'],
@ -184,7 +192,7 @@ export const queueApi = api.injectEndpoints({
{ batch_id: string }
>({
query: ({ batch_id }) => ({
url: `queue/${$queueId.get()}/b/${batch_id}/status`,
url: buildQueueUrl(`/b/${batch_id}/status`),
method: 'GET',
}),
providesTags: (result) => {
@ -200,7 +208,7 @@ export const queueApi = api.injectEndpoints({
number
>({
query: (item_id) => ({
url: `queue/${$queueId.get()}/i/${item_id}`,
url: buildQueueUrl(`i/${item_id}`),
method: 'GET',
}),
providesTags: (result) => {
@ -216,7 +224,7 @@ export const queueApi = api.injectEndpoints({
number
>({
query: (item_id) => ({
url: `queue/${$queueId.get()}/i/${item_id}/cancel`,
url: buildQueueUrl(`i/${item_id}/cancel`),
method: 'PUT',
}),
onQueryStarted: async (item_id, { dispatch, queryFulfilled }) => {
@ -253,7 +261,7 @@ export const queueApi = api.injectEndpoints({
paths['/api/v1/queue/{queue_id}/cancel_by_batch_ids']['put']['requestBody']['content']['application/json']
>({
query: (body) => ({
url: `queue/${$queueId.get()}/cancel_by_batch_ids`,
url: buildQueueUrl('cancel_by_batch_ids'),
method: 'PUT',
body,
}),
@ -279,7 +287,7 @@ export const queueApi = api.injectEndpoints({
method: 'GET',
}),
serializeQueryArgs: () => {
return `queue/${$queueId.get()}/list`;
return buildQueueUrl('list');
},
transformResponse: (response: components['schemas']['CursorPaginatedResults_SessionQueueItemDTO_']) =>
queueItemsAdapter.addMany(

View File

@ -1,6 +1,14 @@
import type { components } from 'services/api/schema';
import { api } from '..';
import { api, buildV1Url } from '..';
/**
* Builds an endpoint URL for the utilities router
* @example
* buildUtilitiesUrl('some-path')
* // '/api/v1/utilities/some-path'
*/
const buildUtilitiesUrl = (path: string = '') => buildV1Url(`utilities/${path}`);
export const utilitiesApi = api.injectEndpoints({
endpoints: (build) => ({
@ -9,7 +17,7 @@ export const utilitiesApi = api.injectEndpoints({
{ prompt: string; max_prompts: number }
>({
query: (arg) => ({
url: 'utilities/dynamicprompts',
url: buildUtilitiesUrl('dynamicprompts'),
body: arg,
method: 'POST',
}),

View File

@ -1,6 +1,14 @@
import type { paths } from 'services/api/schema';
import { api, LIST_TAG } from '..';
import { api, buildV1Url, LIST_TAG } from '..';
/**
* Builds an endpoint URL for the workflows router
* @example
* buildWorkflowsUrl('some-path')
* // '/api/v1/workflows/some-path'
*/
const buildWorkflowsUrl = (path: string = '') => buildV1Url(`workflows/${path}`);
export const workflowsApi = api.injectEndpoints({
endpoints: (build) => ({
@ -8,7 +16,7 @@ export const workflowsApi = api.injectEndpoints({
paths['/api/v1/workflows/i/{workflow_id}']['get']['responses']['200']['content']['application/json'],
string
>({
query: (workflow_id) => `workflows/i/${workflow_id}`,
query: (workflow_id) => buildWorkflowsUrl(`i/${workflow_id}`),
providesTags: (result, error, workflow_id) => [{ type: 'Workflow', id: workflow_id }, 'FetchOnReconnect'],
onQueryStarted: async (arg, api) => {
const { dispatch, queryFulfilled } = api;
@ -22,7 +30,7 @@ export const workflowsApi = api.injectEndpoints({
}),
deleteWorkflow: build.mutation<void, string>({
query: (workflow_id) => ({
url: `workflows/i/${workflow_id}`,
url: buildWorkflowsUrl(`i/${workflow_id}`),
method: 'DELETE',
}),
invalidatesTags: (result, error, workflow_id) => [
@ -36,7 +44,7 @@ export const workflowsApi = api.injectEndpoints({
paths['/api/v1/workflows/']['post']['requestBody']['content']['application/json']['workflow']
>({
query: (workflow) => ({
url: 'workflows/',
url: buildWorkflowsUrl(),
method: 'POST',
body: { workflow },
}),
@ -50,7 +58,7 @@ export const workflowsApi = api.injectEndpoints({
paths['/api/v1/workflows/i/{workflow_id}']['patch']['requestBody']['content']['application/json']['workflow']
>({
query: (workflow) => ({
url: `workflows/i/${workflow.id}`,
url: buildWorkflowsUrl(`i/${workflow.id}`),
method: 'PATCH',
body: { workflow },
}),
@ -65,7 +73,7 @@ export const workflowsApi = api.injectEndpoints({
NonNullable<paths['/api/v1/workflows/']['get']['parameters']['query']>
>({
query: (params) => ({
url: 'workflows/',
url: buildWorkflowsUrl(),
params,
}),
providesTags: ['FetchOnReconnect', { type: 'Workflow', id: LIST_TAG }],

View File

@ -54,7 +54,7 @@ const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryE
const projectId = $projectId.get();
const fetchBaseQueryArgs: FetchBaseQueryArgs = {
baseUrl: baseUrl ? `${baseUrl}/api/v1` : `${window.location.href.replace(/\/$/, '')}/api/v1`,
baseUrl: baseUrl || window.location.href.replace(/\/$/, ''),
prepareHeaders: (headers) => {
if (authToken) {
headers.set('Authorization', `Bearer ${authToken}`);
@ -108,3 +108,6 @@ function getCircularReplacer() {
return value;
};
}
export const buildV1Url = (path: string): string => `api/v1/${path}`;
export const buildV2Url = (path: string): string => `api/v2/${path}`;

File diff suppressed because one or more lines are too long

View File

@ -61,11 +61,13 @@ export type IPAdapterField = S['IPAdapterField'];
// Model Configs
// TODO(MM2): Can we make key required in the pydantic model?
type KeyRequired<T extends {key?: string}> = SetRequired<T, 'key'>;
type KeyRequired<T extends { key?: string }> = SetRequired<T, 'key'>;
export type LoRAConfig = KeyRequired<S['LoRAConfig']>;
// TODO(MM2): Can we rename this from Vae -> VAE
export type VAEConfig = KeyRequired<S['VaeCheckpointConfig']> | KeyRequired<S['VaeDiffusersConfig']>;
export type ControlNetConfig = KeyRequired<S['ControlNetDiffusersConfig']> | KeyRequired<S['ControlNetCheckpointConfig']>;
export type ControlNetConfig =
| KeyRequired<S['ControlNetDiffusersConfig']>
| KeyRequired<S['ControlNetCheckpointConfig']>;
export type IPAdapterConfig = KeyRequired<S['IPAdapterConfig']>;
// TODO(MM2): Can we rename this to T2IAdapterConfig
export type T2IAdapterConfig = KeyRequired<S['T2IConfig']>;

View File

@ -3,6 +3,7 @@ import { getSelectorsOptions } from 'app/store/createMemoizedSelector';
import { dateComparator } from 'common/util/dateComparator';
import { ASSETS_CATEGORIES, IMAGE_CATEGORIES } from 'features/gallery/store/types';
import queryString from 'query-string';
import { buildV1Url } from 'services/api';
import type { ImageCache, ImageDTO, ListImagesArgs } from './types';
@ -79,4 +80,4 @@ export const imagesSelectors = imagesAdapter.getSelectors(undefined, getSelector
// Helper to create the url for the listImages endpoint. Also we use it to create the cache key.
export const getListImagesUrl = (queryArgs: ListImagesArgs) =>
`images/?${queryString.stringify(queryArgs, { arrayFormat: 'none' })}`;
buildV1Url(`images/?${queryString.stringify(queryArgs, { arrayFormat: 'none' })}`);

View File

@ -76,9 +76,9 @@ export default defineConfig(({ mode }) => {
changeOrigin: true,
},
// proxy nodes api
'/api/v1': {
target: 'http://127.0.0.1:9090/api/v1',
rewrite: (path) => path.replace(/^\/api\/v1/, ''),
'/api/': {
target: 'http://127.0.0.1:9090/api/',
rewrite: (path) => path.replace(/^\/api/, ''),
changeOrigin: true,
},
},