ship-gis/src/api/signalApi.js
HeungTak Lee f4f0cb274f dark 프로젝트 구현 현재 상태 스냅샷
- Vite 마이그레이션, OpenLayers+Deck.gl 지도 연동
- STOMP WebSocket 선박 실시간 데이터 수신
- 선박 범례/필터/카운트, 다크시그널 처리
- Ctrl+Drag 박스선택, 우클릭 컨텍스트 메뉴
- 측정도구, 상세모달, 호버 툴팁
- darkSignalIds Set 패턴, INSHORE/OFFSHORE 타임아웃

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 13:01:54 +09:00

52 lines
1.5 KiB
JavaScript

/**
* 선박 신호 API
* 참조: mda-react-front/src/api/query.ts - getAllSignals()
*/
import { parsePipeMessage, rowToShipObject } from '../common/stompClient';
/**
* 12분 이내 전체 선박 신호 조회
* STOMP 구독 전에 호출하여 초기 선박 데이터 로드
*
* @returns {Promise<Array>} 선박 데이터 배열
*/
export async function fetchAllSignals() {
try {
const response = await fetch('/signal-api/all/12');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
// API 응답 구조: { data: [...] } 또는 직접 배열
const rawData = result?.data || result || [];
if (!Array.isArray(rawData)) {
console.warn('[fetchAllSignals] Invalid response format:', result);
return [];
}
// 각 행을 선박 객체로 변환
const ships = rawData.map((row) => {
// row가 문자열이면 파이프로 파싱, 배열이면 그대로 사용
const parsed = typeof row === 'string' ? parsePipeMessage(row) : row;
return rowToShipObject(parsed);
});
// 좌표가 있는 선박만 필터링
const validShips = ships.filter(s => s.longitude && s.latitude);
console.log(`[fetchAllSignals] Loaded ${validShips.length}/${ships.length} ships (with coords)`);
return validShips;
} catch (error) {
console.error('[fetchAllSignals] Error:', error);
return [];
}
}
export default fetchAllSignals;