import { Response } from "express"; import { AuthenticatedRequest } from "../middleware/authMiddleware"; import excelMappingService from "../services/excelMappingService"; import { logger } from "../utils/logger"; /** * 엑셀 컬럼 구조로 매핑 템플릿 조회 * POST /api/excel-mapping/find */ export async function findMappingByColumns( req: AuthenticatedRequest, res: Response ): Promise { try { const { tableName, excelColumns } = req.body; const companyCode = req.user?.companyCode || "*"; if (!tableName || !excelColumns || !Array.isArray(excelColumns)) { res.status(400).json({ success: false, message: "tableName과 excelColumns(배열)가 필요합니다.", }); return; } logger.info("엑셀 매핑 템플릿 조회 요청", { tableName, excelColumns, companyCode, userId: req.user?.userId, }); const template = await excelMappingService.findMappingByColumns( tableName, excelColumns, companyCode ); if (template) { res.json({ success: true, data: template, message: "기존 매핑 템플릿을 찾았습니다.", }); } else { res.json({ success: true, data: null, message: "일치하는 매핑 템플릿이 없습니다.", }); } } catch (error: any) { logger.error("매핑 템플릿 조회 실패", { error: error.message }); res.status(500).json({ success: false, message: "매핑 템플릿 조회 중 오류가 발생했습니다.", error: error.message, }); } } /** * 매핑 템플릿 저장 (UPSERT) * POST /api/excel-mapping/save */ export async function saveMappingTemplate( req: AuthenticatedRequest, res: Response ): Promise { try { const { tableName, excelColumns, columnMappings } = req.body; const companyCode = req.user?.companyCode || "*"; const userId = req.user?.userId; if (!tableName || !excelColumns || !columnMappings) { res.status(400).json({ success: false, message: "tableName, excelColumns, columnMappings가 필요합니다.", }); return; } logger.info("엑셀 매핑 템플릿 저장 요청", { tableName, excelColumns, columnMappings, companyCode, userId, }); const template = await excelMappingService.saveMappingTemplate( tableName, excelColumns, columnMappings, companyCode, userId ); res.json({ success: true, data: template, message: "매핑 템플릿이 저장되었습니다.", }); } catch (error: any) { logger.error("매핑 템플릿 저장 실패", { error: error.message }); res.status(500).json({ success: false, message: "매핑 템플릿 저장 중 오류가 발생했습니다.", error: error.message, }); } } /** * 테이블의 매핑 템플릿 목록 조회 * GET /api/excel-mapping/list/:tableName */ export async function getMappingTemplates( req: AuthenticatedRequest, res: Response ): Promise { try { const { tableName } = req.params; const companyCode = req.user?.companyCode || "*"; if (!tableName) { res.status(400).json({ success: false, message: "tableName이 필요합니다.", }); return; } logger.info("매핑 템플릿 목록 조회 요청", { tableName, companyCode, }); const templates = await excelMappingService.getMappingTemplates( tableName, companyCode ); res.json({ success: true, data: templates, }); } catch (error: any) { logger.error("매핑 템플릿 목록 조회 실패", { error: error.message }); res.status(500).json({ success: false, message: "매핑 템플릿 목록 조회 중 오류가 발생했습니다.", error: error.message, }); } } /** * 매핑 템플릿 삭제 * DELETE /api/excel-mapping/:id */ export async function deleteMappingTemplate( req: AuthenticatedRequest, res: Response ): Promise { try { const { id } = req.params; const companyCode = req.user?.companyCode || "*"; if (!id) { res.status(400).json({ success: false, message: "id가 필요합니다.", }); return; } logger.info("매핑 템플릿 삭제 요청", { id, companyCode, }); const deleted = await excelMappingService.deleteMappingTemplate( parseInt(id), companyCode ); if (deleted) { res.json({ success: true, message: "매핑 템플릿이 삭제되었습니다.", }); } else { res.status(404).json({ success: false, message: "삭제할 매핑 템플릿을 찾을 수 없습니다.", }); } } catch (error: any) { logger.error("매핑 템플릿 삭제 실패", { error: error.message }); res.status(500).json({ success: false, message: "매핑 템플릿 삭제 중 오류가 발생했습니다.", error: error.message, }); } }