Skip to content

Commit d455e58

Browse files
authored
Merge pull request #47 from WorkTechDevelop/feature/add-roles-model-template
Feature/add roles model template
2 parents 21ccb6e + 734bba0 commit d455e58

File tree

6 files changed

+85
-13
lines changed

6 files changed

+85
-13
lines changed

src/features/projects/api/use-get-project.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export const useGetProject = ({ projectId }: UseGetProjectProps) => {
1515
}
1616

1717
try {
18-
const response = await client.getProject(projectId);
18+
const response = await client.getProjectById(projectId);
1919
return response;
2020
} catch (error) {
2121
console.error("Failed to fetch project:", error);

src/features/tasks/api/README.md

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,17 @@
33
Здесь размещаются хуки и функции для работы с задачами через REST API WorkTech.
44

55
## Структура
6-
- **use-get-tasks.ts** — получение всех задач активного проекта.
7-
- **use-create-task.ts** — создание новой задачи.
8-
- **use-update-task.ts** — обновление задачи.
6+
- **use-get-tasks.ts** — получение всех задач активного проекта через `getTasksInProject`.
7+
- **use-create-task.ts** — создание новой задачи с преобразованием типов.
8+
- **use-update-task.ts** — обновление задачи с указанием projectId и taskId.
9+
- **utils.ts** — вспомогательные функции для преобразования типов данных между API и фронтендом.
910
- **...** — другие хуки для работы с комментариями, статусами, связями задач и т.д.
1011

1112
## Как работает
1213
- Каждый хук инкапсулирует вызов определённого эндпоинта WorkTech API.
1314
- Все хуки используют централизованный API-клиент (`rpc.ts`) для авторизации, обработки токенов и ошибок.
1415
- Возвращают данные, статус загрузки, ошибки и функции для вызова (например, `mutate` для создания/обновления).
16+
- Используют функции из `utils.ts` для преобразования типов данных между API и фронтендом.
1517

1618
## Пример использования
1719

@@ -26,4 +28,24 @@ if (error) return <ErrorMessage />;
2628
return <TaskList tasks={tasks} />;
2729
```
2830

29-
> Все функции используют централизованный API-клиент (rpc.ts) для запросов к серверу.
31+
## Преобразование типов
32+
33+
Все ответы от API преобразуются в типы, используемые во фронтенде:
34+
- `TaskDataDto``Task`
35+
- `UserShortDataDto``UserShortData`
36+
37+
Пример:
38+
```tsx
39+
import { useCreateTask } from './use-create-task';
40+
41+
const { mutate } = useCreateTask();
42+
43+
// Данные автоматически преобразуются в нужный формат
44+
mutate({
45+
title: "Новая задача",
46+
priority: "HIGH",
47+
// ...другие поля
48+
});
49+
```
50+
51+
> Все функции используют централизованный API-клиент (rpc.ts) для запросов к серверу и функции из utils.ts для преобразования типов.

src/features/tasks/api/use-create-task.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { client } from "@/lib/rpc";
33
import { TaskModelDTO } from "@/lib/types.api";
44
import { Task } from "../types";
55
import { toast } from "sonner";
6+
import { mapTaskDataDtoToTask } from "./utils";
67

78
type RequestType = TaskModelDTO;
89
type ResponseType = Task;
@@ -13,7 +14,7 @@ export const useCreateTask = () => {
1314
const mutation = useMutation<ResponseType, Error, RequestType>({
1415
mutationFn: async (json: RequestType) => {
1516
const response = await client.createTask(json);
16-
return response;
17+
return mapTaskDataDtoToTask(response);
1718
},
1819
onSuccess: () => {
1920
toast.success("Задача создана успешно");
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import { useQuery } from "@tanstack/react-query";
22
import { client } from "@/lib/rpc";
33
import { Task } from "../types";
4+
import { mapTaskDataDtoToTask } from "./utils";
45

56
export const useGetTasks = () => {
67
const query = useQuery({
78
queryKey: ["tasks"],
89
queryFn: async (): Promise<Task[]> => {
910
try {
10-
const response = await client.getTasks();
11-
return response;
11+
const response = await client.getTasksInProject();
12+
return response.map(mapTaskDataDtoToTask);
1213
} catch (error) {
1314
console.error("Failed to fetch tasks:", error);
1415
throw new Error("Failed to fetch tasks");
1516
}
1617
},
1718
});
18-
19+
1920
return query;
2021
};

src/features/tasks/api/use-update-task.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@ import { client } from "@/lib/rpc";
33
import { UpdateTaskModelDTO } from "@/lib/types.api";
44
import { Task } from "../types";
55
import { toast } from "sonner";
6+
import { mapTaskDataDtoToTask } from "./utils";
67

78
type RequestType = UpdateTaskModelDTO;
89
type ResponseType = Task;
910

10-
export const useUpdateTask = () => {
11+
export const useUpdateTask = (projectId: string, taskId: string) => {
1112
const queryClient = useQueryClient();
1213

1314
const mutation = useMutation<ResponseType, Error, RequestType>({
1415
mutationFn: async (json: RequestType) => {
15-
const response = await client.updateTask(json);
16-
return response;
16+
const response = await client.updateTask(projectId, taskId, json);
17+
return mapTaskDataDtoToTask(response);
1718
},
1819
onSuccess: () => {
1920
toast.success("Задача обновлена успешно");
2021
queryClient.invalidateQueries({ queryKey: ["tasks"] });
21-
queryClient.invalidateQueries({ queryKey: ["task", undefined] });
22+
queryClient.invalidateQueries({ queryKey: ["projects"] });
2223
},
2324
onError: (error: Error) => {
2425
toast.error(error.message || "Ошибка обновления задачи");

src/features/tasks/api/utils.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { TaskDataDto, UserShortDataDto } from "@/lib/types.api";
2+
import { Task, TaskPriority, UserShortData } from "../types";
3+
4+
export const mapUserShortDataDtoToUserShortData = (dto: UserShortDataDto): UserShortData => {
5+
return {
6+
id: dto.id,
7+
email: dto.email,
8+
firstName: dto.firstName,
9+
lastName: dto.lastName || '',
10+
gender: dto.gender as UserShortData['gender'],
11+
};
12+
};
13+
14+
export const mapTaskDataDtoToTask = (dto: TaskDataDto): Task => {
15+
return {
16+
id: dto.id,
17+
title: dto.title,
18+
description: dto.description,
19+
priority: dto.priority as TaskPriority,
20+
assignee: dto.assignee ? mapUserShortDataDtoToUserShortData(dto.assignee) : {
21+
id: '',
22+
email: '',
23+
firstName: '',
24+
lastName: '',
25+
gender: 'MALE',
26+
},
27+
creator: dto.creator ? mapUserShortDataDtoToUserShortData(dto.creator) : {
28+
id: '',
29+
email: '',
30+
firstName: '',
31+
lastName: '',
32+
gender: 'MALE',
33+
},
34+
projectId: dto.projectId,
35+
sprintId: dto.sprintId,
36+
taskType: dto.taskType as Task['taskType'],
37+
status: {
38+
id: dto.status?.id || 0,
39+
code: dto.status?.code || '',
40+
description: dto.status?.description,
41+
},
42+
estimation: dto.estimation,
43+
code: dto.code || '',
44+
creationDate: undefined,
45+
updateDate: undefined,
46+
};
47+
};

0 commit comments

Comments
 (0)