Админка
Админка находится в frontend/. Она написана на React и TypeScript, использует Ant Design для компонентов, Vite для сборки и Vitest для тестов. Готовую статическую сборку раздаёт nginx.
Устройство
src/pages/— экраны проектов, кампаний, аналитики, биллинга, онбординга и экономики;frontend/nginx/nginx.conf— выдача одностраничного приложения и проксирование/v1и/docsк API;- основной способ авторизации — сессия в cookie с флагом
httpOnly, недоступная JavaScript-коду; - изменяющие запросы проверяют заголовок
Originдля защиты от CSRF (подделки запроса с другого сайта).
Старый статический интерфейс в examples/admin/ оставлен только как история.
Запуск готовой админки
./edge-start.sh 2 --no-hosting
./build.sh all --env 2
./swarm-start.sh 2После запуска админка доступна по адресу http://admin.localhost. Остановка:
./swarm-stop.shРаботающий продукт проверяется только этим общим Swarm-путём. Команды разработки отдельных сервисов не считаются доказательством, что собранные пользовательские образы работают вместе.
Быстрые проверки кода
Их можно выполнять без запуска сервисов:
cd frontend
npm ci
npm run test:run
npm run buildnpm run test:run запускает unit-тесты (маленькие тесты отдельных частей), а npm run build проверяет production-сборку. После изменений API, iframe или интеграции всё равно нужен полный Swarm-smoke.
Важные экраны
/embed объединяет установку и предпросмотр виджета на компьютере/телефоне; старый /launcher перенаправляет сюда. Онбординг копирования подтверждается после успешного ответа буфера обмена. Серверные стадии завершаются действиями, а дашборд ведёт к следующему действию вместо ручного завершения стадии.
В выборе игры по умолчанию видны новые игры и текущий старый шаблон. Переключатель «Показать старые шаблоны» раскрывает остальные доступные шаблоны. Challenges читает цели точных опубликованных версий через GET /v1/admin/projects/{id}/level-goals; настройки шаблона не заменяют цели Match3, Memory и Parcel Pilot. Для колеса дорожки уровней нет. Старые цели тоже получает сервер: он объединяет стандартную конфигурацию шаблона с переопределениями проекта. Смена аккаунта сразу скрывает прежний проект, пока не проверен новый список; поздний ответ прежнего аккаунта игнорируется.
/security — безопасность аккаунта, не выбранного проекта: смена пароля (8–1024 байта UTF-8, подтверждение), собственные активные сессии и их завершение. Смена пароля завершает все сессии. Отзыв текущей сессии ведёт на новый вход. Список загружается страницами; обновление начинает чтение заново. Данные сессий ограничены датами и отметкой текущего входа; токены, хэши и IP не отображаются.
CampaignsPage.tsx управляет условиями кампаний: outcome_id, событиями level_complete, level_id, параметрами trigger_params и безопасным повтором выдачи награды.
TemplatesPage.tsx включает проекту игру и настраивает её внешний вид:
- выбор активного шаблона, включая
match3_v1с движкомgame_run; сервер отказывает в несуществующем шаблоне и в шаблоне без собранного клиента; - карточки отдельных фонов лобби и механики: загрузка (
PUT) и сброс (DELETE) через/v1/admin/projects/{id}/game-assets/{slot}/background, метаданные оригинала и WebP840×1520≤220 КиБ, повторное чтение проекта после сохранения; - под выбором цвета — контраст к подложке игры и пояснение отката на акцент механики при контрасте ниже3:1 или системном цвете по умолчанию; сервер принимает решение;
- предпросмотр открывает оболочку с
mode=preview, а не настоящую партию.
Загрузка идёт как multipart/form-data с полем file. Ограничение размера задано в двух местах и должно совпадать: DefaultBodyLimit на маршруте API и client_max_body_size в frontend/nginx/nginx.conf.
В локальном Swarm админка работает как сервис admin на admin.localhost. В production домен задаётся переменной ADMIN_DOMAIN.