ERP-node/backend-node/src/controllers/mailTemplateFileController.ts

259 lines
7.0 KiB
TypeScript
Raw Normal View History

2025-10-01 16:15:53 +09:00
import { Request, Response } from 'express';
import { mailTemplateFileService } from '../services/mailTemplateFileService';
import { mailQueryService } from '../services/mailQueryService';
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 = mailQueryService.replaceVariables(html, sampleData);
subject = mailQueryService.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: '쿼리를 찾을 수 없습니다.',
});
}
const queryResult = await mailQueryService.executeQuery(query.sql, parameters || []);
if (!queryResult.success || !queryResult.data || queryResult.data.length === 0) {
return res.status(400).json({
success: false,
message: '쿼리 결과가 없습니다.',
error: queryResult.error,
});
}
// 첫 번째 행으로 미리보기
const sampleData = queryResult.data[0];
let html = mailTemplateFileService.renderTemplateToHtml(template.components);
let subject = template.subject;
html = mailQueryService.replaceVariables(html, sampleData);
subject = mailQueryService.replaceVariables(subject, sampleData);
return res.json({
success: true,
data: {
subject,
html,
sampleData,
totalRecipients: queryResult.data.length,
},
});
} catch (error: unknown) {
const err = error as Error;
return res.status(500).json({
success: false,
message: '쿼리 미리보기 실패',
error: err.message,
});
}
}
}
export const mailTemplateFileController = new MailTemplateFileController();