332 lines
9.1 KiB
TypeScript
332 lines
9.1 KiB
TypeScript
import { apiClient } from "./client";
|
|
import {
|
|
TableCategoryValue,
|
|
CategoryColumn,
|
|
} from "@/types/tableCategoryValue";
|
|
|
|
/**
|
|
* 테이블의 카테고리 컬럼 목록 조회
|
|
*/
|
|
export async function getCategoryColumns(tableName: string) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: CategoryColumn[];
|
|
}>(`/table-categories/${tableName}/columns`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 컬럼 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 메뉴별 카테고리 컬럼 목록 조회
|
|
*
|
|
* @param menuObjid 메뉴 OBJID
|
|
* @returns 해당 메뉴와 상위 메뉴들이 설정한 모든 카테고리 컬럼
|
|
*/
|
|
export async function getCategoryColumnsByMenu(menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: CategoryColumn[];
|
|
}>(`/table-management/menu/${menuObjid}/category-columns`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("메뉴별 카테고리 컬럼 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 목록 조회 (메뉴 스코프)
|
|
*
|
|
* @param tableName 테이블명
|
|
* @param columnName 컬럼명
|
|
* @param includeInactive 비활성 값 포함 여부
|
|
* @param menuObjid 메뉴 OBJID (선택사항, 제공 시 형제 메뉴의 카테고리 값 포함)
|
|
*/
|
|
export async function getCategoryValues(
|
|
tableName: string,
|
|
columnName: string,
|
|
includeInactive: boolean = false,
|
|
menuObjid?: number
|
|
) {
|
|
try {
|
|
const params: any = { includeInactive };
|
|
if (menuObjid) {
|
|
params.menuObjid = menuObjid;
|
|
}
|
|
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: TableCategoryValue[];
|
|
}>(`/table-categories/${tableName}/${columnName}/values`, {
|
|
params,
|
|
});
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 조회 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 추가 (메뉴 스코프)
|
|
*
|
|
* @param value 카테고리 값 정보
|
|
* @param menuObjid 메뉴 OBJID (필수)
|
|
*/
|
|
export async function addCategoryValue(
|
|
value: TableCategoryValue,
|
|
menuObjid: number
|
|
) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: TableCategoryValue;
|
|
}>("/table-categories/values", {
|
|
...value,
|
|
menuObjid, // ← menuObjid 포함
|
|
});
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 추가 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 수정
|
|
*/
|
|
export async function updateCategoryValue(
|
|
valueId: number,
|
|
updates: Partial<TableCategoryValue>
|
|
) {
|
|
try {
|
|
const response = await apiClient.put<{
|
|
success: boolean;
|
|
data: TableCategoryValue;
|
|
}>(`/table-categories/values/${valueId}`, updates);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 수정 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 삭제
|
|
*/
|
|
export async function deleteCategoryValue(valueId: number) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
}>(`/table-categories/values/${valueId}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 삭제 실패:", error);
|
|
|
|
// 백엔드에서 반환한 에러 메시지 전달
|
|
const errorMessage = error.response?.data?.message || error.message;
|
|
return { success: false, error: errorMessage, message: errorMessage };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 일괄 삭제
|
|
*/
|
|
export async function bulkDeleteCategoryValues(valueIds: number[]) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
message: string;
|
|
}>("/table-categories/values/bulk-delete", { valueIds });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 일괄 삭제 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 값 순서 변경
|
|
*/
|
|
export async function reorderCategoryValues(orderedValueIds: number[]) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
message: string;
|
|
}>("/table-categories/values/reorder", { orderedValueIds });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 값 순서 변경 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 카테고리 코드로 라벨 조회
|
|
*
|
|
* @param valueCodes - 카테고리 코드 배열 (예: ["CATEGORY_767659DCUF", "CATEGORY_8292565608"])
|
|
* @returns { [code]: label } 형태의 매핑 객체
|
|
*/
|
|
export async function getCategoryLabelsByCodes(valueCodes: string[]) {
|
|
try {
|
|
if (!valueCodes || valueCodes.length === 0) {
|
|
return { success: true, data: {} };
|
|
}
|
|
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: Record<string, string>;
|
|
}>("/table-categories/labels-by-codes", { valueCodes });
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("카테고리 라벨 조회 실패:", error);
|
|
return { success: false, error: error.message, data: {} };
|
|
}
|
|
}
|
|
|
|
// ================================================
|
|
// 컬럼 매핑 관련 API (논리명 ↔ 물리명)
|
|
// ================================================
|
|
|
|
/**
|
|
* 컬럼 매핑 조회
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param menuObjid - 메뉴 OBJID
|
|
* @returns { logical_column: physical_column } 형태의 매핑 객체
|
|
*/
|
|
export async function getColumnMapping(tableName: string, menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Record<string, string>;
|
|
}>(`/table-categories/column-mapping/${tableName}/${menuObjid}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 조회 실패:", error);
|
|
return { success: false, error: error.message, data: {} };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 논리적 컬럼 목록 조회
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param menuObjid - 메뉴 OBJID
|
|
* @returns 논리적 컬럼 목록
|
|
*/
|
|
export async function getLogicalColumns(tableName: string, menuObjid: number) {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Array<{
|
|
mappingId: number;
|
|
logicalColumnName: string;
|
|
physicalColumnName: string;
|
|
description?: string;
|
|
}>;
|
|
}>(`/table-categories/logical-columns/${tableName}/${menuObjid}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("논리적 컬럼 목록 조회 실패:", error);
|
|
return { success: false, error: error.message, data: [] };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 컬럼 매핑 생성/수정
|
|
*
|
|
* @param data - 컬럼 매핑 정보
|
|
*/
|
|
export async function createColumnMapping(data: {
|
|
tableName: string;
|
|
logicalColumnName: string;
|
|
physicalColumnName: string;
|
|
menuObjid: number;
|
|
description?: string;
|
|
}) {
|
|
try {
|
|
const response = await apiClient.post<{
|
|
success: boolean;
|
|
data: any;
|
|
message: string;
|
|
}>("/table-categories/column-mapping", data);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 생성 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 컬럼 매핑 삭제
|
|
*
|
|
* @param mappingId - 매핑 ID
|
|
*/
|
|
export async function deleteColumnMapping(mappingId: number) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
}>(`/table-categories/column-mapping/${mappingId}`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("컬럼 매핑 삭제 실패:", error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 테이블+컬럼 기준으로 모든 매핑 삭제
|
|
*
|
|
* 메뉴 선택 변경 시 기존 매핑을 모두 삭제하고 새로운 매핑만 추가하기 위해 사용
|
|
*
|
|
* @param tableName - 테이블명
|
|
* @param columnName - 컬럼명
|
|
*/
|
|
export async function deleteColumnMappingsByColumn(tableName: string, columnName: string) {
|
|
try {
|
|
const response = await apiClient.delete<{
|
|
success: boolean;
|
|
message: string;
|
|
deletedCount: number;
|
|
}>(`/table-categories/column-mapping/${tableName}/${columnName}/all`);
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("테이블+컬럼 기준 매핑 삭제 실패:", error);
|
|
return { success: false, error: error.message, deletedCount: 0 };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 2레벨 메뉴 목록 조회
|
|
*
|
|
* 카테고리 컬럼 매핑 생성 시 메뉴 선택용
|
|
*
|
|
* @returns 2레벨 메뉴 목록
|
|
*/
|
|
export async function getSecondLevelMenus() {
|
|
try {
|
|
const response = await apiClient.get<{
|
|
success: boolean;
|
|
data: Array<{
|
|
menuObjid: number;
|
|
menuName: string;
|
|
parentMenuName: string;
|
|
screenCode?: string;
|
|
}>;
|
|
}>("/table-categories/second-level-menus");
|
|
return response.data;
|
|
} catch (error: any) {
|
|
console.error("2레벨 메뉴 목록 조회 실패:", error);
|
|
return { success: false, error: error.message, data: [] };
|
|
}
|
|
}
|
|
|