refactor: base crud hook

This commit is contained in:
2025-08-23 10:28:31 +04:00
parent b105510c23
commit f2084ae3d4
13 changed files with 355 additions and 403 deletions

View File

@ -39,14 +39,12 @@ const useBoardsContextState = () => {
setSelectedBoardId(boards[0].id); setSelectedBoardId(boards[0].id);
} }
const { onCreateBoard, onUpdateBoard, onDeleteBoard } = useBoardsOperations( const { onCreate, onUpdate, onDelete } = useBoardsOperations({
{
boards, boards,
setBoards, setBoards,
refetchBoards, refetchBoards,
projectId: project?.id, projectId: project?.id,
} });
);
return { return {
boards, boards,
@ -54,9 +52,9 @@ const useBoardsContextState = () => {
selectedBoard, selectedBoard,
setSelectedBoardId, setSelectedBoardId,
refetchBoards, refetchBoards,
onCreateBoard, onCreateBoard: onCreate,
onUpdateBoard, onUpdateBoard: onUpdate,
onDeleteBoard, onDeleteBoard: onDelete,
isEditorDrawerOpened, isEditorDrawerOpened,
setIsEditorDrawerOpened, setIsEditorDrawerOpened,
}; };

View File

@ -36,8 +36,7 @@ const useProjectsContextState = () => {
setSelectedProjectId(projects[0].id); setSelectedProjectId(projects[0].id);
} }
const { onCreateProject, onUpdateProject, onDeleteProject } = const { onCreate, onUpdate, onDelete } = useProjectsOperations({
useProjectsOperations({
projects, projects,
setProjects, setProjects,
refetchProjects, refetchProjects,
@ -48,9 +47,9 @@ const useProjectsContextState = () => {
selectedProject, selectedProject,
refetchProjects, refetchProjects,
setSelectedProjectId, setSelectedProjectId,
onCreateProject, onCreateProject: onCreate,
onUpdateProject, onUpdateProject: onUpdate,
onDeleteProject, onDeleteProject: onDelete,
}; };
}; };

View File

@ -29,8 +29,7 @@ const useStatusesContextState = () => {
boardId: selectedBoard?.id, boardId: selectedBoard?.id,
}); });
const { onCreateStatus, onUpdateStatus, onDeleteStatus } = const { onCreate, onUpdate, onDelete } = useStatusesOperations({
useStatusesOperations({
statuses, statuses,
setStatuses, setStatuses,
refetchStatuses, refetchStatuses,
@ -41,9 +40,9 @@ const useStatusesContextState = () => {
statuses, statuses,
setStatuses, setStatuses,
refetchStatuses, refetchStatuses,
onCreateStatus, onCreateStatus: onCreate,
onUpdateStatus, onUpdateStatus: onUpdate,
onDeleteStatus, onDeleteStatus: onDelete,
}; };
}; };

View File

@ -32,8 +32,7 @@ const useBoardStatusesContextState = ({ board }: Props) => {
boardId: board.id, boardId: board.id,
}); });
const { onCreateStatus, onUpdateStatus, onDeleteStatus } = const { onCreate, onUpdate, onDelete } = useStatusesOperations({
useStatusesOperations({
statuses, statuses,
setStatuses, setStatuses,
refetchStatuses, refetchStatuses,
@ -45,9 +44,9 @@ const useBoardStatusesContextState = ({ board }: Props) => {
statuses, statuses,
setStatuses, setStatuses,
refetchStatuses, refetchStatuses,
onCreateStatus, onCreateStatus: onCreate,
onUpdateStatus, onUpdateStatus: onUpdate,
onDeleteStatus, onDeleteStatus: onDelete,
}; };
}; };

View File

@ -30,23 +30,21 @@ const useProjectBoardsContextState = ({ project }: Props) => {
refetch: refetchBoards, refetch: refetchBoards,
} = useBoardsList({ projectId: project?.id }); } = useBoardsList({ projectId: project?.id });
const { onCreateBoard, onUpdateBoard, onDeleteBoard } = useBoardsOperations( const { onCreate, onUpdate, onDelete } = useBoardsOperations({
{
boards, boards,
setBoards, setBoards,
refetchBoards, refetchBoards,
projectId: project?.id, projectId: project?.id,
} });
);
return { return {
boards, boards,
setBoards, setBoards,
project, project,
refetchBoards, refetchBoards,
onCreateBoard, onCreateBoard: onCreate,
onUpdateBoard, onUpdateBoard: onUpdate,
onDeleteBoard, onDeleteBoard: onDelete,
}; };
}; };

3
src/hooks/base/index.ts Normal file
View File

@ -0,0 +1,3 @@
import useCrudOperations from "./useCrudOperations";
export { useCrudOperations };

View File

@ -0,0 +1,161 @@
import React from "react";
import { useMutation, UseMutationOptions } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { Text } from "@mantine/core";
import { modals } from "@mantine/modals";
import { HttpValidationError, Options } from "@/lib/client";
import { notifications } from "@/lib/notifications";
import { sortByLexorank } from "@/utils/lexorank";
type BaseEntity = {
id: number;
name: string;
lexorank?: string;
};
type CreateMutationOptions = Options<{
body: any;
query: undefined;
path: undefined;
url: string;
}>;
type UpdateMutationOptions = Options<{
body: any;
query: undefined;
path: {
pk: number;
};
url: string;
}>;
type DeleteMutationOptions = Options<{
body: undefined;
query: undefined;
path: {
pk: number;
};
url: string;
}>;
type UseEntityOperationsProps<
TEntity extends BaseEntity,
TUpdate,
TCreate,
> = {
entities: TEntity[];
setEntities: React.Dispatch<React.SetStateAction<TEntity[]>>;
refetch: () => void;
mutations: {
create: UseMutationOptions<
any,
AxiosError<HttpValidationError>,
CreateMutationOptions
>;
update: UseMutationOptions<
any,
AxiosError<HttpValidationError>,
UpdateMutationOptions
>;
delete: UseMutationOptions<
any,
AxiosError<HttpValidationError>,
DeleteMutationOptions
>;
};
getCreateEntity: (name: string) => TCreate | null;
getUpdateEntity: (oldEntity: TEntity, update: TUpdate) => TEntity;
getDeleteConfirmTitle: (entity: TEntity) => string;
};
const useCrudOperations = <
TEntity extends BaseEntity,
TUpdate extends object,
TCreate extends object,
>({
entities,
setEntities,
refetch,
mutations,
getCreateEntity,
getUpdateEntity,
getDeleteConfirmTitle,
}: UseEntityOperationsProps<TEntity, TUpdate, TCreate>) => {
const onError = (error: AxiosError<HttpValidationError>) => {
console.error(error);
notifications.error({
message: error.response?.data?.detail as string | undefined,
});
refetch();
};
const createMutation = useMutation({
...mutations.create,
onError,
onSuccess: (res: { entity: TEntity }) => {
setEntities([...entities, res.entity]);
},
});
const updateMutation = useMutation({
...mutations.update,
onError,
});
const deleteMutation = useMutation({
...mutations.delete,
onError,
});
const onCreate = (name: string) => {
const entity = getCreateEntity(name);
if (!entity) return;
createMutation.mutate({
body: {
entity,
},
path: undefined,
query: undefined,
});
};
const onUpdate = (id: number, update: TUpdate) => {
updateMutation.mutate({
body: {
entity: update,
},
path: { pk: id },
query: undefined,
});
setEntities(prev => {
const updated = prev.map(entity =>
entity.id === id ? getUpdateEntity(entity, update) : entity
);
if ("lexorank" in update) {
return sortByLexorank(
updated as (TEntity & { lexorank: string })[]
);
}
return updated;
});
};
const onDelete = (entity: TEntity) => {
modals.openConfirmModal({
title: getDeleteConfirmTitle(entity),
children: (
<Text>Вы уверены, что хотите удалить "{entity.name}"?</Text>
),
labels: { confirm: "Да", cancel: "Нет" },
confirmProps: { color: "red" },
onConfirm: () => {
deleteMutation.mutate({ path: { pk: entity.id } } as any);
setEntities(prev => prev.filter(e => e.id !== entity.id));
},
});
};
return { onCreate, onUpdate, onDelete };
};
export default useCrudOperations;

View File

@ -1,12 +1,9 @@
import React from "react"; import React from "react";
import { useMutation } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { LexoRank } from "lexorank"; import { LexoRank } from "lexorank";
import { Text } from "@mantine/core"; import { useCrudOperations } from "@/hooks/base";
import { modals } from "@mantine/modals";
import { import {
BoardSchema, BoardSchema,
HttpValidationError, CreateBoardSchema,
UpdateBoardSchema, UpdateBoardSchema,
} from "@/lib/client"; } from "@/lib/client";
import { import {
@ -14,12 +11,7 @@ import {
deleteBoardMutation, deleteBoardMutation,
updateBoardMutation, updateBoardMutation,
} from "@/lib/client/@tanstack/react-query.gen"; } from "@/lib/client/@tanstack/react-query.gen";
import { notifications } from "@/lib/notifications"; import { getMaxByLexorank, getNewLexorank } from "@/utils/lexorank";
import {
getMaxByLexorank,
getNewLexorank,
sortByLexorank,
} from "@/utils/lexorank";
type UseBoardsOperationsProps = { type UseBoardsOperationsProps = {
boards: BoardSchema[]; boards: BoardSchema[];
@ -29,9 +21,9 @@ type UseBoardsOperationsProps = {
}; };
type BoardsOperations = { type BoardsOperations = {
onCreateBoard: (name: string) => void; onCreate: (name: string) => void;
onUpdateBoard: (boardId: number, board: UpdateBoardSchema) => void; onUpdate: (boardId: number, board: UpdateBoardSchema) => void;
onDeleteBoard: (board: BoardSchema) => void; onDelete: (board: BoardSchema) => void;
}; };
export const useBoardsOperations = ({ export const useBoardsOperations = ({
@ -40,95 +32,34 @@ export const useBoardsOperations = ({
refetchBoards, refetchBoards,
projectId, projectId,
}: UseBoardsOperationsProps): BoardsOperations => { }: UseBoardsOperationsProps): BoardsOperations => {
const onError = (error: AxiosError<HttpValidationError>) => { return useCrudOperations<BoardSchema, UpdateBoardSchema, CreateBoardSchema>(
console.error(error); {
notifications.error({ entities: boards,
message: error.response?.data?.detail as string | undefined, setEntities: setBoards,
}); refetch: refetchBoards,
refetchBoards(); mutations: {
}; create: createBoardMutation(),
update: updateBoardMutation(),
const createBoard = useMutation({ delete: deleteBoardMutation(),
...createBoardMutation(),
onError,
onSuccess: res => {
setBoards([...boards, res.board]);
}, },
}); getCreateEntity: name => {
if (!projectId) return null;
const updateBoard = useMutation({
...updateBoardMutation(),
onError,
});
const deleteBoard = useMutation({
...deleteBoardMutation(),
onError,
});
const onCreateBoard = (name: string) => {
if (!projectId) return;
const lastBoard = getMaxByLexorank(boards); const lastBoard = getMaxByLexorank(boards);
const newLexorank = getNewLexorank( const newLexorank = getNewLexorank(
lastBoard ? LexoRank.parse(lastBoard.lexorank) : null lastBoard ? LexoRank.parse(lastBoard.lexorank) : null
); );
return {
createBoard.mutate({
body: {
board: {
name, name,
projectId, projectId,
lexorank: newLexorank.toString(), lexorank: newLexorank.toString(),
},
},
});
}; };
},
const onUpdateBoard = (boardId: number, board: UpdateBoardSchema) => { getUpdateEntity: (old, update) => ({
updateBoard.mutate({ ...old,
path: { boardId }, name: update.name ?? old.name,
body: { board }, lexorank: update.lexorank ?? old.lexorank,
}); }),
getDeleteConfirmTitle: () => "Удаление доски",
setBoards(boards =>
sortByLexorank(
boards.map(oldBoard =>
oldBoard.id !== boardId
? oldBoard
: {
id: oldBoard.id,
name: board.name ? board.name : oldBoard.name,
lexorank: board.lexorank
? board.lexorank
: oldBoard.lexorank,
} }
)
)
); );
}; };
const onDeleteBoard = (board: BoardSchema) => {
modals.openConfirmModal({
title: "Удаление доски",
children: (
<Text>
Вы уверены, что хотите удалить доску "{board.name}"?
</Text>
),
labels: { confirm: "Да", cancel: "Нет" },
confirmProps: { color: "red" },
onConfirm: () => {
deleteBoard.mutate({
path: { boardId: board.id },
});
setBoards(boards => boards.filter(b => b.id !== board.id));
},
});
};
return {
onCreateBoard,
onUpdateBoard,
onDeleteBoard,
};
};

View File

@ -1,10 +1,7 @@
import React from "react"; import React from "react";
import { useMutation } from "@tanstack/react-query"; import { useCrudOperations } from "@/hooks/base";
import { AxiosError } from "axios";
import { Text } from "@mantine/core";
import { modals } from "@mantine/modals";
import { import {
HttpValidationError, CreateProjectSchema,
ProjectSchema, ProjectSchema,
UpdateProjectSchema, UpdateProjectSchema,
} from "@/lib/client"; } from "@/lib/client";
@ -13,7 +10,6 @@ import {
deleteProjectMutation, deleteProjectMutation,
updateProjectMutation, updateProjectMutation,
} from "@/lib/client/@tanstack/react-query.gen"; } from "@/lib/client/@tanstack/react-query.gen";
import { notifications } from "@/lib/notifications";
type Props = { type Props = {
projects: ProjectSchema[]; projects: ProjectSchema[];
@ -22,9 +18,9 @@ type Props = {
}; };
type ProjectsOperations = { type ProjectsOperations = {
onCreateProject: (name: string) => void; onCreate: (name: string) => void;
onUpdateProject: (projectId: number, project: UpdateProjectSchema) => void; onUpdate: (projectId: number, project: UpdateProjectSchema) => void;
onDeleteProject: (project: ProjectSchema) => void; onDelete: (project: ProjectSchema) => void;
}; };
export const useProjectsOperations = ({ export const useProjectsOperations = ({
@ -32,87 +28,24 @@ export const useProjectsOperations = ({
setProjects, setProjects,
refetchProjects, refetchProjects,
}: Props): ProjectsOperations => { }: Props): ProjectsOperations => {
const onError = (error: AxiosError<HttpValidationError>) => { return useCrudOperations<
console.error(error); ProjectSchema,
notifications.error({ UpdateProjectSchema,
message: error.response?.data?.detail as string | undefined, CreateProjectSchema
}); >({
refetchProjects(); entities: projects,
}; setEntities: setProjects,
refetch: refetchProjects,
const createProject = useMutation({ mutations: {
...createProjectMutation(), create: createProjectMutation(),
onError, update: updateProjectMutation(),
onSuccess: res => { delete: deleteProjectMutation(),
setProjects([...projects, res.project]);
},
});
const updateProject = useMutation({
...updateProjectMutation(),
onError,
});
const deleteProject = useMutation({
...deleteProjectMutation(),
onError,
});
const onCreateProject = (name: string) => {
createProject.mutate({
body: {
project: {
name,
},
}, },
getCreateEntity: name => ({ name }),
getUpdateEntity: (old, update) => ({
...old,
name: update.name ?? old.name,
}),
getDeleteConfirmTitle: () => "Удаление проекта",
}); });
}; };
const onUpdateProject = (
projectId: number,
project: UpdateProjectSchema
) => {
updateProject.mutate({
query: { projectId },
body: { project },
});
setProjects(boards =>
boards.map(oldProject =>
oldProject.id !== projectId
? oldProject
: {
id: oldProject.id,
name: project.name ? project.name : oldProject.name,
}
)
);
};
const onDeleteProject = (project: ProjectSchema) => {
modals.openConfirmModal({
title: "Удаление проекта",
children: (
<Text>
Вы уверены, что хотите удалить проект "{project.name}"?
</Text>
),
labels: { confirm: "Да", cancel: "Нет" },
confirmProps: { color: "red" },
onConfirm: () => {
deleteProject.mutate({
query: { projectId: project.id },
});
setProjects(projects =>
projects.filter(p => p.id !== project.id)
);
},
});
};
return {
onCreateProject,
onUpdateProject,
onDeleteProject,
};
};

View File

@ -1,11 +1,8 @@
import React from "react"; import React from "react";
import { useMutation } from "@tanstack/react-query";
import { AxiosError } from "axios";
import { LexoRank } from "lexorank"; import { LexoRank } from "lexorank";
import { Text } from "@mantine/core"; import { useCrudOperations } from "@/hooks/base";
import { modals } from "@mantine/modals";
import { import {
HttpValidationError, CreateStatusSchema,
StatusSchema, StatusSchema,
UpdateStatusSchema, UpdateStatusSchema,
} from "@/lib/client"; } from "@/lib/client";
@ -14,12 +11,7 @@ import {
deleteStatusMutation, deleteStatusMutation,
updateStatusMutation, updateStatusMutation,
} from "@/lib/client/@tanstack/react-query.gen"; } from "@/lib/client/@tanstack/react-query.gen";
import { notifications } from "@/lib/notifications"; import { getMaxByLexorank, getNewLexorank } from "@/utils/lexorank";
import {
getMaxByLexorank,
getNewLexorank,
sortByLexorank,
} from "@/utils/lexorank";
type Props = { type Props = {
statuses: StatusSchema[]; statuses: StatusSchema[];
@ -29,9 +21,9 @@ type Props = {
}; };
type StatusesOperations = { type StatusesOperations = {
onCreateStatus: (name: string) => void; onCreate: (name: string) => void;
onUpdateStatus: (statusId: number, status: UpdateStatusSchema) => void; onUpdate: (statusId: number, status: UpdateStatusSchema) => void;
onDeleteStatus: (status: StatusSchema) => void; onDelete: (status: StatusSchema) => void;
}; };
export const useStatusesOperations = ({ export const useStatusesOperations = ({
@ -40,97 +32,36 @@ export const useStatusesOperations = ({
refetchStatuses, refetchStatuses,
boardId, boardId,
}: Props): StatusesOperations => { }: Props): StatusesOperations => {
const onError = (error: AxiosError<HttpValidationError>) => { return useCrudOperations<
console.error(error); StatusSchema,
notifications.error({ UpdateStatusSchema,
message: error.response?.data?.detail as string | undefined, CreateStatusSchema
}); >({
refetchStatuses(); entities: statuses,
}; setEntities: setStatuses,
refetch: refetchStatuses,
const createStatus = useMutation({ mutations: {
...createStatusMutation(), create: createStatusMutation(),
onError, update: updateStatusMutation(),
onSuccess: res => { delete: deleteStatusMutation(),
setStatuses([...statuses, res.status]);
}, },
}); getCreateEntity: name => {
if (!boardId) return null;
const updateStatus = useMutation({ const lastBoard = getMaxByLexorank(statuses);
...updateStatusMutation(),
onError,
});
const deleteStatus = useMutation({
...deleteStatusMutation(),
onError,
});
const onCreateStatus = (name: string) => {
if (!boardId) return;
const lastStatus = getMaxByLexorank(statuses);
const newLexorank = getNewLexorank( const newLexorank = getNewLexorank(
lastStatus ? LexoRank.parse(lastStatus.lexorank) : null lastBoard ? LexoRank.parse(lastBoard.lexorank) : null
); );
return {
createStatus.mutate({
body: {
status: {
name, name,
boardId, boardId,
lexorank: newLexorank.toString(), lexorank: newLexorank.toString(),
};
}, },
}, getUpdateEntity: (old, update) => ({
...old,
name: update.name ?? old.name,
lexorank: update.lexorank ?? old.lexorank,
}),
getDeleteConfirmTitle: () => "Удаление статуса",
}); });
}; };
const onUpdateStatus = (statusId: number, status: UpdateStatusSchema) => {
updateStatus.mutate({
path: { statusId },
body: { status },
});
setStatuses(statuses =>
sortByLexorank(
statuses.map(oldStatus =>
oldStatus.id !== statusId
? oldStatus
: {
id: oldStatus.id,
name: status.name ? status.name : oldStatus.name,
lexorank: status.lexorank
? status.lexorank
: oldStatus.lexorank,
}
)
)
);
};
const onDeleteStatus = (status: StatusSchema) => {
modals.openConfirmModal({
title: "Удаление колонки",
children: (
<Text>
Вы уверены, что хотите удалить колонку "{status.name}"?
</Text>
),
labels: { confirm: "Да", cancel: "Нет" },
confirmProps: { color: "red" },
onConfirm: () => {
deleteStatus.mutate({
path: { statusId: status.id },
});
setStatuses(statuses =>
statuses.filter(s => s.id !== status.id)
);
},
});
};
return {
onCreateStatus,
onUpdateStatus,
onDeleteStatus,
};
};

View File

@ -161,7 +161,7 @@ export const deleteBoard = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zDeleteBoardResponse2.parseAsync(data); return await zDeleteBoardResponse2.parseAsync(data);
}, },
url: "/board/{boardId}", url: "/board/{pk}",
...options, ...options,
}); });
}; };
@ -184,7 +184,7 @@ export const updateBoard = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zUpdateBoardResponse2.parseAsync(data); return await zUpdateBoardResponse2.parseAsync(data);
}, },
url: "/board/{boardId}", url: "/board/{pk}",
...options, ...options,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -311,7 +311,7 @@ export const deleteProject = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zDeleteProjectResponse2.parseAsync(data); return await zDeleteProjectResponse2.parseAsync(data);
}, },
url: "/project/{projectId}", url: "/project/{pk}",
...options, ...options,
}); });
}; };
@ -334,7 +334,7 @@ export const updateProject = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zUpdateProjectResponse2.parseAsync(data); return await zUpdateProjectResponse2.parseAsync(data);
}, },
url: "/project/{projectId}", url: "/project/{pk}",
...options, ...options,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",
@ -411,7 +411,7 @@ export const deleteStatus = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zDeleteStatusResponse2.parseAsync(data); return await zDeleteStatusResponse2.parseAsync(data);
}, },
url: "/status/{statusId}", url: "/status/{pk}",
...options, ...options,
}); });
}; };
@ -434,7 +434,7 @@ export const updateStatus = <ThrowOnError extends boolean = false>(
responseValidator: async data => { responseValidator: async data => {
return await zUpdateStatusResponse2.parseAsync(data); return await zUpdateStatusResponse2.parseAsync(data);
}, },
url: "/status/{statusId}", url: "/status/{pk}",
...options, ...options,
headers: { headers: {
"Content-Type": "application/json", "Content-Type": "application/json",

View File

@ -22,7 +22,7 @@ export type BoardSchema = {
* CreateBoardRequest * CreateBoardRequest
*/ */
export type CreateBoardRequest = { export type CreateBoardRequest = {
board: CreateBoardSchema; entity: CreateBoardSchema;
}; };
/** /**
@ -33,7 +33,7 @@ export type CreateBoardResponse = {
* Message * Message
*/ */
message: string; message: string;
board: BoardSchema; entity: BoardSchema;
}; };
/** /**
@ -58,7 +58,7 @@ export type CreateBoardSchema = {
* CreateProjectRequest * CreateProjectRequest
*/ */
export type CreateProjectRequest = { export type CreateProjectRequest = {
project: CreateProjectSchema; entity: CreateProjectSchema;
}; };
/** /**
@ -69,7 +69,7 @@ export type CreateProjectResponse = {
* Message * Message
*/ */
message: string; message: string;
project: ProjectSchema; entity: ProjectSchema;
}; };
/** /**
@ -86,7 +86,7 @@ export type CreateProjectSchema = {
* CreateStatusRequest * CreateStatusRequest
*/ */
export type CreateStatusRequest = { export type CreateStatusRequest = {
status: CreateStatusSchema; entity: CreateStatusSchema;
}; };
/** /**
@ -97,7 +97,7 @@ export type CreateStatusResponse = {
* Message * Message
*/ */
message: string; message: string;
status: StatusSchema; entity: StatusSchema;
}; };
/** /**
@ -256,7 +256,7 @@ export type StatusSchema = {
* UpdateBoardRequest * UpdateBoardRequest
*/ */
export type UpdateBoardRequest = { export type UpdateBoardRequest = {
board: UpdateBoardSchema; entity: UpdateBoardSchema;
}; };
/** /**
@ -322,7 +322,7 @@ export type UpdateDealSchema = {
* UpdateProjectRequest * UpdateProjectRequest
*/ */
export type UpdateProjectRequest = { export type UpdateProjectRequest = {
project: UpdateProjectSchema; entity: UpdateProjectSchema;
}; };
/** /**
@ -349,7 +349,7 @@ export type UpdateProjectSchema = {
* UpdateStatusRequest * UpdateStatusRequest
*/ */
export type UpdateStatusRequest = { export type UpdateStatusRequest = {
status: UpdateStatusSchema; entity: UpdateStatusSchema;
}; };
/** /**
@ -454,12 +454,12 @@ export type DeleteBoardData = {
body?: never; body?: never;
path: { path: {
/** /**
* Boardid * Pk
*/ */
boardId: number; pk: number;
}; };
query?: never; query?: never;
url: "/board/{boardId}"; url: "/board/{pk}";
}; };
export type DeleteBoardErrors = { export type DeleteBoardErrors = {
@ -485,12 +485,12 @@ export type UpdateBoardData = {
body: UpdateBoardRequest; body: UpdateBoardRequest;
path: { path: {
/** /**
* Boardid * Pk
*/ */
boardId: number; pk: number;
}; };
query?: never; query?: never;
url: "/board/{boardId}"; url: "/board/{pk}";
}; };
export type UpdateBoardErrors = { export type UpdateBoardErrors = {
@ -618,14 +618,14 @@ export type CreateProjectResponse2 =
export type DeleteProjectData = { export type DeleteProjectData = {
body?: never; body?: never;
path?: never; path: {
query: {
/** /**
* Projectid * Pk
*/ */
projectId: number; pk: number;
}; };
url: "/project/{projectId}"; query?: never;
url: "/project/{pk}";
}; };
export type DeleteProjectErrors = { export type DeleteProjectErrors = {
@ -649,14 +649,14 @@ export type DeleteProjectResponse2 =
export type UpdateProjectData = { export type UpdateProjectData = {
body: UpdateProjectRequest; body: UpdateProjectRequest;
path?: never; path: {
query: {
/** /**
* Projectid * Pk
*/ */
projectId: number; pk: number;
}; };
url: "/project/{projectId}"; query?: never;
url: "/project/{pk}";
}; };
export type UpdateProjectErrors = { export type UpdateProjectErrors = {
@ -739,12 +739,12 @@ export type DeleteStatusData = {
body?: never; body?: never;
path: { path: {
/** /**
* Statusid * Pk
*/ */
statusId: number; pk: number;
}; };
query?: never; query?: never;
url: "/status/{statusId}"; url: "/status/{pk}";
}; };
export type DeleteStatusErrors = { export type DeleteStatusErrors = {
@ -770,12 +770,12 @@ export type UpdateStatusData = {
body: UpdateStatusRequest; body: UpdateStatusRequest;
path: { path: {
/** /**
* Statusid * Pk
*/ */
statusId: number; pk: number;
}; };
query?: never; query?: never;
url: "/status/{statusId}"; url: "/status/{pk}";
}; };
export type UpdateStatusErrors = { export type UpdateStatusErrors = {

View File

@ -24,7 +24,7 @@ export const zCreateBoardSchema = z.object({
* CreateBoardRequest * CreateBoardRequest
*/ */
export const zCreateBoardRequest = z.object({ export const zCreateBoardRequest = z.object({
board: zCreateBoardSchema, entity: zCreateBoardSchema,
}); });
/** /**
@ -32,7 +32,7 @@ export const zCreateBoardRequest = z.object({
*/ */
export const zCreateBoardResponse = z.object({ export const zCreateBoardResponse = z.object({
message: z.string(), message: z.string(),
board: zBoardSchema, entity: zBoardSchema,
}); });
/** /**
@ -46,7 +46,7 @@ export const zCreateProjectSchema = z.object({
* CreateProjectRequest * CreateProjectRequest
*/ */
export const zCreateProjectRequest = z.object({ export const zCreateProjectRequest = z.object({
project: zCreateProjectSchema, entity: zCreateProjectSchema,
}); });
/** /**
@ -62,7 +62,7 @@ export const zProjectSchema = z.object({
*/ */
export const zCreateProjectResponse = z.object({ export const zCreateProjectResponse = z.object({
message: z.string(), message: z.string(),
project: zProjectSchema, entity: zProjectSchema,
}); });
/** /**
@ -78,7 +78,7 @@ export const zCreateStatusSchema = z.object({
* CreateStatusRequest * CreateStatusRequest
*/ */
export const zCreateStatusRequest = z.object({ export const zCreateStatusRequest = z.object({
status: zCreateStatusSchema, entity: zCreateStatusSchema,
}); });
/** /**
@ -95,7 +95,7 @@ export const zStatusSchema = z.object({
*/ */
export const zCreateStatusResponse = z.object({ export const zCreateStatusResponse = z.object({
message: z.string(), message: z.string(),
status: zStatusSchema, entity: zStatusSchema,
}); });
/** /**
@ -185,7 +185,7 @@ export const zUpdateBoardSchema = z.object({
* UpdateBoardRequest * UpdateBoardRequest
*/ */
export const zUpdateBoardRequest = z.object({ export const zUpdateBoardRequest = z.object({
board: zUpdateBoardSchema, entity: zUpdateBoardSchema,
}); });
/** /**
@ -229,7 +229,7 @@ export const zUpdateProjectSchema = z.object({
* UpdateProjectRequest * UpdateProjectRequest
*/ */
export const zUpdateProjectRequest = z.object({ export const zUpdateProjectRequest = z.object({
project: zUpdateProjectSchema, entity: zUpdateProjectSchema,
}); });
/** /**
@ -251,7 +251,7 @@ export const zUpdateStatusSchema = z.object({
* UpdateStatusRequest * UpdateStatusRequest
*/ */
export const zUpdateStatusRequest = z.object({ export const zUpdateStatusRequest = z.object({
status: zUpdateStatusSchema, entity: zUpdateStatusSchema,
}); });
/** /**
@ -288,7 +288,7 @@ export const zCreateBoardResponse2 = zCreateBoardResponse;
export const zDeleteBoardData = z.object({ export const zDeleteBoardData = z.object({
body: z.optional(z.never()), body: z.optional(z.never()),
path: z.object({ path: z.object({
boardId: z.int(), pk: z.int(),
}), }),
query: z.optional(z.never()), query: z.optional(z.never()),
}); });
@ -301,7 +301,7 @@ export const zDeleteBoardResponse2 = zDeleteBoardResponse;
export const zUpdateBoardData = z.object({ export const zUpdateBoardData = z.object({
body: zUpdateBoardRequest, body: zUpdateBoardRequest,
path: z.object({ path: z.object({
boardId: z.int(), pk: z.int(),
}), }),
query: z.optional(z.never()), query: z.optional(z.never()),
}); });
@ -361,10 +361,10 @@ export const zCreateProjectResponse2 = zCreateProjectResponse;
export const zDeleteProjectData = z.object({ export const zDeleteProjectData = z.object({
body: z.optional(z.never()), body: z.optional(z.never()),
path: z.optional(z.never()), path: z.object({
query: z.object({ pk: z.int(),
projectId: z.int(),
}), }),
query: z.optional(z.never()),
}); });
/** /**
@ -374,10 +374,10 @@ export const zDeleteProjectResponse2 = zDeleteProjectResponse;
export const zUpdateProjectData = z.object({ export const zUpdateProjectData = z.object({
body: zUpdateProjectRequest, body: zUpdateProjectRequest,
path: z.optional(z.never()), path: z.object({
query: z.object({ pk: z.int(),
projectId: z.int(),
}), }),
query: z.optional(z.never()),
}); });
/** /**
@ -412,7 +412,7 @@ export const zCreateStatusResponse2 = zCreateStatusResponse;
export const zDeleteStatusData = z.object({ export const zDeleteStatusData = z.object({
body: z.optional(z.never()), body: z.optional(z.never()),
path: z.object({ path: z.object({
statusId: z.int(), pk: z.int(),
}), }),
query: z.optional(z.never()), query: z.optional(z.never()),
}); });
@ -425,7 +425,7 @@ export const zDeleteStatusResponse2 = zDeleteStatusResponse;
export const zUpdateStatusData = z.object({ export const zUpdateStatusData = z.object({
body: zUpdateStatusRequest, body: zUpdateStatusRequest,
path: z.object({ path: z.object({
statusId: z.int(), pk: z.int(),
}), }),
query: z.optional(z.never()), query: z.optional(z.never()),
}); });