import { Request, Response } from 'express'; import { mailTemplateFileService } from '../services/mailTemplateFileService'; // 간단한 변수 치환 함수 function replaceVariables(text: string, data: Record): string { let result = text; for (const [key, value] of Object.entries(data)) { const regex = new RegExp(`\\{${key}\\}`, 'g'); result = result.replace(regex, String(value)); } return result; } export class MailTemplateFileController { // 모든 템플릿 조회 async getAllTemplates(req: Request, res: Response) { try { const { category, search } = req.query; let templates; if (search) { templates = await mailTemplateFileService.searchTemplates(search as string); } else if (category) { templates = await mailTemplateFileService.getTemplatesByCategory(category as string); } else { templates = await mailTemplateFileService.getAllTemplates(); } return res.json({ success: true, data: templates, total: templates.length, }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '템플릿 조회 실패', error: err.message, }); } } // 특정 템플릿 조회 async getTemplateById(req: Request, res: Response) { try { const { id } = req.params; const template = await mailTemplateFileService.getTemplateById(id); if (!template) { return res.status(404).json({ success: false, message: '템플릿을 찾을 수 없습니다.', }); } return res.json({ success: true, data: template, }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '템플릿 조회 실패', error: err.message, }); } } // 템플릿 생성 async createTemplate(req: Request, res: Response) { try { const { name, subject, components, queryConfig, recipientConfig, category } = req.body; if (!name || !subject || !Array.isArray(components)) { return res.status(400).json({ success: false, message: '템플릿 이름, 제목, 컴포넌트가 필요합니다.', }); } const template = await mailTemplateFileService.createTemplate({ name, subject, components, queryConfig, recipientConfig, category, }); return res.status(201).json({ success: true, data: template, message: '템플릿이 생성되었습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '템플릿 생성 실패', error: err.message, }); } } // 템플릿 수정 async updateTemplate(req: Request, res: Response) { try { const { id } = req.params; const updates = req.body; const template = await mailTemplateFileService.updateTemplate(id, updates); if (!template) { return res.status(404).json({ success: false, message: '템플릿을 찾을 수 없습니다.', }); } return res.json({ success: true, data: template, message: '템플릿이 수정되었습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '템플릿 수정 실패', error: err.message, }); } } // 템플릿 삭제 async deleteTemplate(req: Request, res: Response) { try { const { id } = req.params; const success = await mailTemplateFileService.deleteTemplate(id); if (!success) { return res.status(404).json({ success: false, message: '템플릿을 찾을 수 없습니다.', }); } return res.json({ success: true, message: '템플릿이 삭제되었습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '템플릿 삭제 실패', error: err.message, }); } } // 템플릿 미리보기 (HTML 렌더링) async previewTemplate(req: Request, res: Response) { try { const { id } = req.params; const { sampleData } = req.body; const template = await mailTemplateFileService.getTemplateById(id); if (!template) { return res.status(404).json({ success: false, message: '템플릿을 찾을 수 없습니다.', }); } // HTML 렌더링 let html = mailTemplateFileService.renderTemplateToHtml(template.components); let subject = template.subject; // 샘플 데이터가 있으면 변수 치환 if (sampleData) { html = replaceVariables(html, sampleData); subject = replaceVariables(subject, sampleData); } return res.json({ success: true, data: { subject, html, sampleData, }, }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '미리보기 생성 실패', error: err.message, }); } } // 템플릿 + 쿼리 통합 미리보기 async previewWithQuery(req: Request, res: Response) { try { const { id } = req.params; const { queryId, parameters } = req.body; const template = await mailTemplateFileService.getTemplateById(id); if (!template) { return res.status(404).json({ success: false, message: '템플릿을 찾을 수 없습니다.', }); } // 쿼리 실행 const query = template.queryConfig?.queries.find(q => q.id === queryId); if (!query) { return res.status(404).json({ success: false, message: '쿼리를 찾을 수 없습니다.', }); } // SQL 쿼리 기능은 구현되지 않음 return res.status(501).json({ success: false, message: 'SQL 쿼리 연동 기능은 현재 지원하지 않습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '쿼리 미리보기 실패', error: err.message, }); } } } export const mailTemplateFileController = new MailTemplateFileController();