Демка · 7 сентября 2026
Fullstack Test Shop
Каталог на Angular, API на NestJS, заказы в PostgreSQL. Оплату и выдачу обрабатывает воркер. Поставщики в демке — HTTP-моки. Есть сценарии с таймаутом, повторным webhook и восстановлением заказа.
01 / Задача
Магазин цифровых товаров
Двойной клик и повторный webhook не должны создавать второй заказ или выдавать ещё один код. Если поставщик не ответил, нужно разобраться со старым запросом, прежде чем отправлять новый.
Сценарий: Покупка цифровых товаров. Здесь учебный вариант с моками поставщиков.
Что делал
- Витрина, карточка заказа и история статусов на Angular.
- API на NestJS, схема БД, воркер и HTTP-моки двух поставщиков.
- Обработка дублей и сбоев, проверки конкурентных запросов, деплой.
- Для демки добавил сессии, TTL, сброс своих данных и управляемый сбой заказа.
Скриншоты
Экраны, формы, ошибкиСкриншоты, схемы и исходные материалы сохранены на языке оригинала; подписи и описание переведены.
02 / Технологии
Что использовано
Angular / TypeScript
Витрина, сигналы состояния, HTTP-клиент и polling заказа.
NestJS
Контракты, валидация, webhook, операции восстановления и границы демо.
PostgreSQL / Prisma
Снимки денег, inbox, очередь с lease, уникальные индексы и транзакции.
Node.js worker
HTTP-вызовы поставщиков вне короткой транзакции, retry и финальная выдача.
03 / Решения
Как устроен проект
- Цена и скидка вычисляются на сервере и фиксируются в заказе.
- Idempotency-Key защищён уникальным индексом; входные данные повтора сверяются с исходным намерением.
- Webhook сначала сохраняется в durable inbox. Отдельный worker обрабатывает платёж и очередь выдачи.
- Стабильный requestId поставщика сохраняется при повторе. Неоднозначный timeout не разрешает немедленно выдать второй код.
04 / Проверка
Сценарии демки
- Выберите товар и выполните успешную тестовую оплату. Дождитесь кода и просмотрите историю.
- Повторите то же платёжное событие: код и выдача должны остаться единственными.
- Создайте заказ через сценарий сбоя, оплатите и нажмите «Восстановить мой заказ».
- Проверьте отказ оплаты, чужой UUID в другой сессии и сброс своего примера.
Результаты проверок
- Сохранено 14 содержательных кадров фактического интерфейса.
- Дата, сценарий и версия указаны у каждого кадра.
- Максимум RAM контейнеров в коротком тесте: 218.56 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
- Измерено 6 повторений сценария; медиана 129.0 мс, максимум 1939 мс. Время включает браузер и HTTPS; методика и ограничения приложены.
Ограничения
- Оплата и поставщики — явные моки; деньги не списываются, коды учебные.
- До 20 заказов на сессию и 1000 новых демонстрационных заказов суммарно. TTL один час, очистка каждые пять минут.
- Пример восстановления намеренно завершает первую попытку одного заказа ошибкой. Он не меняет глобальные режимы поставщиков.
Технические заметки
Модули, API, схема данных, запуск и результаты проверок.
Документация →Материалы ↓