83 lines
2.7 KiB
TypeScript
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()}`,
|
|
);
|
|
};
|