ERP-node/frontend/lib/api/componentApi.ts

121 lines
3.3 KiB
TypeScript

import { apiClient } from "./client";
export interface ComponentStandard {
component_code: string;
component_name: string;
component_name_eng?: string;
description?: string;
category: string;
icon_name?: string;
default_size: {
width: number;
height: number;
};
component_config: {
type: string;
webType?: string;
config_panel?: string;
};
preview_image?: string;
sort_order: number;
is_active: string;
is_public?: string;
company_code?: string;
created_by?: string;
updated_by?: string;
created_date?: string;
updated_date?: string;
}
export interface ComponentQueryParams {
category?: string;
active?: string;
is_public?: string;
search?: string;
sort?: string;
order?: "asc" | "desc";
limit?: number;
offset?: number;
}
export interface ComponentsResponse {
components: ComponentStandard[];
total: number;
limit?: number;
offset?: number;
}
export interface ApiResponse<T> {
success: boolean;
data: T;
message: string;
error?: string;
}
// 컴포넌트 목록 조회
export const getComponents = async (params?: ComponentQueryParams): Promise<ComponentsResponse> => {
const response = await apiClient.get<ApiResponse<ComponentsResponse>>("/admin/component-standards", {
params,
});
return response.data.data;
};
// 컴포넌트 상세 조회
export const getComponent = async (componentCode: string): Promise<ComponentStandard> => {
const response = await apiClient.get<ApiResponse<ComponentStandard>>(`/admin/component-standards/${componentCode}`);
return response.data.data;
};
// 컴포넌트 생성
export const createComponent = async (
data: Omit<ComponentStandard, "created_date" | "updated_date">,
): Promise<ComponentStandard> => {
const response = await apiClient.post<ApiResponse<ComponentStandard>>("/admin/component-standards", data);
return response.data.data;
};
// 컴포넌트 수정
export const updateComponent = async (
componentCode: string,
data: Partial<ComponentStandard>,
): Promise<ComponentStandard> => {
const response = await apiClient.put<ApiResponse<ComponentStandard>>(
`/admin/component-standards/${componentCode}`,
data,
);
return response.data.data;
};
// 컴포넌트 삭제
export const deleteComponent = async (componentCode: string): Promise<void> => {
await apiClient.delete(`/admin/component-standards/${componentCode}`);
};
// 컴포넌트 코드 중복 체크
export const checkComponentDuplicate = async (
componentCode: string,
): Promise<{ isDuplicate: boolean; component_code: string }> => {
const response = await apiClient.get<ApiResponse<{ isDuplicate: boolean; component_code: string }>>(
`/admin/component-standards/check-duplicate/${componentCode}`,
);
return response.data.data;
};
// 카테고리 목록 조회
export const getCategories = async (): Promise<string[]> => {
const response = await apiClient.get<ApiResponse<string[]>>("/admin/component-standards/categories");
return response.data.data;
};
// 통계 조회
export interface ComponentStatistics {
total: number;
byCategory: Array<{ category: string; count: number }>;
byStatus: Array<{ status: string; count: number }>;
}
export const getStatistics = async (): Promise<ComponentStatistics> => {
const response = await apiClient.get<ApiResponse<ComponentStatistics>>("/admin/component-standards/statistics");
return response.data.data;
};