Техническая документация

Symfony API System

Архитектура, сценарии, code-map и эксплуатация.
Версия 3b826a6f1ff4 · подготовлено 7 сентября 2026

Назначение и границы

Клиент должен получить воспроизводимую итоговую цену, а ошибочный налоговый код, товар или купон — понятный отказ.

API расчёта цены и тестовой оплаты с интерактивным разбором суммы. Исправлены модель товара, миграции, валидация и арифметика скидок.

  • Налоги и купоны — учебные справочники; это не налоговая консультация.
  • PayPal/Stripe заменены детерминированными моками; внешних списаний нет.
  • Каталог read-only, история десяти запросов живёт в памяти вкладки.

Архитектура и схемы

  • Сначала рассчитывается налог, затем скидка; итог ограничен снизу нулём.
  • Внутренняя арифметика использует целые центы и округление half-up.
  • Покупка заново рассчитывает сумму на сервере, не доверяя результату из браузера.
Компоненты опубликованного демо
Компоненты опубликованного демо · Mermaid ↓
Основной сценарий
Основной сценарий · Mermaid ↓
Размещение опубликованной версии
Размещение опубликованной версии · Mermaid ↓
Состав данных и границы хранения
Состав данных и границы хранения · Mermaid ↓

Code-map: от функции к коду

Карта привязана к версии 3b826a6f1ff4. Она помогает проследить изменение через интерфейс, API, модуль, данные и проверку.

ФункцияЭкран / APIМодульДанные / проверка
Каталогdemo.html / demo/catalogApiController, Productproduct; readiness, UI
Расчётdemo/quote, calculate-priceApiValidationService, TaxCodeValidator, PriceCalculatorcountry, coupon, product; PriceCalculatorTest, HTTP
ОплатаpurchasePaymentServiceчтение каталога; success / decline / invalid
Миграции и seedCLImigrations, FillCommandтри справочника; migrate, repeat seed

Как работать с картой

  1. Перед изменением найти функцию и пройти связи до API, состояния и хранилища.
  2. Проверить входы, ошибки, повторные события и зависимые сценарии.
  3. После изменения обновить карту и затронутые схемы вместе с кодом.
  4. Выполнить связанные проверки и привязать новые материалы к версии исходников.

Сценарии и API

  1. Рассчитайте цену с налогом и процентным купоном: пример даёт 116,56 €.
  2. Проверьте фиксированную скидку и разбивку суммы.
  3. Введите неправильный код, неизвестный купон или товар.
  4. Выполните успешную тестовую оплату и отклонённый платёж 402.

Проверка опубликованной версии

  • Пять unit-тестов калькулятора и 12 production-состояний; старый общий ApiControllerTest не заявляется пройденным.
  • Original calculation 11656 cents
  • Fixed and empty coupons
  • IT validation
  • Invalid tax 400
  • Unknown coupon 422
  • Missing product 404
  • Invalid field types 400
  • Mock payment success and decline 402
  • Reset and mobile overflow
  • Подтверждённого GitHub CI для этого SHA нет; перечислены выполненные локальные проверки и сценарии опубликованной версии. Исторические CI-ссылки, если есть, отмечены отдельно.

Результаты описывают проверенные сценарии и конкретную версию. Они не являются оценкой коммерческого успеха или качества моделей на независимой выборке.

Измерения

Суммарные ресурсы контейнеров проекта · 2026-09-07T01:08:27 — 01:11:22 UTC
Суммарные ресурсы контейнеров проекта · 2026-09-07T01:08:27 — 01:11:22 UTC · Исходные данные ↓
Измеренные повторения сценария через HTTPS · 2026-09-07T01:08:36 UTC; ограничения методики в JSON
Измеренные повторения сценария через HTTPS · 2026-09-07T01:08:36 UTC; ограничения методики в JSON · Исходные данные ↓
  • Сохранено 12 содержательных кадров фактического интерфейса.
  • Дата, сценарий и версия указаны у каждого кадра.
  • Максимум RAM контейнеров в коротком тесте: 41.34 MiB. Общие службы учитываются отдельно; магазин включает свою БД.
  • Измерено 6 повторений сценария; медиана 306.0 мс, максимум 2364 мс. Время включает браузер и HTTPS; методика и ограничения приложены.

Запуск и эксплуатация

Исходный API сохранён: POST /calculate-price возвращает число, /demo/quote — подробный разбор. POST /purchase выполняет повторный серверный расчёт.

Сборка Dockerfile.portfolio вне VPS использует закреплённый PHP base и composer.lock. Запуск миграций: php bin/console doctrine:migrations:migrate --no-interaction, seed: php bin/console app:fill.

Nginx проксирует localhost:18401 на Apache. БД symfony имеет отдельного пользователя в общем MySQL. /healthz проверяет приложение. Пять unit-тестов покрывают округление, скидки и отрицательный ввод; HTTP QA проверяет реальные статусы ошибок.

Общие правила эксплуатации: готовые файлы и закреплённые образы собираются вне VPS; секреты не входят в артефакты. Общесерверный docker prune не применяется. Логи backend ограничены ротацией, изменения log options требуют пересоздания контейнера.

Перед изменением пройти code-map от функции к экрану/API, модулю и данным. После изменения обновить карту и схемы, выполнить связанные сценарии, включая ошибку, повтор и сброс. Источник истины — конкретная версия кода, а не старая диаграмма.

Откат проверен 2026-09-07T01:00:08.238865+00:00: 20260907-verified → 20260907b → 20260907-verified. После каждого переключения подтверждены HTTPS, readiness и SHA. Это проверка конфигурации и артефактов на одном проверенном SHA; обратная миграция БД не выполнялась.

Стек

Symfony ValidatorПроверка DTO, налогового кода и контрактов.
PHP / PriceCalculatorЦелочисленный расчёт, округление и ограничение скидки.
Doctrine / MySQLТовары, страны, купоны, миграции и воспроизводимый seed.

Материалы и исходники

Исходное тестовое задание: сентябрь 2023. Обновление и демо: 7 сентября 2026.