Skip to content

Админка ​

Админка находится в frontend/. Она написана на React и TypeScript, использует Ant Design для компонентов, Vite для сборки и Vitest для тестов. Готовую статическую сборку раздаёт nginx.

Устройство ​

  • src/pages/ — экраны проектов, кампаний, аналитики, биллинга, онбординга и экономики;
  • frontend/nginx/nginx.conf — выдача одностраничного приложения и проксирование /v1 и /docs к API;
  • основной способ авторизации — сессия в cookie с флагом httpOnly, недоступная JavaScript-коду;
  • изменяющие запросы проверяют заголовок Origin для защиты от CSRF (подделки запроса с другого сайта).

Старый статический интерфейс в examples/admin/ оставлен только как история.

Запуск готовой админки ​

bash
./edge-start.sh 2 --no-hosting
./build.sh all --env 2
./swarm-start.sh 2

После запуска админка доступна по адресу http://admin.localhost. Остановка:

bash
./swarm-stop.sh

Работающий продукт проверяется только этим общим Swarm-путём. Команды разработки отдельных сервисов не считаются доказательством, что собранные пользовательские образы работают вместе.

Быстрые проверки кода ​

Их можно выполнять без запуска сервисов:

bash
cd frontend
npm ci
npm run test:run
npm run build

npm 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.

Internal & integration documentation