Files

72 lines
2.5 KiB
TypeScript

/** 노후관로의 지도와 목록이 사용하는 DB 레이어 설정 계약이다. */
import { getRawJson } from "@/shared/api/sewerage-api";
import {
buildAgedPipeCqlFilters,
isAgedPipeLayerNode,
type AgedPipeFilters,
} from "@/entities/facility/lib/aged-pipe-utils";
/** DB 응답을 그대로 보존하며 최초 표출 전에 필터만 해석한다. */
export const prepareAgedPipeLayerRows = (
rows: any[],
filters: AgedPipeFilters,
): any[] =>
rows.map((row) => {
const next = { ...row };
if (isAgedPipeLayerNode(row)) {
next.agedPipeFilterTemplate = row.flterSql;
try {
validateAgedPipeLayer(row);
next.flterSql = buildAgedPipeCqlFilters(filters, row.flterSql).join(
" AND ",
);
} catch (error) {
// 노후관로 DB 미전환이 다른 시설물 레이어까지 중단시키지 않도록 이 행만 차단한다.
next.agedPipeConfigError =
error instanceof Error ? error.message : "노후관로 레이어 설정 오류";
next.actlLyrYn = "N";
next.flterSql = "EXCLUDE";
}
}
if (Array.isArray(row.children))
next.children = prepareAgedPipeLayerRows(row.children, filters);
return next;
});
/** 환경마다 달라질 수 있는 일련번호 대신 DB 업무명을 통해 설정 행을 찾는다. */
export const findAgedPipeLayer = (rows: any[]): any | undefined => {
for (const row of rows) {
if (isAgedPipeLayerNode(row)) return row;
const child = Array.isArray(row.children)
? findAgedPipeLayer(row.children)
: undefined;
if (child) return child;
}
};
/** 예전 제어용 행을 실제 WFS 레이어처럼 요청하지 않도록 전환 상태를 확인한다. */
export const validateAgedPipeLayer = (row: any) => {
if (row?.agedPipeConfigError) throw new Error(row.agedPipeConfigError);
if (
!row ||
row.actlLyrYn !== "Y" ||
row.srvcNm !== "wfs" ||
!row.lyrTyNm ||
row.lyrTyNm === "tb_old_pipe"
) {
throw new Error(
"노후관로 DB 레이어 설정을 실제 WFS 레이어와 sql_filt 템플릿으로 갱신해 주세요.",
);
}
};
/** 독립 목록 팝업도 부모창의 하드코딩 없이 동일 설정 API를 조회한다. */
export const fetchAgedPipeLayer = async () => {
const rows = await getRawJson(
"/sewerage-service/api/v1/map/lyrStngs/SN_NETWORK",
);
const row = findAgedPipeLayer(Array.isArray(rows) ? rows : []);
validateAgedPipeLayer(row);
return row;
};