Сервис добавления товара в заказ: FastAPI-приложение для работы с заказами и номенклатурой.
- Python 3.12 — FastAPI, Uvicorn, SQLAlchemy 2.x, Pydantic 2.x
- БД — SQLite по умолчанию (переопределяется через
DATABASE_URL)
| Путь | Назначение |
|---|---|
main.py |
Точка входа FastAPI, подключение роутеров |
database.py |
Подключение к БД, get_db() для зависимостей |
Models/__init__.py |
Модели SQLAlchemy: Category, Nomenclature, Client, Order, OrderItem |
schemas.py |
Pydantic-схемы запросов и ответов API |
routers/orders.py |
Эндпоинты заказов (список, создание, добавление позиции) |
routers/nomenclatures.py |
Эндпоинты номенклатуры (список товаров) |
init_db.py |
Создание таблиц в БД |
seed_db.py |
Заполнение БД тестовыми данными (категории, номенклатура, клиенты, заказы) |
Dockerfile |
Сборка образа: установка зависимостей, init + seed, запуск uvicorn на порту 8000 |
pip install -r requirements.txt
python init_db.py
python seed_db.py
python main.pyЛибо через uvicorn: uvicorn main:app --reload --host 0.0.0.0 --port 8000.
docker build -t order-service .
docker run -p 8000:8000 order-serviceВ образе при сборке выполняются init_db.py и seed_db.py, затем стартует приложение.
- DATABASE_URL — строка подключения к БД (по умолчанию
sqlite:///db.sqlite). Для PostgreSQL или другой СУБД задайте свою URL.
- Swagger UI: после запуска —
http://localhost:8000/docs - ReDoc:
http://localhost:8000/redoc
Основные эндпоинты:
GET /orders— список заказов с позициями.POST /orders— создание заказа (тело:{"client_id": int}).POST /orders/{order_id}/items— добавить товар в заказ (тело:{"nomenclature_id": int, "quantity": int}). При повторной передаче той же номенклатуры количество суммируется. При нехватке остатка — 400. При успешном добавлении указанное количество списывается с остатка номенклатуры.DELETE /orders/{order_id}/items— убрать товар из заказа (тело:{"nomenclature_id": int, "quantity"?: int}). Еслиquantityне указан или больше/равно текущему количеству, позиция удаляется полностью; во всех случаях убранное количество возвращается в остаток номенклатуры.GET /nomenclatures— список номенклатуры (товаров).
- Модели — иерархия категорий (Category.parent_id), связь номенклатуры с категорией, заказ → клиент, заказ → позиции (OrderItem) с фиксацией цены на момент добавления.
- Добавление товара в заказ — уменьшается остаток номенклатуры на складе (
nomenclature.quantity); при нехватке возвращается 400. - Удаление/уменьшение товара в заказе — при частичном или полном удалении позиции количество товара возвращается в остатки номенклатуры.
- Сидер — идемпотентный: проверяет наличие данных перед вставкой, безопасно вызывать повторно.
- БД в Docker — при каждом новом контейнере создаётся своя БД (init + seed). Для сохранения данных монтируйте том с файлом БД или используйте внешнюю БД через
DATABASE_URL.