wing-ops/frontend/src/tabs/board/services/boardApi.ts
htlee ff085252b0 feat(phase4): Board/HNS/Prediction/Aerial/Rescue Mock → API 전환
- Board: 매뉴얼 CRUD + 첨부파일 API (012_board_ext.sql)
- HNS: 분석 CRUD 5개 API (013_hns_analysis.sql)
- Prediction: 분석/역추적/오일펜스 7개 API (014_prediction.sql)
- Aerial: 미디어/CCTV/위성 6개 API + PostGIS (015_aerial.sql)
- Rescue: 구난 작전/시나리오 3개 API + JSONB (016_rescue.sql)
- backtrackMockData.ts 삭제

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 01:17:10 +09:00

137 lines
3.3 KiB
TypeScript

import { api } from '@common/services/api';
// ============================================================
// 인터페이스
// ============================================================
export interface BoardPostItem {
sn: number;
categoryCd: string;
title: string;
authorId: string;
authorName: string;
viewCnt: number;
pinnedYn: string;
regDtm: string;
}
export interface BoardPostDetail extends BoardPostItem {
content: string | null;
mdfcnDtm: string | null;
}
export interface BoardListResponse {
items: BoardPostItem[];
totalCount: number;
page: number;
size: number;
}
export interface BoardListParams {
categoryCd?: string;
search?: string;
page?: number;
size?: number;
}
export interface CreateBoardPostInput {
categoryCd: string;
title: string;
content?: string;
pinnedYn?: string;
}
export interface UpdateBoardPostInput {
title?: string;
content?: string;
pinnedYn?: string;
}
// ============================================================
// API 함수
// ============================================================
export async function fetchBoardPosts(params?: BoardListParams): Promise<BoardListResponse> {
const response = await api.get<BoardListResponse>('/board', { params });
return response.data;
}
export async function fetchBoardPost(sn: number): Promise<BoardPostDetail> {
const response = await api.get<BoardPostDetail>(`/board/${sn}`);
return response.data;
}
export async function createBoardPost(input: CreateBoardPostInput): Promise<{ sn: number }> {
const response = await api.post<{ sn: number }>('/board', input);
return response.data;
}
export async function updateBoardPost(sn: number, input: UpdateBoardPostInput): Promise<void> {
await api.put(`/board/${sn}`, input);
}
export async function deleteBoardPost(sn: number): Promise<void> {
await api.delete(`/board/${sn}`);
}
// ============================================================
// 매뉴얼 API
// ============================================================
export interface ManualItem {
manualSn: number;
catgNm: string;
title: string;
version: string | null;
fileTp: string | null;
fileSz: string | null;
filePath: string | null;
authorNm: string | null;
dwnldCnt: number;
regDtm: string;
}
export interface CreateManualInput {
catgNm: string;
title: string;
version?: string;
fileTp?: string;
fileSz?: string;
filePath?: string;
authorNm?: string;
}
export interface UpdateManualInput {
catgNm?: string;
title?: string;
version?: string;
fileTp?: string;
fileSz?: string;
filePath?: string;
}
export async function fetchManuals(params?: {
category?: string;
search?: string;
}): Promise<ManualItem[]> {
const response = await api.get<ManualItem[]>('/board/manual', { params });
return response.data;
}
export async function createManual(input: CreateManualInput): Promise<{ manualSn: number }> {
const response = await api.post<{ manualSn: number }>('/board/manual', input);
return response.data;
}
export async function updateManual(sn: number, input: UpdateManualInput): Promise<void> {
await api.put(`/board/manual/${sn}`, input);
}
export async function deleteManual(sn: number): Promise<void> {
await api.delete(`/board/manual/${sn}`);
}
export async function incrementManualDownload(sn: number): Promise<void> {
await api.post(`/board/manual/${sn}/download`);
}