Skip to content

Commit 70532bb

Browse files
committed
feat: add test services, methods prioritized, readme, docker
1 parent a314f28 commit 70532bb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+1458
-1269
lines changed

service/Dockerfile

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
FROM ubuntu:latest
2-
LABEL authors="admin"
3-
4-
ENTRYPOINT ["top", "-b"]
1+
FROM eclipse-temurin:21-jre-jammy
2+
VOLUME /tmp
3+
ARG JAR_FILE=target/*.jar
4+
COPY ${JAR_FILE} service.jar
5+
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /service.jar"]

service/src/main/java/service/task/manager/controller/EpicController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,21 @@ public ResponseEntity<Void> delete(
8989
service.delete(id);
9090
return ResponseEntity.noContent().build();
9191
}
92+
93+
@GetMapping("/prioritized")
94+
@Operation(
95+
summary = "Retrieve prioritized epics",
96+
description = "Returns a list of all epics sorted by priority: IN_PROGRESS first, then NEW, and finally DONE. " +
97+
"Within each status, epics are sorted by end time (earliest first)."
98+
)
99+
@ApiResponses(value = {
100+
@ApiResponse(responseCode = "200",
101+
description = "Successfully retrieved the list of prioritized epics"),
102+
@ApiResponse(responseCode = "500",
103+
description = "Internal server exception")
104+
})
105+
public ResponseEntity<List<EpicResponseDto>> prioritized() {
106+
log.info("Fetching prioritized epics");
107+
return ResponseEntity.ok(service.prioritized());
108+
}
92109
}

service/src/main/java/service/task/manager/controller/HistoryController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public class HistoryController {
4343
@ApiResponse(responseCode = "200", description = "History retrieved successfully",
4444
content = @Content(mediaType = "application/json",
4545
array = @ArraySchema(schema = @Schema(implementation = HistoryEntry.class)))),
46-
@ApiResponse(responseCode = "500", description = "Internal server error, possibly due to Redis connectivity issues",
46+
@ApiResponse(responseCode = "500", description = "Internal server exception, possibly due to Redis connectivity issues",
4747
content = @Content)
4848
})
4949
public List<HistoryEntry> getHistory() {
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# README.md для папки `controller`
2+
3+
## Описание
4+
5+
Папка `controller` содержит REST-контроллеры приложения `service.task.manager`, разработанного на Spring Boot. Контроллеры обрабатывают HTTP-запросы для управления задачами, эпиками, подзадачами и историей доступа. Все эндпоинты задокументированы с использованием аннотаций OpenAPI (Swagger), что упрощает интеграцию и тестирование API. Логирование реализовано через SLF4J, а валидация данных — через Jakarta Validation.
6+
7+
## Структура папки
8+
9+
Папка включает следующие контроллеры:
10+
11+
### 1. `EpicController.java`
12+
**Описание**: Управляет эпиками — крупными задачами, содержащими подзадачи.
13+
**Эндпоинты**:
14+
- `POST /epic` — Создание нового эпика.
15+
- `PUT /epic` — Обновление существующего эпика.
16+
- `GET /epic/{id}` — Получение эпика по ID (включая подзадачи).
17+
- `GET /epic` — Получение списка всех эпиков.
18+
- `DELETE /epic/{id}` — Удаление эпика по ID.
19+
- `GET /epic/prioritized` — Получение эпиков, отсортированных по приоритету (`IN_PROGRESS`, `NEW`, `DONE`) и времени завершения.
20+
21+
### 2. `HistoryController.java`
22+
**Описание**: Предоставляет доступ к истории вызовов метода `findById` для задач, эпиков и подзадач.
23+
**Эндпоинты**:
24+
- `GET /history` — Получение последних 10 записей истории доступа.
25+
26+
### 3. `SubtaskController.java`
27+
**Описание**: Управляет подзадачами, связанными с эпиками.
28+
**Эндпоинты**:
29+
- `POST /subtask` — Создание новой подзадачи.
30+
- `PUT /subtask` — Обновление существующей подзадачи.
31+
- `GET /subtask/{id}` — Получение подзадачи по ID.
32+
- `GET /subtask` — Получение списка всех подзадач.
33+
- `DELETE /subtask/{id}` — Удаление подзадачи по ID.
34+
- `GET /subtask/prioritized` — Получение подзадач, отсортированных по приоритету (`IN_PROGRESS`, `NEW`, `DONE`) и времени завершения.
35+
36+
### 4. `TaskController.java`
37+
**Описание**: Управляет задачами — основными единицами работы в системе.
38+
**Эндпоинты**:
39+
- `POST /task` — Создание новой задачи.
40+
- `PUT /task` — Обновление существующей задачи.
41+
- `GET /task/{id}` — Получение задачи по ID.
42+
- `GET /task` — Получение списка всех задач.
43+
- `DELETE /task/{id}` — Удаление задачи по ID.
44+
- `GET /task/prioritized` — Получение задач, отсортированных по приоритету (`IN_PROGRESS`, `NEW`, `DONE`) и времени завершения.
45+
46+
## Основные особенности
47+
48+
- **Документация API**: Эндпоинты аннотированы с помощью `@Operation`, `@ApiResponses`, `@Tag` для генерации спецификации OpenAPI. Документация доступна через Swagger UI по пути `/swagger-ui.html`.
49+
- **Логирование**: Используется SLF4J (`@Slf4j`) для записи операций (создание, обновление, удаление, получение) в логи.
50+
- **Валидация данных**: Входящие запросы проверяются с помощью аннотаций `@Valid`, `@NotNull`, `@Positive`.
51+
- **CORS**: Поддержка кросс-доменных запросов через `@CrossOrigin`.
52+
- **Коды HTTP-ответов**:
53+
- `201 Created` — Успешное создание ресурса.
54+
- `200 OK` — Успешное получение или обновление ресурса.
55+
- `204 No Content` — Успешное удаление ресурса.
56+
- `404 Not Found` — Ресурс не найден.
57+
- `409 Conflict` — Конфликт (например, дублирование имени).
58+
- `500 Internal Server Error` — Внутренняя ошибка (например, проблемы с Redis в `HistoryController`).
59+
- **Сортировка по приоритету**: Эндпоинты `/prioritized` возвращают списки, отсортированные по статусу (`IN_PROGRESS``NEW``DONE`) и времени завершения (от раннего к позднему).
60+
61+
## Зависимости
62+
63+
Контроллеры используют сервисы, инжектируемые через конструктор (`@RequiredArgsConstructor`):
64+
- `EpicService` — для работы с эпиками.
65+
- `HistoryService` — для работы с историей доступа (зависит от Redis).
66+
- `SubtaskService` — для работы с подзадачами.
67+
- `TaskService` — для работы с задачами.
68+
69+
## Документация API
70+
71+
API документируется с использованием Springdoc OpenAPI. Доступ к документации:
72+
- **Swagger UI**: `http://localhost:8080/swagger-ui.html`
73+
- **OpenAPI JSON**: `http://localhost:8080/v3/api-docs`
74+
75+
Конфигурация Springdoc:
76+
- Название API: **Task Manager API**
77+
- Версия: **1.0.0**
78+
- Сортировка: Теги и операции сортируются по алфавиту (`tags-sorter: alpha`, `operations-sorter: alpha`).
79+
80+
## Пример использования
81+
82+
Контроллеры предназначены для взаимодействия с клиентскими приложениями через REST API. Для тестирования используйте Swagger UI или инструменты вроде `curl`.
83+
84+
**Пример создания эпика**:
85+
```bash
86+
curl -X POST http://localhost:8080/epic \
87+
-H "Content-Type: application/json" \
88+
-d '{"name": "Новый эпик", "description": "Описание эпика"}'
89+
```
90+
91+
**Пример получения истории**:
92+
```bash
93+
curl -X GET http://localhost:8080/history
94+
```
95+
96+
## Примечания
97+
98+
- **Redis**: Для работы `HistoryController` требуется подключение к Redis, так как история хранится в кэше.
99+
- **DTO**: Контроллеры используют объекты передачи данных (DTO) для строгой типизации и валидации.
100+
- **RESTful-дизайн**: Эндпоинты следуют принципам REST, обеспечивая удобное взаимодействие.
101+
- **Swagger UI**: Документация API доступна по пути `/swagger-ui.html` после запуска приложения.
102+
103+
## Дополнительно
104+
105+
Для подробной информации о структуре DTO или сервисах см. папки `dto` и `service`. По вопросам настройки или расширения API обращайтесь к документации проекта или разработчикам.

service/src/main/java/service/task/manager/controller/SubtaskController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,21 @@ public ResponseEntity<Void> delete(
9090
service.delete(id);
9191
return ResponseEntity.noContent().build();
9292
}
93+
94+
@GetMapping("/prioritized")
95+
@Operation(
96+
summary = "Retrieve prioritized subtasks",
97+
description = "Returns a list of all subtasks sorted by priority: IN_PROGRESS first, then NEW, and finally DONE. " +
98+
"Within each status, subtasks are sorted by end time (earliest first)."
99+
)
100+
@ApiResponses(value = {
101+
@ApiResponse(responseCode = "200",
102+
description = "Successfully retrieved the list of prioritized subtasks"),
103+
@ApiResponse(responseCode = "500",
104+
description = "Internal server exception")
105+
})
106+
public ResponseEntity<List<SubtaskResponseDto>> prioritized() {
107+
log.info("Fetching prioritized subtasks");
108+
return ResponseEntity.ok(service.prioritized());
109+
}
93110
}

service/src/main/java/service/task/manager/controller/TaskController.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,21 @@ public ResponseEntity<Void> delete(
8989
service.delete(id);
9090
return ResponseEntity.noContent().build();
9191
}
92+
93+
@GetMapping("/prioritized")
94+
@Operation(
95+
summary = "Retrieve prioritized tasks",
96+
description = "Returns a list of all tasks sorted by priority: IN_PROGRESS first, then NEW, and finally DONE. " +
97+
"Within each status, tasks are sorted by end time (earliest first)."
98+
)
99+
@ApiResponses(value = {
100+
@ApiResponse(responseCode = "200",
101+
description = "Successfully retrieved the list of prioritized tasks"),
102+
@ApiResponse(responseCode = "500",
103+
description = "Internal server exception")
104+
})
105+
public ResponseEntity<List<TaskResponseDto>> prioritized() {
106+
log.info("Fetching prioritized subtasks");
107+
return ResponseEntity.ok(service.prioritized());
108+
}
92109
}

0 commit comments

Comments
 (0)