feat(ui): перевести фронт с pcp-ui-service на источники, снять gateway catch-all
Запросы 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 бэклога.
This commit is contained in:
@@ -4,6 +4,64 @@ import { apiFetch } from './apiFetch'
|
||||
|
||||
const BASE = '/api/pcp-ballistics'
|
||||
|
||||
export type FlightLinePoint = {
|
||||
time: string
|
||||
revolution: number
|
||||
lat: number
|
||||
long: number
|
||||
latLeft: number
|
||||
longLeft: number
|
||||
latInnerLeft: number
|
||||
longInnerLeft: number
|
||||
latInnerRight: number
|
||||
longInnerRight: number
|
||||
latRight: number
|
||||
longRight: number
|
||||
revSign: 'ASC' | 'DESC'
|
||||
}
|
||||
|
||||
/**
|
||||
* Трасса полёта КА (flight-line) на интервале для отрисовки на карте/таймлайне из
|
||||
* pcp-ballistics-service (GET /api/satellites/{norad}/flight-line). Шаг трассы 60 с.
|
||||
* @param noradId NORAD-идентификатор КА.
|
||||
* @param fromMs Начало интервала, мс от эпохи.
|
||||
* @param toMs Конец интервала, мс от эпохи.
|
||||
*
|
||||
* @returns Точки трассы полёта на интервале.
|
||||
*/
|
||||
export async function fetchFlightLine(
|
||||
noradId: string,
|
||||
fromMs: number,
|
||||
toMs: number,
|
||||
): Promise<FlightLinePoint[]> {
|
||||
const params = new URLSearchParams({
|
||||
time_start: toLocalDateTime(fromMs),
|
||||
time_stop: toLocalDateTime(toMs),
|
||||
})
|
||||
const url = `${BASE}/api/satellites/${encodeURIComponent(noradId)}/flight-line?${params.toString()}`
|
||||
|
||||
let response: Response
|
||||
try {
|
||||
response = await apiFetch(url, { headers: { Accept: 'application/json' } })
|
||||
} catch {
|
||||
throw new TguApiError('Не удалось подключиться к сервису баллистики.', 'network')
|
||||
}
|
||||
|
||||
const text = await response.text()
|
||||
if (!response.ok) {
|
||||
throw new TguApiError(
|
||||
extractErrorText(text) || 'Ошибка сервиса баллистики.',
|
||||
'http',
|
||||
response.status,
|
||||
)
|
||||
}
|
||||
if (!text.trim()) {
|
||||
return []
|
||||
}
|
||||
|
||||
return JSON.parse(text) as FlightLinePoint[]
|
||||
}
|
||||
|
||||
export type PointVisibilityParam = {
|
||||
/** NORAD-идентификатор КА. */
|
||||
noradId: number
|
||||
|
||||
@@ -5,53 +5,21 @@ import {
|
||||
type TguPlanDecisionMessage,
|
||||
type TguPlatform,
|
||||
} from '../model/tguTypes'
|
||||
import { toLocalIso } from '../utils/localTime'
|
||||
import { apiFetch } from './apiFetch'
|
||||
|
||||
export type FlightLinePoint = {
|
||||
time: string
|
||||
revolution: number
|
||||
lat: number
|
||||
long: number
|
||||
latLeft: number
|
||||
longLeft: number
|
||||
latInnerLeft: number
|
||||
longInnerLeft: number
|
||||
latInnerRight: number
|
||||
longInnerRight: number
|
||||
latRight: number
|
||||
longRight: number
|
||||
revSign: 'ASC' | 'DESC'
|
||||
}
|
||||
|
||||
/**
|
||||
* Трасса полёта КА (flight-line) на интервале для отрисовки на карте/таймлайне.
|
||||
* @param noradId NORAD-идентификатор КА.
|
||||
* @param fromMs Начало интервала, мс от эпохи.
|
||||
* @param toMs Конец интервала, мс от эпохи.
|
||||
*
|
||||
* @returns Точки трассы полёта на интервале.
|
||||
* Запросы планирования ТГУ идут напрямую в pcp-tgu-service через gateway (`/api/pcp-tgu` →
|
||||
* :7011), как и остальные tgu-вызовы (см. tguPlanApi.ts). Решение/подтверждение закладки —
|
||||
* на тест-контроллере ТГУ (`/test/tgu/*`, гейт `tgu.test-controller.enabled`, MVP-канал).
|
||||
*/
|
||||
export async function fetchFlightLine(
|
||||
noradId: string,
|
||||
fromMs: number,
|
||||
toMs: number,
|
||||
): Promise<FlightLinePoint[]> {
|
||||
const query = new URLSearchParams({
|
||||
time_start: toLocalIso(fromMs),
|
||||
time_stop: toLocalIso(toMs),
|
||||
})
|
||||
return fetchJson<FlightLinePoint[]>(
|
||||
`/api/tgu-planning/spacecraft/${encodeURIComponent(noradId)}/flight-line?${query}`,
|
||||
)
|
||||
}
|
||||
const BASE = '/api/pcp-tgu'
|
||||
|
||||
/**
|
||||
* Список платформ (КА) ТГУ.
|
||||
* @returns Платформы планирования ТГУ.
|
||||
*/
|
||||
export async function fetchPlatforms(): Promise<TguPlatform[]> {
|
||||
return fetchJson<TguPlatform[]>('/api/tgu-planning/platforms')
|
||||
return fetchJson<TguPlatform[]>(`${BASE}/api/platforms`)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -64,8 +32,8 @@ export async function fetchPlatforms(): Promise<TguPlatform[]> {
|
||||
export async function fetchPlans(historyDays: number, spacecraftId?: string): Promise<TguPlan[]> {
|
||||
const query = new URLSearchParams({ historyDays: String(historyDays) })
|
||||
const path = spacecraftId
|
||||
? `/api/tgu-planning/spacecraft/${encodeURIComponent(spacecraftId)}/plans?${query}`
|
||||
: `/api/tgu-planning/plans?${query}`
|
||||
? `${BASE}/api/plans/${encodeURIComponent(spacecraftId)}?${query}`
|
||||
: `${BASE}/api/plans?${query}`
|
||||
|
||||
return fetchJson<TguPlan[]>(path)
|
||||
}
|
||||
@@ -89,7 +57,7 @@ export async function sendPlanDecision(
|
||||
}
|
||||
|
||||
return fetchJson<TguPlanDecisionMessage>(
|
||||
`/api/tgu-planning/plans/${encodeURIComponent(planId)}/decision?${query}`,
|
||||
`${BASE}/test/tgu/plans/${encodeURIComponent(planId)}/decision?${query}`,
|
||||
{ method: 'POST' },
|
||||
true,
|
||||
)
|
||||
@@ -101,7 +69,7 @@ export async function sendPlanDecision(
|
||||
* @param planId Идентификатор плана.
|
||||
*/
|
||||
export async function dismissPlan(planId: string): Promise<void> {
|
||||
await fetchJson<void>(`/api/tgu-planning/plans/${encodeURIComponent(planId)}/dismiss`, {
|
||||
await fetchJson<void>(`${BASE}/api/plans/${encodeURIComponent(planId)}/dismiss`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
@@ -111,7 +79,7 @@ export async function dismissPlan(planId: string): Promise<void> {
|
||||
* @param planId Идентификатор плана.
|
||||
*/
|
||||
export async function restorePlan(planId: string): Promise<void> {
|
||||
await fetchJson<void>(`/api/tgu-planning/plans/${encodeURIComponent(planId)}/restore`, {
|
||||
await fetchJson<void>(`${BASE}/api/plans/${encodeURIComponent(planId)}/restore`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
@@ -122,7 +90,7 @@ export async function restorePlan(planId: string): Promise<void> {
|
||||
* @param planId Идентификатор плана.
|
||||
*/
|
||||
export async function confirmPlanLayin(planId: string): Promise<void> {
|
||||
await fetchJson<void>(`/api/tgu-planning/plans/${encodeURIComponent(planId)}/confirm-layin`, {
|
||||
await fetchJson<void>(`${BASE}/test/tgu/plans/${encodeURIComponent(planId)}/confirm-layin`, {
|
||||
method: 'POST',
|
||||
})
|
||||
}
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
Возвращает { env, domain, sched } в том же виде, что buildEnv() прототипа,
|
||||
так что ConstellationDashboard рендерит реальные данные без изменений разметки.
|
||||
============================================================ */
|
||||
import { fetchPlatforms, fetchFlightLine, fetchPlans, type FlightLinePoint } from "../../api/tguApi";
|
||||
import { fetchPlatforms, fetchPlans } from "../../api/tguApi";
|
||||
import { fetchStations, type StationDto } from "../../api/stationsApi";
|
||||
import { fetchRequestsForMap } from "../../api/requestApi";
|
||||
import { fetchSatelliteRva } from "../../api/ballisticsApi";
|
||||
import { fetchSatelliteRva, fetchFlightLine, type FlightLinePoint } from "../../api/ballisticsApi";
|
||||
import { fetchPlanModes, type PlanMode } from "../tgu-editor/editorApi";
|
||||
import type { TguPlatform, TguPlan } from "../../model/tguTypes";
|
||||
import type { RequestMapItem } from "../../model/requestTypes";
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
import { useEffect, useMemo, useRef, useState, useCallback, type MutableRefObject } from "react";
|
||||
import { fetchRequestsForMap } from "../../api/requestApi";
|
||||
import { fetchStations, type StationDto } from "../../api/stationsApi";
|
||||
import { fetchFlightLine, type FlightLinePoint } from "../../api/tguApi";
|
||||
import type { RequestMapItem } from "../../model/requestTypes";
|
||||
import { stationPasses, type OrbitPassInfo, type PassRange } from "../tgu-map-2d/geometry/passes";
|
||||
import { fetchPointVisibility, fetchSatelliteRva, type PointVisibilityParam, type RvaZone } from "../../api/ballisticsApi";
|
||||
import { fetchPointVisibility, fetchSatelliteRva, fetchFlightLine, type FlightLinePoint, type PointVisibilityParam, type RvaZone } from "../../api/ballisticsApi";
|
||||
import {
|
||||
buildSurveyRoute,
|
||||
calculateDrops,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { apiFetch } from "../../api/apiFetch";
|
||||
|
||||
export type PlanSurveyMode = {
|
||||
id: number;
|
||||
planId: number;
|
||||
@@ -30,9 +32,10 @@ export type PlanDropMode = {
|
||||
export type PlanMode = PlanSurveyMode | PlanDropMode;
|
||||
|
||||
export async function fetchPlanModes(planId: string): Promise<PlanMode[]> {
|
||||
const response = await fetch(`/api/current-plans/missions/${encodeURIComponent(planId)}/modes`, {
|
||||
headers: { Accept: "application/json" }
|
||||
});
|
||||
const response = await apiFetch(
|
||||
`/api/pcp-mission/api/missions/${encodeURIComponent(planId)}/modes`,
|
||||
{ headers: { Accept: "application/json" } }
|
||||
);
|
||||
if (!response.ok) {
|
||||
throw new Error(`Ошибка загрузки включений плана: ${response.status}`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user