109 lines
3.0 KiB
TypeScript
109 lines
3.0 KiB
TypeScript
|
|
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<string, any>;
|
||
|
|
},
|
||
|
|
): 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<any> => {
|
||
|
|
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<any[]> => {
|
||
|
|
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<string, any>): Promise<any> => {
|
||
|
|
const response = await apiClient.post(`/data/${tableName}`, data);
|
||
|
|
return response.data?.data || response.data;
|
||
|
|
},
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 레코드 수정
|
||
|
|
* @param tableName 테이블명
|
||
|
|
* @param id 레코드 ID
|
||
|
|
* @param data 수정할 데이터
|
||
|
|
*/
|
||
|
|
updateRecord: async (tableName: string, id: string | number, data: Record<string, any>): Promise<any> => {
|
||
|
|
const response = await apiClient.put(`/data/${tableName}/${id}`, data);
|
||
|
|
return response.data?.data || response.data;
|
||
|
|
},
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 레코드 삭제
|
||
|
|
* @param tableName 테이블명
|
||
|
|
* @param id 레코드 ID
|
||
|
|
*/
|
||
|
|
deleteRecord: async (tableName: string, id: string | number): Promise<void> => {
|
||
|
|
await apiClient.delete(`/data/${tableName}/${id}`);
|
||
|
|
},
|
||
|
|
};
|