import { Request, Response } from "express"; import { DataflowDiagramService } from "../services/dataflowDiagramService"; interface AuthenticatedRequest extends Request { user?: { userId: string; companyCode: string; }; } const dataflowDiagramService = new DataflowDiagramService(); /** * 관계도 목록 조회 * GET /api/dataflow-diagrams */ export const getDataflowDiagrams = async ( req: AuthenticatedRequest, res: Response ) => { try { const { page = 1, size = 20, searchTerm = "" } = req.query; const companyCode = req.user?.companyCode; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } const result = await dataflowDiagramService.getDataflowDiagrams( companyCode, parseInt(page as string), parseInt(size as string), searchTerm as string ); res.json({ success: true, message: "관계도 목록을 성공적으로 조회했습니다.", data: result, }); } catch (error) { console.error("관계도 목록 조회 실패:", error); res.status(500).json({ success: false, message: "관계도 목록 조회 중 오류가 발생했습니다.", }); } }; /** * 특정 관계도 조회 * GET /api/dataflow-diagrams/:diagramId */ export const getDataflowDiagramById = async ( req: AuthenticatedRequest, res: Response ) => { try { const { diagramId } = req.params; const companyCode = req.user?.companyCode; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } const diagram = await dataflowDiagramService.getDataflowDiagramById( parseInt(diagramId), companyCode ); if (!diagram) { return res.status(404).json({ success: false, message: "관계도를 찾을 수 없습니다.", }); } res.json({ success: true, message: "관계도를 성공적으로 조회했습니다.", data: diagram, }); } catch (error) { console.error("관계도 조회 실패:", error); res.status(500).json({ success: false, message: "관계도 조회 중 오류가 발생했습니다.", }); } }; /** * 관계도 생성 * POST /api/dataflow-diagrams */ export const createDataflowDiagram = async ( req: AuthenticatedRequest, res: Response ) => { try { const { diagram_name, relationships } = req.body; const companyCode = req.user?.companyCode; const userId = req.user?.userId; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } if (!diagram_name || !relationships) { return res.status(400).json({ success: false, message: "관계도 이름과 관계 정보는 필수입니다.", }); } const diagram = await dataflowDiagramService.createDataflowDiagram({ diagram_name, relationships, company_code: companyCode, created_by: userId, }); res.status(201).json({ success: true, message: "관계도가 성공적으로 생성되었습니다.", data: diagram, }); } catch (error: any) { console.error("관계도 생성 실패:", error); // 중복 이름 오류 처리 if ( error.code === "P2002" && error.meta?.target?.includes("diagram_name") ) { return res.status(409).json({ success: false, message: "같은 이름의 관계도가 이미 존재합니다.", }); } res.status(500).json({ success: false, message: "관계도 생성 중 오류가 발생했습니다.", }); } }; /** * 관계도 수정 * PUT /api/dataflow-diagrams/:diagramId */ export const updateDataflowDiagram = async ( req: AuthenticatedRequest, res: Response ) => { try { const { diagramId } = req.params; const { diagram_name, relationships } = req.body; const companyCode = req.user?.companyCode; const userId = req.user?.userId; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } const diagram = await dataflowDiagramService.updateDataflowDiagram( parseInt(diagramId), companyCode, { diagram_name, relationships, updated_by: userId, } ); if (!diagram) { return res.status(404).json({ success: false, message: "관계도를 찾을 수 없습니다.", }); } res.json({ success: true, message: "관계도가 성공적으로 수정되었습니다.", data: diagram, }); } catch (error: any) { console.error("관계도 수정 실패:", error); // 중복 이름 오류 처리 if ( error.code === "P2002" && error.meta?.target?.includes("diagram_name") ) { return res.status(409).json({ success: false, message: "같은 이름의 관계도가 이미 존재합니다.", }); } res.status(500).json({ success: false, message: "관계도 수정 중 오류가 발생했습니다.", }); } }; /** * 관계도 삭제 * DELETE /api/dataflow-diagrams/:diagramId */ export const deleteDataflowDiagram = async ( req: AuthenticatedRequest, res: Response ) => { try { const { diagramId } = req.params; const companyCode = req.user?.companyCode; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } const deleted = await dataflowDiagramService.deleteDataflowDiagram( parseInt(diagramId), companyCode ); if (!deleted) { return res.status(404).json({ success: false, message: "관계도를 찾을 수 없습니다.", }); } res.json({ success: true, message: "관계도가 성공적으로 삭제되었습니다.", }); } catch (error) { console.error("관계도 삭제 실패:", error); res.status(500).json({ success: false, message: "관계도 삭제 중 오류가 발생했습니다.", }); } }; /** * 관계도 복제 * POST /api/dataflow-diagrams/:diagramId/copy */ export const copyDataflowDiagram = async ( req: AuthenticatedRequest, res: Response ) => { try { const { diagramId } = req.params; const { new_name } = req.body; // 선택적 새 이름 const companyCode = req.user?.companyCode; const userId = req.user?.userId; if (!companyCode) { return res.status(401).json({ success: false, message: "인증 정보가 없습니다.", }); } const copiedDiagram = await dataflowDiagramService.copyDataflowDiagram( parseInt(diagramId), companyCode, new_name, userId ); if (!copiedDiagram) { return res.status(404).json({ success: false, message: "원본 관계도를 찾을 수 없습니다.", }); } res.status(201).json({ success: true, message: "관계도가 성공적으로 복제되었습니다.", data: copiedDiagram, }); } catch (error: any) { console.error("관계도 복제 실패:", error); // 중복 이름 오류 처리 if ( error.code === "P2002" && error.meta?.target?.includes("diagram_name") ) { return res.status(409).json({ success: false, message: "같은 이름의 관계도가 이미 존재합니다.", }); } res.status(500).json({ success: false, message: "관계도 복제 중 오류가 발생했습니다.", }); } };