Работающее демо · подготовлено 7 сентября 2026
Fullstack Test Shop
Магазин цифровых товаров с идемпотентными заказами, платёжным inbox и очередью выдачи. В демо можно пройти покупку, повторить событие и восстановить заказ после управляемого сбоя.
01 / Задача
От покупки до единственной выдачи
Повторный клик, повтор webhook и сбой поставщика не должны создавать второй заказ или повторную выдачу. Состояние операции должно оставаться понятным покупателю и оператору.
Для кого: Покупатели цифровых товаров и разработчики платёжных интеграций.
Мой вклад
- Angular-витрина, карточка заказа и история переходов.
- NestJS API, модель PostgreSQL, worker и HTTP-моки двух поставщиков.
- Идемпотентность, восстановление, конкурентные проверки и production-развёртывание.
- Для портфолио: подписанные сессии, собственный сброс, 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 один час, очистка каждые пять минут.
- Пример восстановления намеренно завершает первую попытку одного заказа ошибкой. Он не меняет глобальные режимы поставщиков.
Нужны детали реализации?
Архитектура, code-map, API, проверка, развёртывание и реальные измерения.
Открыть документацию →Скачать материалы ↓