76 lines
2.8 KiB
TypeScript
76 lines
2.8 KiB
TypeScript
import type {
|
|
ObsltPplBusiness,
|
|
ObsltPplBusinessSaveRequest,
|
|
ObsltPplImportResult,
|
|
ObsltPplPage,
|
|
} from "../model/obslt-ppl-types";
|
|
|
|
import {
|
|
deleteData,
|
|
getData,
|
|
postRawJson,
|
|
putData,
|
|
} from "@/components/lib/api";
|
|
|
|
const API_PATH = "v1/obsltPplBiz";
|
|
const EXCEL_DOWNLOAD_PAGE_SIZE = 500;
|
|
|
|
/** 공통 응답 래퍼가 있는 JSON 응답에서 data를 안전하게 꺼낸다. */
|
|
const unwrapData = <T>(body: unknown): T => {
|
|
if (body && typeof body === "object" && "data" in body) {
|
|
return (body as { data: T }).data;
|
|
}
|
|
return body as T;
|
|
};
|
|
|
|
/** 목록 검색조건과 페이지 번호로 활성 사업 목록을 조회한다. */
|
|
export const getObsltPplBusinesses = async (params: URLSearchParams): Promise<ObsltPplPage> =>
|
|
getData(`${API_PATH}?${params.toString()}`) as Promise<ObsltPplPage>;
|
|
|
|
/** 적용된 조회조건을 유지하며 모든 페이지를 순회해 Excel 다운로드 대상 전체를 모은다. */
|
|
export const getAllObsltPplBusinesses = async (searchParams: URLSearchParams): Promise<ObsltPplBusiness[]> => {
|
|
const rows: ObsltPplBusiness[] = [];
|
|
let page = 0;
|
|
let totalPages = 1;
|
|
|
|
while (page < totalPages) {
|
|
const params = new URLSearchParams(searchParams);
|
|
params.set("page", String(page));
|
|
params.set("size", String(EXCEL_DOWNLOAD_PAGE_SIZE));
|
|
params.set("sort", "obsltSwagePplBizSn,asc");
|
|
const result = await getObsltPplBusinesses(params);
|
|
rows.push(...result.content);
|
|
totalPages = result.totalPages;
|
|
page += 1;
|
|
}
|
|
return rows;
|
|
};
|
|
|
|
/** 수정 화면에서 사업 상세 한 건을 조회한다. */
|
|
export const getObsltPplBusiness = async (id: string): Promise<ObsltPplBusiness> =>
|
|
getData(`${API_PATH}/${encodeURIComponent(id)}`) as Promise<ObsltPplBusiness>;
|
|
|
|
/** 등록 화면의 입력값으로 사업 한 건을 생성한다. */
|
|
export const createObsltPplBusiness = async (
|
|
request: ObsltPplBusinessSaveRequest,
|
|
): Promise<ObsltPplBusiness> =>
|
|
unwrapData<ObsltPplBusiness>(await postRawJson(API_PATH, request));
|
|
|
|
/** 수정 화면의 입력값으로 사업 한 건을 갱신한다. */
|
|
export const updateObsltPplBusiness = async (
|
|
id: string,
|
|
request: ObsltPplBusinessSaveRequest,
|
|
): Promise<ObsltPplBusiness> =>
|
|
putData(`${API_PATH}/${encodeURIComponent(id)}`, request) as Promise<ObsltPplBusiness>;
|
|
|
|
/** 수정 화면에서 선택 사업을 논리삭제한다. */
|
|
export const deleteObsltPplBusiness = async (id: string): Promise<void> => {
|
|
await deleteData(`${API_PATH}/${encodeURIComponent(id)}`);
|
|
};
|
|
|
|
/** 브라우저에서 파싱한 두 시트 JSON을 활성행 UPDATE·신규 INSERT 방식으로 저장한다. */
|
|
export const uploadObsltPplExcel = async (
|
|
rows: ObsltPplBusinessSaveRequest[],
|
|
): Promise<ObsltPplImportResult> =>
|
|
unwrapData<ObsltPplImportResult>(await postRawJson(`${API_PATH}/excel/upload`, rows));
|