Files
frontend/apps/sn/app/(map-layout)/map/components/waterRisk/waterRiskClient.ts
T
2026-08-05 16:05:07 +09:00

83 lines
2.7 KiB
TypeScript

import { getData } from "@/app/components/lib/api";
import type {
WaterRiskAreaOption,
WaterRiskMapView,
WaterRiskResultPage,
WaterRiskResultRow,
WaterRiskStatus,
} from "./waterRiskTypes";
export type WaterRiskResultQuery = {
startDate: string;
endDate: string;
ctpvCd?: string;
sggCd?: string;
areaId?: string;
riskStatus?: WaterRiskStatus;
page: number;
size: number;
};
type WaterRiskApiResultRow = Omit<WaterRiskResultRow, "sidoName"> & {
ctpvName: string;
};
/** 통수위험 결과 API 응답을 기존 화면 표시 모델로 정규화한다. */
const normalizeResultRow = (row: WaterRiskApiResultRow): WaterRiskResultRow => ({
...row,
sidoName: row.ctpvName,
currentAccumRainQty: row.currentAccumRainQty ?? null,
pipeSummaries: Array.isArray(row.pipeSummaries) ? row.pipeSummaries : [],
});
/** 등록된 중점관리지역 검색조건을 조회한다. */
export const fetchWaterRiskAreas = async (): Promise<WaterRiskAreaOption[]> => {
const response = await getData("v1/waterRisk/areas");
return Array.isArray(response) ? response : [];
};
/** 기간·행정구역·지역·위험상태에 맞는 결과 페이지를 조회한다. */
export const fetchWaterRiskResults = async (
query: WaterRiskResultQuery,
): Promise<WaterRiskResultPage> => {
const params = new URLSearchParams({
startDate: query.startDate,
endDate: query.endDate,
page: String(query.page),
size: String(query.size),
});
if (query.ctpvCd) params.set("ctpvCd", query.ctpvCd);
if (query.sggCd) params.set("sggCd", query.sggCd);
if (query.areaId) params.set("areaId", query.areaId);
if (query.riskStatus) params.set("riskStatus", query.riskStatus);
const response = await getData(`v1/waterRisk/results?${params.toString()}`);
const items = Array.isArray(response?.items)
? response.items.map((row: WaterRiskApiResultRow) => normalizeResultRow(row))
: [];
return {
items,
total: Number(response?.total ?? 0),
page: Number(response?.page ?? query.page),
size: Number(response?.size ?? query.size),
totalPages: Number(response?.totalPages ?? 0),
};
};
/** 결과 행과 연결된 중점관리지역·유출관로 도형을 조회한다. */
export const fetchWaterRiskMapView = async (
row: WaterRiskResultRow,
): Promise<WaterRiskMapView> => {
if (!row.analysisDate || !row.ctpvCd || !row.sggCd) {
throw new Error("지도 조회에 필요한 분석일·행정구역 정보가 없습니다.");
}
const params = new URLSearchParams({
ctpvCd: row.ctpvCd,
sggCd: row.sggCd,
});
return getData(
`v1/waterRisk/results/${encodeURIComponent(row.analysisDate)}/areas/${encodeURIComponent(row.areaId)}/mapView?${params.toString()}`,
);
};