247 lines
6.6 KiB
TypeScript
247 lines
6.6 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { mailTemplateFileService } from '../services/mailTemplateFileService';
|
|
|
|
// 간단한 변수 치환 함수
|
|
function replaceVariables(text: string, data: Record<string, any>): 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();
|
|
|