Задача
Небольшому книжному магазину нужно было продавать через интернет. Нельзя продать больше экземпляров, чем есть на складе, даже когда двое оформляют заказ одновременно. Старые заказы должны сохранять цены после правок каталога и курсов, а покупатели из разных стран — видеть свой язык и свою валюту.
Решение
Вся бизнес-логика живёт в REST API на Django, приложение на Vue только обращается к нему. Строка заказа хранит название и цену на момент покупки в выбранной валюте. Заказ оплачен только после подписанного вебхука Stripe, каждый возврат — отдельная запись с ключом идемпотентности, поэтому деньги не вернутся дважды.
Решённые задачи
- Сделал каталог с полнотекстовым поиском, который находит книгу даже с опечаткой
- Исключил продажу лишнего экземпляра: оформление блокирует строки книг в одной транзакции
- Посчитал доставку по весу и зоне и налог по стране, штату или индексу
- Подключил оплату картой через Stripe и демо-провайдер с тестовыми картами
- Сделал отмену заказа с возвратом денег, в том числе частичным
- Показал цены в долларах, евро и рублях, валюты добавляются в админке
- Перевёл интерфейс и каталог на русский, английский, французский и немецкий
- Вынес обновление курсов и повтор возвратов в отдельный планировщик
Результат
Магазин принимает заказы с телефона на четырёх языках и в трёх валютах, не продаёт лишнего и сам возвращает деньги при отмене. Код открыт на GitHub, магазин поднимается одной командой docker compose up.
Технологии
PythonDjango REST FrameworkVue 3TypeScriptPostgreSQLStripeDocker