- Vite 마이그레이션, OpenLayers+Deck.gl 지도 연동 - STOMP WebSocket 선박 실시간 데이터 수신 - 선박 범례/필터/카운트, 다크시그널 처리 - Ctrl+Drag 박스선택, 우클릭 컨텍스트 메뉴 - 측정도구, 상세모달, 호버 툴팁 - darkSignalIds Set 패턴, INSHORE/OFFSHORE 타임아웃 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
52 lines
1.5 KiB
JavaScript
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;
|