Skip to content

universe-coder/test-work-ag

Repository files navigation

Order Service

Сервис добавления товара в заказ: 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

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.

API

  • 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 — список номенклатуры (товаров).

Важные моменты для ознакомления

  1. Модели — иерархия категорий (Category.parent_id), связь номенклатуры с категорией, заказ → клиент, заказ → позиции (OrderItem) с фиксацией цены на момент добавления.
  2. Добавление товара в заказ — уменьшается остаток номенклатуры на складе (nomenclature.quantity); при нехватке возвращается 400.
  3. Удаление/уменьшение товара в заказе — при частичном или полном удалении позиции количество товара возвращается в остатки номенклатуры.
  4. Сидер — идемпотентный: проверяет наличие данных перед вставкой, безопасно вызывать повторно.
  5. БД в Docker — при каждом новом контейнере создаётся своя БД (init + seed). Для сохранения данных монтируйте том с файлом БД или используйте внешнюю БД через DATABASE_URL.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors