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;
|