Запросы tguApi.ts (platforms/plans/decision/dismiss/restore/confirm-layin) и flight-line переведены с прокси /api/tgu-planning через умирающий pcp-ui-service на прямые вызовы pcp-tgu-service (/api/pcp-tgu, decision и confirm-layin — на тест-контроллер /test/tgu/*) и pcp-ballistics-service. flight-line перенесён в ballisticsApi.ts. editorApi.ts modes переведён с /api/current-plans на /api/pcp-mission. UX-перевод ошибок решения уже жил во фронте (errorMessage в tguApi.ts), серверная обвязка ui-service дублировала. Из config-repo/pcp-gateway-service.yaml снят маршрут ui-catch-all: не-матчнутый /api/** теперь отдаёт 404 на gateway, а не уходит в pcp-ui-service. Шаг 8 (вывод сервиса из эксплуатации: compose/helm/CI/реестр + удаление кода) отложен до проверки репойнта на живом стенде; сервис пока задеплоен без маршрутов. См. docs/план-перевода-с-pcp-ui-service.md и задачу #40 бэклога.
11 KiB
План перевода запросов с pcp-ui-service на источники
Составлено: 2026-06-10. Связано с задачей #40 бэклога бэклог-pcp-tgu-ops-ui.md.
Зачем
pcp-ui-service — наследие старого server-rendered UI (Thymeleaf-страницы + REST-прокси-обвязка
над доменными сервисами). Новый фронт pcp-tgu-ui-service ходит к бэкендам через
pcp-gateway-service, и большинство его клиентов уже бьют в доменные сервисы напрямую
(/api/pcp-tgu, /api/pcp-mission, /api/pcp-ballistics, /api/pcp-complex,
/api/pcp-request). pcp-ui-service остаётся в маршрутизации только как catch-all
(ui-catch-all, order:1 в config-repo/pcp-gateway-service.yaml) для двух поверхностей.
Цель — увести эти две поверхности на источники и вывести pcp-ui-service из эксплуатации.
Кто ещё зависит от pcp-ui-service
Проверено (grep по config-repo/, services/, libs/): никто, кроме фронта и catch-all
gateway. Остальные ссылки — это самопрописка сервиса в Spring Boot Admin
(config-repo/pcp-ui-service.yaml) и комментарии в pcp-types-lib про то, что обогащение
DTO «исторически делалось в ui-service». Восток-запад (межсервис) сервис не вызывает никто.
Карта запросов фронта, идущих через pcp-ui-service
Через catch-all pcp-ui-service сейчас проходят запросы только из двух файлов фронта.
Всё остальное (ballisticsApi, complexPlanApi, missionPlanningApi, requestApi,
tguPlanApi, stationsApi) уже ходит мимо ui-service.
1. src/api/tguApi.ts → /api/tgu-planning/* (+ flight-line)
Контроллер TguPlanningRestController (services/pcp-ui-service/.../controller/TguPlanningController.kt)
проксирует через TguPlanningService/BallisticsService. Источники и реальные пути:
| Запрос фронта (через ui-service) | HTTP | Реальный источник | Путь на источнике |
|---|---|---|---|
/api/tgu-planning/platforms |
GET | pcp-tgu-service | /api/platforms |
/api/tgu-planning/plans?historyDays |
GET | pcp-tgu-service | /api/plans?historyDays |
/api/tgu-planning/spacecraft/{id}/plans?historyDays |
GET | pcp-tgu-service | /api/plans/{spacecraftId}?historyDays |
/api/tgu-planning/plans/{planId}/decision?decision&reason |
POST | pcp-tgu-service (TEST) | /test/tgu/plans/{planId}/decision |
/api/tgu-planning/plans/{planId}/dismiss |
POST | pcp-tgu-service | /api/plans/{planId}/dismiss |
/api/tgu-planning/plans/{planId}/restore |
POST | pcp-tgu-service | /api/plans/{planId}/restore |
/api/tgu-planning/plans/{planId}/confirm-layin?reason |
POST | pcp-tgu-service (TEST) | /test/tgu/plans/{planId}/confirm-layin |
/api/tgu-planning/spacecraft/{noradId}/flight-line |
GET | pcp-ballistics-service | /api/satellites/{noradId}/flight-line (+интервал) |
Что ui-service делает поверх прокси (нельзя потерять при переезде):
- Перевод ошибок в человекочитаемые сообщения для решения по плану (
decision): 404 → «План не найден.» / «Test controller недоступен или отключён.»; 409 → «План не является активным планом, ожидающим решения…»; 5xx → «Test controller недоступен…». Сетевые сбои (WebClientRequestException) → 503 «Test controller недоступен…». При переезде эту UX-обвязку нужно перенести во фронт (tguApi.ts/общийhttp.ts, см. #17), иначе оператор увидит сырой 4xx/5xx. decisionиconfirm-layinидут в тест-контроллер tgu (/test/tgu/...), гейтитсяtgu.test-controller.enabledвconfig-repo/pcp-tgu-service.yaml. Это MVP-канал подтверждений (ср. #13). При переезде поведение не меняется — но прод-канал решений остаётся отдельным вопросом.- DTO (
TguPlanResponse,TguPlatformResponse) проксируются как есть (bodyToFluxтого же типа) — форма ответа источника и ui-service идентична, фронт не сломается по схеме.
2. src/features/tgu-editor/editorApi.ts → /api/current-plans/missions/{planId}/modes
| Запрос фронта (через ui-service) | HTTP | Реальный источник | Путь на источнике |
|---|---|---|---|
/api/current-plans/missions/{planId}/modes |
GET | pcp-mission-planing-service | /api/missions/{missionId}/modes |
CurrentPlansController.modes → MissionService.modesByMission → ${settings.mission-service}
(= pcp.services.mission = pcp-mission-planing-service), прямой проброс List<ModeResponseDTO>.
Фронтовый missionPlanningApi.ts уже ходит в этот же сервис через /api/pcp-mission — endpoint
переезжает туда же.
План перевода (порядок шагов)
Статус (2026-06-10): шаги 1–7 выполнены — фронт ходит в источники напрямую, catch-all снят. Шаг 8 (вывод сервиса из эксплуатации) отложен до проверки репойнта на живом стенде; до этого pcp-ui-service остаётся задеплоен, но без маршрутов (безвреден). Перевод ошибок решения уже жил во фронте (
errorMessageвtguApi.ts) — серверная обвязка ui-service дублировала его, при прямом обращении к tgu ничего не потеряно.
- flight-line →
/api/pcp-ballistics. ПеренестиfetchFlightLineвballisticsApi.ts(там ужеBASE=/api/pcp-ballistics), путь/api/satellites/{noradId}/flight-line+ интервалtime_start/time_stop. Сверить формат точекFlightLinePointс тем, что отдаёт баллистика напрямую (ui-service отдавалcollectList().block()того же flux — форма та же). - platforms / plans / spacecraft-plans →
/api/pcp-tgu. Перепривязать GET-методыtguApi.tsна/api/pcp-tgu+/api/platforms,/api/plans,/api/plans/{id}.tguPlanApi.tsуже использует этот префикс — переиспользовать его конвенции/fetchJson. - dismiss / restore →
/api/pcp-tguна/api/plans/{id}/dismiss|restore(реальный API). - decision / confirm-layin →
/api/pcp-tguна/test/tgu/plans/{id}/decision|confirm-layin. Одновременно перенести во фронт перевод ошибок (карта статусов → сообщения выше). Учесть зависимость отtgu.test-controller.enabled. - modes →
/api/pcp-mission. ВeditorApi.tsзаменить/api/current-plans/missions/{id}/modesна/api/pcp-mission/api/missions/{id}/modes(через общий клиент/apiFetch). Свериться сmissionPlanningApi.ts. - Vite/nginx. Проверить, что
/api/pcp-*и/api/pcp-missionуже проксируются на gateway (да — единый/api→ gateway). Спец-обработка/api/tgu-planning//api/current-plansне нужна. - Снять catch-all. Удалить маршрут
ui-catch-allизconfig-repo/pcp-gateway-service.yaml(после того как фронт перестал слать/api/tgu-planningи/api/current-plans). Проверить, что никакой/api/**больше не должен попадать в ui-service. - Вывод сервиса из эксплуатации. Убрать
pcp-ui-serviceиз gateway-реестра-потребителей,docker-compose/helm/CI (.gitlab/ci/pcp-ui-service.yml, include в.gitlab-ci.yml,changes:-списки),config-repo/pcp-ui-service.yaml, Spring Boot Admin. Код сервиса — архивировать/удалить отдельным шагом после стабилизации.
Риски и на что смотреть
- Потеря UX-перевода ошибок решения — главный функциональный риск. Перенести в фронт вместе с шагом 4, не откладывать.
- Тест-контроллер как канал решений —
decision/confirm-layinостаются на/test/tgu/*. Это сознательный MVP-срез; прод-канал — отдельная задача (ср. #13). - Мёртвые поверхности ui-service. Контроллеры
bookings,catalog,rva,dynamic-plan,tle-analysis,tle-comparison,com-plan,requests,map,satellites/pdcm,RvaControllerи server-rendered страницы новый фронт не вызывает — они умирают вместе с сервисом. Перед удалением кода ещё раз убедиться, что у них нет внешних потребителей (геопортал и т.п.). - Обогащение DTO в ui-service (
BookedSlotDetailsDTO: имя/тип КА добавлялись в ui-service). Если такая обогащённая поверхность понадобится новому фронту — она должна переехать в источник или во фронт, а не остаться «висеть» в умирающем сервисе. Сейчас новый фронт её не использует.