import { Request, Response } from 'express'; import { mailSentHistoryService } from '../services/mailSentHistoryService'; export class MailSentHistoryController { /** * 발송 이력 목록 조회 */ async getList(req: Request, res: Response) { try { const query = { page: req.query.page ? parseInt(req.query.page as string) : undefined, limit: req.query.limit ? parseInt(req.query.limit as string) : undefined, searchTerm: req.query.searchTerm as string | undefined, status: req.query.status as 'success' | 'failed' | 'draft' | 'all' | undefined, accountId: req.query.accountId as string | undefined, startDate: req.query.startDate as string | undefined, endDate: req.query.endDate as string | undefined, sortBy: req.query.sortBy as 'sentAt' | 'subject' | 'updatedAt' | undefined, sortOrder: req.query.sortOrder as 'asc' | 'desc' | undefined, includeDeleted: req.query.includeDeleted === 'true', onlyDeleted: req.query.onlyDeleted === 'true', }; const result = await mailSentHistoryService.getSentMailList(query); return res.json({ success: true, data: result, }); } catch (error: unknown) { const err = error as Error; console.error('발송 이력 목록 조회 실패:', err); return res.status(500).json({ success: false, message: '발송 이력 조회 중 오류가 발생했습니다.', error: err.message, }); } } /** * 특정 발송 이력 상세 조회 */ async getById(req: Request, res: Response) { try { const { id } = req.params; if (!id) { return res.status(400).json({ success: false, message: '발송 이력 ID가 필요합니다.', }); } const history = await mailSentHistoryService.getSentMailById(id); if (!history) { return res.status(404).json({ success: false, message: '발송 이력을 찾을 수 없습니다.', }); } return res.json({ success: true, data: history, }); } catch (error: unknown) { const err = error as Error; console.error('발송 이력 조회 실패:', err); return res.status(500).json({ success: false, message: '발송 이력 조회 중 오류가 발생했습니다.', error: err.message, }); } } /** * 발송 이력 삭제 */ async deleteById(req: Request, res: Response) { try { const { id } = req.params; if (!id) { return res.status(400).json({ success: false, message: '발송 이력 ID가 필요합니다.', }); } const success = await mailSentHistoryService.deleteSentMail(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; console.error('발송 이력 삭제 실패:', err); return res.status(500).json({ success: false, message: '발송 이력 삭제 중 오류가 발생했습니다.', error: err.message, }); } } /** * 임시 저장 (Draft) */ async saveDraft(req: Request, res: Response) { try { const draft = await mailSentHistoryService.saveDraft(req.body); return res.json({ success: true, data: draft, message: '임시 저장되었습니다.', }); } catch (error: unknown) { const err = error as Error; console.error('임시 저장 실패:', err); return res.status(500).json({ success: false, message: '임시 저장 중 오류가 발생했습니다.', error: err.message, }); } } /** * 임시 저장 업데이트 */ async updateDraft(req: Request, res: Response) { try { const { id } = req.params; if (!id) { return res.status(400).json({ success: false, message: '임시 저장 ID가 필요합니다.', }); } const updated = await mailSentHistoryService.updateDraft(id, req.body); if (!updated) { return res.status(404).json({ success: false, message: '임시 저장을 찾을 수 없습니다.', }); } return res.json({ success: true, data: updated, message: '임시 저장이 업데이트되었습니다.', }); } catch (error: unknown) { const err = error as Error; console.error('임시 저장 업데이트 실패:', err); return res.status(500).json({ success: false, message: '임시 저장 업데이트 중 오류가 발생했습니다.', error: err.message, }); } } /** * 메일 복구 */ async restoreMail(req: Request, res: Response) { try { const { id } = req.params; if (!id) { return res.status(400).json({ success: false, message: '메일 ID가 필요합니다.', }); } const success = await mailSentHistoryService.restoreMail(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; console.error('메일 복구 실패:', err); return res.status(500).json({ success: false, message: '메일 복구 중 오류가 발생했습니다.', error: err.message, }); } } /** * 메일 영구 삭제 */ async permanentlyDelete(req: Request, res: Response) { try { const { id } = req.params; if (!id) { return res.status(400).json({ success: false, message: '메일 ID가 필요합니다.', }); } const success = await mailSentHistoryService.permanentlyDeleteMail(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; console.error('메일 영구 삭제 실패:', err); return res.status(500).json({ success: false, message: '메일 영구 삭제 중 오류가 발생했습니다.', error: err.message, }); } } /** * 통계 조회 */ async getStatistics(req: Request, res: Response) { try { const accountId = req.query.accountId as string | undefined; const stats = await mailSentHistoryService.getStatistics(accountId); return res.json({ success: true, data: stats, }); } catch (error: unknown) { const err = error as Error; console.error('통계 조회 실패:', err); return res.status(500).json({ success: false, message: '통계 조회 중 오류가 발생했습니다.', error: err.message, }); } } /** * 일괄 삭제 */ async bulkDelete(req: Request, res: Response) { try { const { ids } = req.body; if (!ids || !Array.isArray(ids) || ids.length === 0) { return res.status(400).json({ success: false, message: '삭제할 메일 ID 목록이 필요합니다.', }); } const results = await Promise.allSettled( ids.map((id: string) => mailSentHistoryService.deleteSentMail(id)) ); const successCount = results.filter((r) => r.status === 'fulfilled' && r.value).length; const failCount = results.length - successCount; return res.json({ success: true, message: `${successCount}개 메일 삭제 완료 (실패: ${failCount}개)`, data: { successCount, failCount }, }); } catch (error: unknown) { const err = error as Error; console.error('일괄 삭제 실패:', err); return res.status(500).json({ success: false, message: '일괄 삭제 중 오류가 발생했습니다.', error: err.message, }); } } /** * 일괄 영구 삭제 */ async bulkPermanentDelete(req: Request, res: Response) { try { const { ids } = req.body; if (!ids || !Array.isArray(ids) || ids.length === 0) { return res.status(400).json({ success: false, message: '영구 삭제할 메일 ID 목록이 필요합니다.', }); } const results = await Promise.allSettled( ids.map((id: string) => mailSentHistoryService.permanentlyDeleteMail(id)) ); const successCount = results.filter((r) => r.status === 'fulfilled' && r.value).length; const failCount = results.length - successCount; return res.json({ success: true, message: `${successCount}개 메일 영구 삭제 완료 (실패: ${failCount}개)`, data: { successCount, failCount }, }); } catch (error: unknown) { const err = error as Error; console.error('일괄 영구 삭제 실패:', err); return res.status(500).json({ success: false, message: '일괄 영구 삭제 중 오류가 발생했습니다.', error: err.message, }); } } /** * 일괄 복구 */ async bulkRestore(req: Request, res: Response) { try { const { ids } = req.body; if (!ids || !Array.isArray(ids) || ids.length === 0) { return res.status(400).json({ success: false, message: '복구할 메일 ID 목록이 필요합니다.', }); } const results = await Promise.allSettled( ids.map((id: string) => mailSentHistoryService.restoreMail(id)) ); const successCount = results.filter((r) => r.status === 'fulfilled' && r.value).length; const failCount = results.length - successCount; return res.json({ success: true, message: `${successCount}개 메일 복구 완료 (실패: ${failCount}개)`, data: { successCount, failCount }, }); } catch (error: unknown) { const err = error as Error; console.error('일괄 복구 실패:', err); return res.status(500).json({ success: false, message: '일괄 복구 중 오류가 발생했습니다.', error: err.message, }); } } } export const mailSentHistoryController = new MailSentHistoryController();