import { Request, Response } from "express"; import { layoutService } from "../services/layoutService"; import { CreateLayoutRequest, UpdateLayoutRequest, GetLayoutsRequest, DuplicateLayoutRequest, } from "../types/layout"; export class LayoutController { /** * 레이아웃 목록 조회 */ async getLayouts(req: Request, res: Response): Promise { try { const { user } = req as any; const { page = 1, size = 20, category, layoutType, searchTerm, includePublic = true, } = req.query as any; const params = { page: parseInt(page, 10), size: parseInt(size, 10), category, layoutType, searchTerm, companyCode: user.companyCode, includePublic: includePublic === "true", }; const result = await layoutService.getLayouts(params); const response = { ...result, page: params.page, size: params.size, totalPages: Math.ceil(result.total / params.size), }; res.json({ success: true, data: response, }); } catch (error) { console.error("레이아웃 목록 조회 오류:", error); res.status(500).json({ success: false, message: "레이아웃 목록 조회에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 레이아웃 상세 조회 */ async getLayoutById(req: Request, res: Response): Promise { try { const { user } = req as any; const { id: layoutCode } = req.params; const layout = await layoutService.getLayoutById( layoutCode, user.companyCode ); if (!layout) { res.status(404).json({ success: false, message: "레이아웃을 찾을 수 없습니다.", }); return; } res.json({ success: true, data: layout, }); } catch (error) { console.error("레이아웃 상세 조회 오류:", error); res.status(500).json({ success: false, message: "레이아웃 상세 조회에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 레이아웃 생성 */ async createLayout(req: Request, res: Response): Promise { try { const { user } = req as any; const layoutRequest: CreateLayoutRequest = req.body; // 요청 데이터 검증 if ( !layoutRequest.layoutName || !layoutRequest.layoutType || !layoutRequest.category ) { res.status(400).json({ success: false, message: "필수 필드가 누락되었습니다. (layoutName, layoutType, category)", }); return; } if (!layoutRequest.layoutConfig || !layoutRequest.zonesConfig) { res.status(400).json({ success: false, message: "레이아웃 설정과 존 설정은 필수입니다.", }); return; } const layout = await layoutService.createLayout( layoutRequest, user.companyCode, user.userId ); res.status(201).json({ success: true, data: layout, message: "레이아웃이 성공적으로 생성되었습니다.", }); } catch (error) { console.error("레이아웃 생성 오류:", error); res.status(500).json({ success: false, message: "레이아웃 생성에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 레이아웃 수정 */ async updateLayout(req: Request, res: Response): Promise { try { const { user } = req as any; const { id: layoutCode } = req.params; const updateRequest: Partial = req.body; const updatedLayout = await layoutService.updateLayout( { ...updateRequest, layoutCode }, user.companyCode, user.userId ); if (!updatedLayout) { res.status(404).json({ success: false, message: "레이아웃을 찾을 수 없거나 수정 권한이 없습니다.", }); return; } res.json({ success: true, data: updatedLayout, message: "레이아웃이 성공적으로 수정되었습니다.", }); } catch (error) { console.error("레이아웃 수정 오류:", error); res.status(500).json({ success: false, message: "레이아웃 수정에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 레이아웃 삭제 */ async deleteLayout(req: Request, res: Response): Promise { try { const { user } = req as any; const { id: layoutCode } = req.params; await layoutService.deleteLayout( layoutCode, user.companyCode, user.userId ); res.json({ success: true, message: "레이아웃이 성공적으로 삭제되었습니다.", }); } catch (error) { console.error("레이아웃 삭제 오류:", error); res.status(500).json({ success: false, message: "레이아웃 삭제에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 레이아웃 복제 */ async duplicateLayout(req: Request, res: Response): Promise { try { const { user } = req as any; const { id: layoutCode } = req.params; const { newName }: DuplicateLayoutRequest = req.body; if (!newName) { res.status(400).json({ success: false, message: "새 레이아웃 이름이 필요합니다.", }); return; } const duplicatedLayout = await layoutService.duplicateLayout( layoutCode, newName, user.companyCode, user.userId ); res.status(201).json({ success: true, data: duplicatedLayout, message: "레이아웃이 성공적으로 복제되었습니다.", }); } catch (error) { console.error("레이아웃 복제 오류:", error); res.status(500).json({ success: false, message: "레이아웃 복제에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } /** * 카테고리별 레이아웃 개수 조회 */ async getLayoutCountsByCategory(req: Request, res: Response): Promise { try { const { user } = req as any; const counts = await layoutService.getLayoutCountsByCategory( user.companyCode ); res.json({ success: true, data: counts, }); } catch (error) { console.error("카테고리별 레이아웃 개수 조회 오류:", error); res.status(500).json({ success: false, message: "카테고리별 레이아웃 개수 조회에 실패했습니다.", error: error instanceof Error ? error.message : "Unknown error", }); } } } export const layoutController = new LayoutController();