Задача
Покупателю нужен предсказуемый путь от каталога до подтверждённого заказа, а поставщику — управление товарами, остатками и входящими заказами. При этом конкурентные запросы не должны приводить к продаже одного остатка дважды.
Backend-приложение для закупок между покупателями и поставщиками. Проект объединяет каталог, корзину, оформление заказов, импорт прайс-листов, роли пользователей и фоновые операции.
Ключевая сложность проекта находится на границе каталога, корзины, остатков, ролей и длительных фоновых операций.
Покупателю нужен предсказуемый путь от каталога до подтверждённого заказа, а поставщику — управление товарами, остатками и входящими заказами. При этом конкурентные запросы не должны приводить к продаже одного остатка дважды.
DRF принимает запрос, сервисный слой управляет бизнес-транзакцией, PostgreSQL защищает остатки, а Redis и Celery обслуживают кэш и длительные задачи.
Сервисный слой собирает проверки в одном месте и не позволяет контроллеру стать контейнером бизнес-логики.
Покупатель фильтрует каталог, добавляет товары в корзину и изменяет количество позиций. Каталог может обслуживаться из Redis-кэша.
DRF проверяет аутентификацию, роль пользователя, состав корзины и корректность запроса до запуска транзакции.
Сервис оформления заказа открывает transaction.atomic и получает строки остатков через select_for_update, исключая конкурентное списание.
После успешной проверки остатки списываются, заказ и позиции сохраняются как единое согласованное изменение.
Email, импорт прайс-листов и обработка изображений передаются Celery-воркеру и не увеличивают время ответа API.
Инструменты выбраны под конкретные риски: конкуренцию за остатки, длительные операции и повторное использование бизнес-правил.
Оформление вынесено из view в отдельный сценарий, где собраны проверки, блокировки и изменение связанных сущностей.
transaction.atomic и select_for_update защищают остатки в момент конкурентного подтверждения корзин.
Импорт YAML, email и обработка изображений выполняются вне request-response цикла.
Часто читаемые данные кэшируются, а изменения товаров и категорий запускают явную инвалидацию.
Проект проверяет не только отдельные endpoints, но и интеграционный путь покупки от аутентификации до оформления заказа.
Аутентификация, throttling, каталог, корзина, оформление заказа и интеграционный сценарий покупки.
Схема API генерируется через drf-spectacular и доступна в двух форматах документации.
Контейнеризированное окружение и автоматические проверки обеспечивают воспроизводимый запуск.
В кейсе отделены реализованные механизмы от задач, которые остаются следующим уровнем развития.
Для полноценной операционной трассировки нужны отдельная история переходов заказа и журнал действий пользователей.
Ценообразование пока не выделено в самостоятельный расширяемый модуль правил и кампаний.
Следующий шаг — воспроизводимые тесты конкурентного оформления и поведения каталога под нагрузкой.
Главный результат — не количество endpoints, а явное разделение HTTP-слоя, транзакционного заказа, кэша и фоновых задач.
README содержит быстрый старт, API-сценарии, структуру проекта и команды запуска через Docker Compose.