Демка · 7 сентября 2026

Fullstack Test Shop

Каталог на Angular, API на NestJS, заказы в PostgreSQL. Оплату и выдачу обрабатывает воркер. Поставщики в демке — HTTP-моки. Есть сценарии с таймаутом, повторным webhook и восстановлением заказа.

История реализации: 1–3 сентября 2026. Подготовка портфолио: 7 сентября 2026.Версия 767226bf14 кадров интерфейса

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 / Проверка

Сценарии демки

  1. Выберите товар и выполните успешную тестовую оплату. Дождитесь кода и просмотрите историю.
  2. Повторите то же платёжное событие: код и выдача должны остаться единственными.
  3. Создайте заказ через сценарий сбоя, оплатите и нажмите «Восстановить мой заказ».
  4. Проверьте отказ оплаты, чужой UUID в другой сессии и сброс своего примера.

Результаты проверок

  • Сохранено 14 содержательных кадров фактического интерфейса.
  • Дата, сценарий и версия указаны у каждого кадра.
  • Максимум RAM контейнеров в коротком тесте: 218.56 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
  • Измерено 6 повторений сценария; медиана 129.0 мс, максимум 1939 мс. Время включает браузер и HTTPS; методика и ограничения приложены.

Ограничения

  • Оплата и поставщики — явные моки; деньги не списываются, коды учебные.
  • До 20 заказов на сессию и 1000 новых демонстрационных заказов суммарно. TTL один час, очистка каждые пять минут.
  • Пример восстановления намеренно завершает первую попытку одного заказа ошибкой. Он не меняет глобальные режимы поставщиков.

Технические заметки

Модули, API, схема данных, запуск и результаты проверок.

Документация →Материалы ↓