API для хранения и отображения вложенных комментариев с поддержкой полнотекстового поиска на русском языке.
Требования: Docker Compose.
Опционально: go-task.
Все команды находяться тут Taskfile.yaml
git clone <repo-url>
cd CommentTree
task docker:up
# или напрямую:
docker compose up -dПриложение будет доступно на http://localhost:8080.
Конфиг читается из YAML-файла. Каждый параметр можно переопределить переменной окружения.
Полный пример с описанием всех параметров: config.example.yaml.
Для детальной настройки нужно определить файл config.yaml
cp config.yaml config.example.yamlВсе ответы с телом возвращают Content-Type: application/json.
Ошибки возвращаются в формате {"error": "описание"}.
Каждый запрос логируется с уникальным request_id, методом, путём, статусом и временем выполнения.
Создать новый комментарий (корневой или ответ на существующий).
Query параметры:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
parent |
integer | нет | ID родительского комментария. Если не указан — создаётся корневой комментарий. |
Тело запроса:
{
"body": "текст комментария"
}Ответы:
| Код | Описание |
|---|---|
201 Created |
Комментарий создан |
400 Bad Request |
Невалидное тело запроса, пустой body или некорректный parent |
404 Not Found |
Родительский комментарий не найден |
500 Internal Server Error |
Внутренняя ошибка |
Пример — корневой комментарий:
curl -X POST http://localhost:8080/comments/ \
-H "Content-Type: application/json" \
-d '{"body": "Первый комментарий"}'{
"id": 1,
"body": "Первый комментарий",
"depth": 0,
"created_at": "2026-04-04T12:00:00Z"
}Пример — ответ на комментарий:
curl -X POST "http://localhost:8080/comments/?parent=1" \
-H "Content-Type: application/json" \
-d '{"body": "Ответ на первый"}'{
"id": 2,
"body": "Ответ на первый",
"depth": 1,
"created_at": "2026-04-04T12:01:00Z"
}Получить список комментариев с пагинацией.
Пагинация ведётся по корневым комментариям. Все вложенные ответы для корневых комментариев текущей страницы включаются в ответ автоматически.
Query параметры:
| Параметр | Тип | Default | Описание |
|---|---|---|---|
page |
integer | 1 |
Номер страницы (>= 1) |
Ответ 200 OK:
{
"comments": [
{
"id": 1,
"body": "Корневой комментарий",
"depth": 0,
"created_at": "2026-04-04T12:00:00Z"
},
{
"id": 2,
"body": "Ответ на корневой",
"depth": 1,
"created_at": "2026-04-04T12:01:00Z"
}
],
"total_pages": 3
}Пример:
curl "http://localhost:8080/comments/?page=2"Полнотекстовый поиск по телу комментариев (русский язык, PostgreSQL tsvector).
Возвращает найденные комментарии вместе со всеми их потомками.
Query параметры:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
q |
string | да | Поисковый запрос (непустой) |
Ответ 200 OK:
{
"comments": [
{
"id": 5,
"body": "Комментарий о Go",
"depth": 0,
"created_at": "2026-04-04T12:00:00Z"
}
]
}Ошибки:
| Код | Описание |
|---|---|
400 Bad Request |
Параметр q отсутствует или пустой |
Пример:
curl "http://localhost:8080/comments/search?q=golang"Получить комментарий и всё его поддерево (дочерние, внучатые и т.д.).
Path параметры:
| Параметр | Тип | Описание |
|---|---|---|
id |
integer | ID комментария |
Ответ 200 OK:
{
"comments": [
{
"id": 5,
"body": "Родительский комментарий",
"depth": 0,
"created_at": "2026-04-04T12:00:00Z"
},
{
"id": 10,
"body": "Дочерний комментарий",
"depth": 1,
"created_at": "2026-04-04T12:05:00Z"
}
]
}Ошибки:
| Код | Описание |
|---|---|
400 Bad Request |
Некорректный id |
404 Not Found |
Комментарий не найден |
Пример:
curl http://localhost:8080/comments/5Удалить комментарий и всех его потомков (каскадное удаление по path).
Path параметры:
| Параметр | Тип | Описание |
|---|---|---|
id |
integer | ID комментария |
Ответы:
| Код | Описание |
|---|---|
204 No Content |
Комментарий и потомки удалены |
400 Bad Request |
Некорректный id |
404 Not Found |
Комментарий не найден |
Пример:
curl -X DELETE http://localhost:8080/comments/5