ship-gis/src/api/satelliteApi.js
LHT de2cd907f1 feat: 로그인 세션 통합 (인증 가드, fetchWithAuth, 환경변수)
- authStore: 메인 프로젝트 세션 쿠키 기반 인증 상태 관리
- fetchWithAuth: 401 응답 시 메인 프로젝트 로그인 페이지 리다이렉트
- SessionGuard: 앱 진입 시 세션 유효성 검증 래퍼 컴포넌트
- 기존 API 모듈 fetch → fetchWithAuth 전환
- 환경변수에 VITE_MAIN_APP_URL, VITE_DEV_SKIP_AUTH 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 13:54:21 +09:00

483 lines
14 KiB
JavaScript

/**
* 위성 API
*/
import { fetchWithAuth } from './fetchWithAuth';
const SATELLITE_VIDEO_SEARCH_ENDPOINT = '/api/gis/satlit/search';
const SATELLITE_CSV_ENDPOINT = '/api/gis/satlit/excelToJson';
const SATELLITE_DETAIL_ENDPOINT = '/api/gis/satlit/id/search';
const SATELLITE_UPDATE_ENDPOINT = '/api/gis/satlit/update';
const SATELLITE_COMPANY_LIST_ENDPOINT = '/api/gis/satlit/sat-bz/all/search';
const SATELLITE_MANAGE_LIST_ENDPOINT = '/api/gis/satlit/sat-mng/bz/search';
const SATELLITE_SAVE_ENDPOINT = '/api/gis/satlit/save';
const SATELLITE_COMPANY_SEARCH_ENDPOINT = '/api/gis/satlit/sat-bz/search';
const SATELLITE_COMPANY_SAVE_ENDPOINT = '/api/gis/satlit/sat-bz/save';
const SATELLITE_COMPANY_DETAIL_ENDPOINT = '/api/gis/satlit/sat-bz/id/search';
const SATELLITE_COMPANY_UPDATE_ENDPOINT = '/api/gis/satlit/sat-bz/update';
const SATELLITE_MANAGE_SEARCH_ENDPOINT = '/api/gis/satlit/sat-mng/search';
const SATELLITE_MANAGE_SAVE_ENDPOINT = '/api/gis/satlit/sat-mng/save';
const SATELLITE_MANAGE_DETAIL_ENDPOINT = '/api/gis/satlit/sat-mng/id/search';
const SATELLITE_MANAGE_UPDATE_ENDPOINT = '/api/gis/satlit/sat-mng/update';
/**
* 위성영상 목록 조회
*
* @param {Object} params
* @param {number} params.page - 페이지 번호
* @param {string} [params.startDate] - 촬영 시작일
* @param {string} [params.endDate] - 촬영 종료일
* @param {string} [params.satelliteVideoName] - 위성영상명
* @param {string} [params.satelliteVideoTransmissionCycle] - 전송주기
* @param {string} [params.satelliteVideoKind] - 영상 종류
* @param {string} [params.satelliteVideoOrbit] - 위성 궤도
* @param {string} [params.satelliteVideoOrigin] - 영상 출처
* @returns {Promise<{ list: Array, totalPage: number }>}
*/
export async function fetchSatelliteVideoList({
page,
startDate,
endDate,
satelliteVideoName,
satelliteVideoTransmissionCycle,
satelliteVideoKind,
satelliteVideoOrbit,
satelliteVideoOrigin,
}) {
try {
const response = await fetchWithAuth(SATELLITE_VIDEO_SEARCH_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
page,
startDate,
endDate,
satelliteVideoName,
satelliteVideoTransmissionCycle,
satelliteVideoKind,
satelliteVideoOrbit,
satelliteVideoOrigin,
}),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return {
list: result?.satelliteVideoInfoList || [],
totalPage: result?.totalPage || 0,
};
} catch (error) {
console.error('[fetchSatelliteVideoList] Error:', error);
throw error;
}
}
/**
* 위성영상 CSV → JSON 변환 (선박 좌표 추출)
*
* @param {string} csvFileName - CSV 파일명
* @returns {Promise<Array<{ coordinates: [number, number] }>>}
*/
export async function fetchSatelliteCsvFeatures(csvFileName) {
try {
const response = await fetchWithAuth(SATELLITE_CSV_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ csvFileName }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
const data = result?.jsonData;
if (!data) return [];
const parsed = typeof data === 'string' ? JSON.parse(data) : data;
return parsed.map(({ lon, lat }) => ({
coordinates: [parseFloat(lon), parseFloat(lat)],
}));
} catch (error) {
console.error('[fetchSatelliteCsvFeatures] Error:', error);
throw error;
}
}
/**
* 위성영상 상세조회
*
* @param {number} satelliteId - 위성 ID
* @returns {Promise<Object>} SatelliteVideoInfoOneDto
*/
export async function fetchSatelliteVideoDetail(satelliteId) {
try {
const response = await fetchWithAuth(SATELLITE_DETAIL_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ satelliteId }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return result?.satelliteVideoInfoById || null;
} catch (error) {
console.error('[fetchSatelliteVideoDetail] Error:', error);
throw error;
}
}
/**
* 위성영상 수정
*
* @param {Object} params
* @param {number} params.satelliteId
* @param {number} params.satelliteManageId
* @param {string} [params.photographDate]
* @param {string} [params.satelliteVideoName]
* @param {string} [params.satelliteVideoTransmissionCycle]
* @param {string} [params.satelliteVideoKind]
* @param {string} [params.satelliteVideoOrbit]
* @param {string} [params.satelliteVideoOrigin]
* @param {string} [params.photographPurpose]
* @param {string} [params.photographMode]
* @param {string} [params.purchaseCode]
* @param {number} [params.purchasePrice]
*/
export async function updateSatelliteVideo(params) {
try {
const response = await fetchWithAuth(SATELLITE_UPDATE_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[updateSatelliteVideo] Error:', error);
throw error;
}
}
/**
* 사업자 목록 조회
*
* @returns {Promise<Array<{ companyNo: number, companyName: string }>>}
*/
export async function fetchSatelliteCompanyList() {
try {
const response = await fetchWithAuth(SATELLITE_COMPANY_LIST_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({}),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return result?.satelliteCompanyNameList || [];
} catch (error) {
console.error('[fetchSatelliteCompanyList] Error:', error);
throw error;
}
}
/**
* 사업자별 위성명 목록 조회
*
* @param {number} companyNo - 사업자 번호
* @returns {Promise<Array<{ satelliteManageId: number, satelliteName: string }>>}
*/
export async function fetchSatelliteManageList(companyNo) {
try {
const response = await fetchWithAuth(SATELLITE_MANAGE_LIST_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ companyNo }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return result?.satelliteManageInfoList || [];
} catch (error) {
console.error('[fetchSatelliteManageList] Error:', error);
throw error;
}
}
/**
* 위성영상 등록 (multipart/form-data)
*
* @param {FormData} formData - 파일(tifFile, csvFile, cloudMaskFile) + 폼 필드
*/
export async function saveSatelliteVideo(formData) {
try {
const response = await fetchWithAuth(SATELLITE_SAVE_ENDPOINT, {
method: 'POST',
body: formData,
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[saveSatelliteVideo] Error:', error);
throw error;
}
}
/**
* 위성 사업자 목록 검색
*
* @param {Object} params
* @param {string} [params.companyTypeCode] - 사업자 분류 코드
* @param {string} [params.companyName] - 사업자명
* @returns {Promise<{ list: Array, totalPage: number }>}
*/
export async function searchSatelliteCompany({ companyTypeCode, companyName, page, limit }) {
try {
const response = await fetchWithAuth(SATELLITE_COMPANY_SEARCH_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ companyTypeCode, companyName, page, limit }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return {
list: result?.satelliteCompanySearchList || [],
totalPage: result?.totalPage || 0,
};
} catch (error) {
console.error('[searchSatelliteCompany] Error:', error);
throw error;
}
}
/**
* 위성 사업자 등록
*
* @param {Object} params
* @param {string} params.companyTypeCode - 사업자 분류 코드
* @param {string} params.companyName - 사업자명
* @param {string} params.nationalCode - 국가코드
* @param {string} [params.location] - 소재지
* @param {string} [params.companyDetail] - 상세내역
*/
export async function saveSatelliteCompany(params) {
try {
const response = await fetchWithAuth(SATELLITE_COMPANY_SAVE_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[saveSatelliteCompany] Error:', error);
throw error;
}
}
/**
* 위성 사업자 상세조회
*
* @param {number} companyNo - 사업자 번호
* @returns {Promise<Object>} SatelliteCompanySearchDto
*/
export async function fetchSatelliteCompanyDetail(companyNo) {
try {
const response = await fetchWithAuth(SATELLITE_COMPANY_DETAIL_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ companyNo }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return result?.satelliteCompany || null;
} catch (error) {
console.error('[fetchSatelliteCompanyDetail] Error:', error);
throw error;
}
}
/**
* 위성 사업자 수정
*
* @param {Object} params
* @param {number} params.companyNo - 사업자 번호
* @param {string} params.companyTypeCode - 사업자 분류 코드
* @param {string} params.companyName - 사업자명
* @param {string} params.nationalCode - 국가코드
* @param {string} [params.location] - 소재지
* @param {string} [params.companyDetail] - 상세내역
*/
export async function updateSatelliteCompany(params) {
try {
const response = await fetchWithAuth(SATELLITE_COMPANY_UPDATE_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[updateSatelliteCompany] Error:', error);
throw error;
}
}
/**
* 위성관리 목록 검색
*
* @param {Object} params
* @param {number} [params.companyNo] - 사업자 번호
* @param {string} [params.satelliteName] - 위성명
* @param {string} [params.sensorType] - 센서 타입
* @returns {Promise<{ list: Array, totalPage: number }>}
*/
export async function searchSatelliteManage({ companyNo, satelliteName, sensorType, page, limit }) {
try {
const response = await fetchWithAuth(SATELLITE_MANAGE_SEARCH_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ companyNo, satelliteName, sensorType, page, limit }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return {
list: result?.satelliteManageInfoSearchList || [],
totalPage: result?.totalPage || 0,
};
} catch (error) {
console.error('[searchSatelliteManage] Error:', error);
throw error;
}
}
/**
* 위성 관리 등록
*
* @param {Object} params
* @param {number} params.companyNo - 사업자 번호
* @param {string} params.satelliteName - 위성명
* @param {string} [params.sensorType] - 센서 타입
* @param {string} [params.photoResolution] - 촬영 해상도
* @param {string} [params.frequency] - 주파수
* @param {string} [params.photoDetail] - 상세내역
*/
export async function saveSatelliteManage(params) {
try {
const response = await fetchWithAuth(SATELLITE_MANAGE_SAVE_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[saveSatelliteManage] Error:', error);
throw error;
}
}
/**
* 위성 관리 상세조회
*
* @param {number} satelliteManageId - 위성 관리 ID
* @returns {Promise<Object>} SatelliteManageInfoDto
*/
export async function fetchSatelliteManageDetail(satelliteManageId) {
try {
const response = await fetchWithAuth(SATELLITE_MANAGE_DETAIL_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ satelliteManageId }),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const result = await response.json();
return result?.satelliteManageInfo || null;
} catch (error) {
console.error('[fetchSatelliteManageDetail] Error:', error);
throw error;
}
}
/**
* 위성 관리 수정
*
* @param {Object} params
* @param {number} params.satelliteManageId - 위성 관리 ID
* @param {number} params.companyNo - 사업자 번호
* @param {string} params.satelliteName - 위성명
* @param {string} [params.sensorType] - 센서 타입
* @param {string} [params.photoResolution] - 촬영 해상도
* @param {string} [params.frequency] - 주파수
* @param {string} [params.photoDetail] - 상세내역
*/
export async function updateSatelliteManage(params) {
try {
const response = await fetchWithAuth(SATELLITE_MANAGE_UPDATE_ENDPOINT, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(params),
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
} catch (error) {
console.error('[updateSatelliteManage] Error:', error);
throw error;
}
}