import { apiClient } from "./client"; /** * 데이터 조회 API */ export const dataApi = { /** * 테이블 데이터 조회 * @param tableName 테이블명 * @param params 조회 파라미터 (검색, 페이징 등) */ getTableData: async ( tableName: string, params?: { page?: number; size?: number; searchTerm?: string; sortBy?: string; sortOrder?: "asc" | "desc"; filters?: Record; }, ): Promise<{ data: any[]; total: number; page: number; size: number; totalPages: number; }> => { const response = await apiClient.get(`/data/${tableName}`, { params }); const raw = response.data || {}; const items: any[] = (raw.data ?? raw.items ?? raw.rows ?? []) as any[]; const page = raw.page ?? params?.page ?? 1; const size = raw.size ?? params?.size ?? items.length; const total = raw.total ?? items.length; const totalPages = raw.totalPages ?? Math.max(1, Math.ceil(total / (size || 1))); return { data: items, total, page, size, totalPages }; }, /** * 특정 레코드 상세 조회 * @param tableName 테이블명 * @param id 레코드 ID */ getRecordDetail: async (tableName: string, id: string | number): Promise => { const response = await apiClient.get(`/data/${tableName}/${id}`); return response.data?.data || response.data; }, /** * 조인된 데이터 조회 * @param leftTable 좌측 테이블명 * @param rightTable 우측 테이블명 * @param leftColumn 좌측 컬럼명 * @param rightColumn 우측 컬럼명 (외래키) * @param leftValue 좌측 값 (필터링) */ getJoinedData: async ( leftTable: string, rightTable: string, leftColumn: string, rightColumn: string, leftValue?: any, ): Promise => { const response = await apiClient.get(`/data/join`, { params: { leftTable, rightTable, leftColumn, rightColumn, leftValue, }, }); const raw = response.data || {}; return (raw.data ?? raw.items ?? raw.rows ?? []) as any[]; }, /** * 레코드 생성 * @param tableName 테이블명 * @param data 레코드 데이터 */ createRecord: async (tableName: string, data: Record): Promise => { const response = await apiClient.post(`/data/${tableName}`, data); return response.data; // success, data, message 포함된 전체 응답 반환 }, /** * 레코드 수정 * @param tableName 테이블명 * @param id 레코드 ID * @param data 수정할 데이터 */ updateRecord: async (tableName: string, id: string | number, data: Record): Promise => { const response = await apiClient.put(`/data/${tableName}/${id}`, data); return response.data; // success, data, message 포함된 전체 응답 반환 }, /** * 레코드 삭제 * @param tableName 테이블명 * @param id 레코드 ID 또는 복합키 객체 */ deleteRecord: async (tableName: string, id: string | number | Record): Promise => { // 복합키 객체인 경우 POST로 전달 if (typeof id === 'object' && !Array.isArray(id)) { const response = await apiClient.post(`/data/${tableName}/delete`, id); return response.data; } // 단일 ID인 경우 기존 방식 const response = await apiClient.delete(`/data/${tableName}/${id}`); return response.data; // success, message 포함된 전체 응답 반환 }, };