import { Request, Response } from 'express'; import { mailAccountFileService } from '../services/mailAccountFileService'; export class MailAccountFileController { async getAllAccounts(req: Request, res: Response) { try { const accounts = await mailAccountFileService.getAllAccounts(); // 비밀번호는 반환하지 않음 const safeAccounts = accounts.map(({ smtpPassword, ...account }) => account); return res.json({ success: true, data: safeAccounts, total: safeAccounts.length, }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '계정 조회 실패', error: err.message, }); } } async getAccountById(req: Request, res: Response) { try { const { id } = req.params; const account = await mailAccountFileService.getAccountById(id); if (!account) { return res.status(404).json({ success: false, message: '계정을 찾을 수 없습니다.', }); } // 비밀번호는 마스킹 처리 const { smtpPassword, ...safeAccount } = account; return res.json({ success: true, data: { ...safeAccount, smtpPassword: '••••••••', // 마스킹 }, }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '계정 조회 실패', error: err.message, }); } } async createAccount(req: Request, res: Response) { try { const { name, email, smtpHost, smtpPort, smtpSecure, smtpUsername, smtpPassword, dailyLimit, status, } = req.body; if (!name || !email || !smtpHost || !smtpPort || !smtpUsername || !smtpPassword) { return res.status(400).json({ success: false, message: '필수 필드가 누락되었습니다.', }); } // 이메일 중복 확인 const existingAccount = await mailAccountFileService.getAccountByEmail(email); if (existingAccount) { return res.status(400).json({ success: false, message: '이미 등록된 이메일입니다.', }); } const account = await mailAccountFileService.createAccount({ name, email, smtpHost, smtpPort, smtpSecure: smtpSecure || false, smtpUsername, smtpPassword, dailyLimit: dailyLimit || 1000, status: status || 'active', }); // 비밀번호 제외하고 반환 const { smtpPassword: _, ...safeAccount } = account; return res.status(201).json({ success: true, data: safeAccount, message: '메일 계정이 생성되었습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '계정 생성 실패', error: err.message, }); } } async updateAccount(req: Request, res: Response) { try { const { id } = req.params; const updates = req.body; const account = await mailAccountFileService.updateAccount(id, updates); if (!account) { return res.status(404).json({ success: false, message: '계정을 찾을 수 없습니다.', }); } // 비밀번호 제외하고 반환 const { smtpPassword: _, ...safeAccount } = account; return res.json({ success: true, data: safeAccount, message: '계정이 수정되었습니다.', }); } catch (error: unknown) { const err = error as Error; return res.status(500).json({ success: false, message: '계정 수정 실패', error: err.message, }); } } async deleteAccount(req: Request, res: Response) { try { const { id } = req.params; const success = await mailAccountFileService.deleteAccount(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, }); } } async testConnection(req: Request, res: Response) { try { const { id } = req.params; // TODO: 실제 SMTP 연결 테스트 구현 // const account = await mailAccountFileService.getAccountById(id); // nodemailer로 연결 테스트 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, }); } } } export const mailAccountFileController = new MailAccountFileController();