REST API для управления задачами:
- GET /tasks — список задач (фильтрация по статусу: status=todo|in_progress|done)
- GET /tasks/{id} — получить задачу по ID
- POST /tasks — создать задачу
Особенности:
- Только стандартная библиотека (net/http, context, sync, encoding/json и т.д.)
- Чистая архитектура (domain → repository → service → transport)
- Асинхронный лог через канал и отдельную горутину
- In-memory хранилище (данные теряются при перезапуске)
- Graceful shutdown
Требуется:
- Docker и docker-compose
Команда запуска:
docker-compose up --build -dПроверка:
# Список задач
curl -s http://localhost:8080/tasks | jq
# Создать задачу
curl -s -X POST http://localhost:8080/tasks \
-H 'Content-Type: application/json' \
-d '{"title":"Buy milk","description":"2L whole milk","status":"todo"}' | jq
# Получить по ID
curl -s http://localhost:8080/tasks/1 | jq
# Фильтрация по статусу
curl -s 'http://localhost:8080/tasks?status=in_progress' | jqЛоги приложения:
docker-compose logs -f apiОстановка:
docker-compose downПримечания:
- По умолчанию сервис слушает :8080 и проброшен на localhost:8080.
- Данные хранятся в памяти контейнера и будут потеряны при перезапуске.
Можно переопределять флаги через docker-compose.yml (секция command):
- -addr — адрес HTTP-сервера (по умолчанию :8080)
- -log-buffer — размер буфера канала логгера (по умолчанию 1024)
- -shutdown-timeout — таймаут graceful shutdown (по умолчанию 10s)
Пример (фрагмент docker-compose.yml):
services:
api:
command: ["-addr=:8080", "-log-buffer=2048", "-shutdown-timeout=5s"]Статусы задач: todo, in_progress, done.
Примеры:
- Создать — POST /tasks
- тело: {"title":"...", "description":"...", "status":"todo|in_progress|done"} (status опционален, по умолчанию todo)
- Получить все — GET /tasks
- опционально: ?status=todo|in_progress|done
- Получить по ID — GET /tasks/{id}
Ответы — JSON. Ошибки возвращаются в виде {"error":"..."}.
- cmd/api/main.go — вход, DI, сервер, graceful shutdown
- internal/domain — доменная модель (Task) и валидация
- internal/repository/inmemory — потокобезопасное in-memory хранилище
- internal/service — бизнес-логика
- internal/transport/http — маршрутизация и обработчики
- internal/logger — асинхронный логгер (канал + горутина)
go build -o ./bin/tasks ./cmd/api
./bin/tasks -addr=:8080 -log-buffer=1024 -shutdown-timeout=10s