REST API для управления заказами. Построен на Laravel 12, PostgreSQL и Redis.
- PHP 8.4 (Laravel 12)
- PostgreSQL 16 — основная база данных
- Redis 7 — кэш, очереди, сессии
- Nginx — web-сервер
- Docker / Docker Compose — оркестрация
customers — клиенты
products — товары (SKU, название, категория, остаток, цена)
orders — заказы (статус, сумма, timestamps)
order_items — позиции заказа (связь товар-заказ, количество, цена)
order_exports — журнал экспорта в стороннюю систему
| Метод | Endpoint | Описание | Лимит |
|---|---|---|---|
| GET | /api/v1/products |
Список товаров с фильтрацией | курсорная паг. |
| GET | /api/v1/orders |
Список заказов с фильтрацией | курсорная паг. |
| POST | /api/v1/orders |
Создать заказ | 10/мин |
| GET | /api/v1/orders/{id} |
Детали заказа | — |
| PATCH | /api/v1/orders/{id}/status |
Изменить статус заказа | — |
NEW → CONFIRMED → PROCESSING → SHIPPED → COMPLETED
↓ ↓ ↓
└────────┴────────→ CANCELLED
Финальные статусы (COMPLETED, CANCELLED) не могут быть изменены.
customer_id— ID клиентаstatus— статус (new, confirmed, processing, shipped, completed, cancelled)from/to— диапазон дат создания
Services — вся бизнес-логика вынесена в сервисы:
OrderCreationService— создание заказа с проверкой остатков и пессимистической блокировкойOrderStatefulService— управление статусом заказа и получение деталейOrderPaginationService— курсорная пагинацияProductService/ProductPaginationService— товары и их пагинация
DTOs — запросы преобразуются в DTO перед передачей в сервисы. Фильтры тоже DTO.
State machine — валидация переходов статусов через OrderStatus enum. При переходе NEW → CONFIRMED диспатчится event OrderConfirmed.
Event-driven export — на OrderConfirmed подписан ExportOrderListener, который ставит в очередь ExportOrderJob. Job отправляет данные заказа внешнему API (по умолчанию httpbin для тестов). Результат сохраняется в order_exports с тремя попытками и экспоненциальным backoff.
Caching — список продуктов кэшируется на 60 секунд через spatie/laravel-responsecache.
# Установить env
cp .env.testing .env
# Поднять все сервисы
docker compose up -d
# Миграции + сиды (внутри контейнера)
docker compose exec app php artisan migrate --seedПриложение будет доступно на http://localhost:8080.
Все настройки через .env:
APP_ENV=local
APP_DEBUG=true
DB_HOST=db
REDIS_HOST=redis
QUEUE_CONNECTION=redis
EXPORT_API_URL=https://httpbin.org/post
Queue worker запущен как отдельный контейнер (order-api_queue). Обрабатывает экспорт заказов.
# Мониторинг
docker compose logs -f queue-worker
# Очередь jobs
docker compose exec app php artisan queue:work redis --sleep=3 --tries=3docker compose exec app php artisan testPostman-коллекция с запросами: laravel-orders-api.postman_collection.json
GET /health → 200 OK