import { LayoutStandard, CreateLayoutRequest, UpdateLayoutRequest, GetLayoutsResponse, LayoutCategory, LayoutType, } from "@/types/layout"; import { apiClient } from "./client"; export interface GetLayoutsParams { page?: number; size?: number; category?: LayoutCategory; layoutType?: LayoutType; searchTerm?: string; includePublic?: boolean; } export interface DuplicateLayoutRequest { newName: string; } class LayoutApiService { private basePath = "/layouts"; /** * 레이아웃 목록 조회 */ async getLayouts(params: GetLayoutsParams = {}): Promise { const response = await apiClient.get(this.basePath, { params }); return response.data.data; } /** * 레이아웃 상세 조회 */ async getLayoutById(layoutCode: string): Promise { const response = await apiClient.get(`${this.basePath}/${layoutCode}`); return response.data.data; } /** * 레이아웃 생성 */ async createLayout(data: CreateLayoutRequest): Promise { const response = await apiClient.post(this.basePath, data); return response.data.data; } /** * 레이아웃 수정 */ async updateLayout(layoutCode: string, data: Partial): Promise { const response = await apiClient.put(`${this.basePath}/${layoutCode}`, data); return response.data.data; } /** * 레이아웃 삭제 */ async deleteLayout(layoutCode: string): Promise { await apiClient.delete(`${this.basePath}/${layoutCode}`); } /** * 레이아웃 복제 */ async duplicateLayout(layoutCode: string, data: DuplicateLayoutRequest): Promise { const response = await apiClient.post(`${this.basePath}/${layoutCode}/duplicate`, data); return response.data.data; } /** * 카테고리별 레이아웃 개수 조회 */ async getLayoutCountsByCategory(): Promise> { const response = await apiClient.get(`${this.basePath}/counts-by-category`); return response.data.data; } /** * 레이아웃 검색 */ async searchLayouts( searchTerm: string, params: Omit = {}, ): Promise { return this.getLayouts({ ...params, searchTerm }); } /** * 카테고리별 레이아웃 조회 */ async getLayoutsByCategory( category: LayoutCategory, params: Omit = {}, ): Promise { return this.getLayouts({ ...params, category }); } /** * 레이아웃 타입별 조회 */ async getLayoutsByType( layoutType: LayoutType, params: Omit = {}, ): Promise { return this.getLayouts({ ...params, layoutType }); } /** * 공개 레이아웃만 조회 */ async getPublicLayouts(params: Omit = {}): Promise { return this.getLayouts({ ...params, includePublic: true }); } /** * 개인 레이아웃만 조회 */ async getPrivateLayouts(params: Omit = {}): Promise { return this.getLayouts({ ...params, includePublic: false }); } } // 인스턴스 생성 및 내보내기 export const layoutApi = new LayoutApiService(); // 기본 내보내기 export default layoutApi;