/** * 메일 수신 컨트롤러 (Step 2 - 기본 구현) */ import { Request, Response } from 'express'; import { MailReceiveBasicService } from '../services/mailReceiveBasicService'; export class MailReceiveBasicController { private mailReceiveService: MailReceiveBasicService; constructor() { this.mailReceiveService = new MailReceiveBasicService(); } /** * GET /api/mail/receive/:accountId * 메일 목록 조회 */ async getMailList(req: Request, res: Response) { try { console.log('📬 메일 목록 조회 요청:', { params: req.params, path: req.path, originalUrl: req.originalUrl }); const { accountId } = req.params; const limit = parseInt(req.query.limit as string) || 50; const mails = await this.mailReceiveService.fetchMailList(accountId, limit); return res.status(200).json({ success: true, data: mails, count: mails.length, }); } catch (error: unknown) { console.error('메일 목록 조회 실패:', error); return res.status(500).json({ success: false, message: error instanceof Error ? error.message : '메일 목록 조회 실패', }); } } /** * GET /api/mail/receive/:accountId/:seqno * 메일 상세 조회 */ async getMailDetail(req: Request, res: Response) { try { console.log('🔍 메일 상세 조회 요청:', { params: req.params, path: req.path, originalUrl: req.originalUrl }); const { accountId, seqno } = req.params; const seqnoNumber = parseInt(seqno, 10); if (isNaN(seqnoNumber)) { return res.status(400).json({ success: false, message: '유효하지 않은 메일 번호입니다.', }); } const mailDetail = await this.mailReceiveService.getMailDetail(accountId, seqnoNumber); if (!mailDetail) { return res.status(404).json({ success: false, message: '메일을 찾을 수 없습니다.', }); } return res.status(200).json({ success: true, data: mailDetail, }); } catch (error: unknown) { console.error('메일 상세 조회 실패:', error); return res.status(500).json({ success: false, message: error instanceof Error ? error.message : '메일 상세 조회 실패', }); } } /** * POST /api/mail/receive/:accountId/:seqno/mark-read * 메일을 읽음으로 표시 */ async markAsRead(req: Request, res: Response) { try { const { accountId, seqno } = req.params; const seqnoNumber = parseInt(seqno, 10); if (isNaN(seqnoNumber)) { return res.status(400).json({ success: false, message: '유효하지 않은 메일 번호입니다.', }); } const result = await this.mailReceiveService.markAsRead(accountId, seqnoNumber); return res.status(200).json(result); } catch (error: unknown) { console.error('읽음 표시 실패:', error); return res.status(500).json({ success: false, message: error instanceof Error ? error.message : '읽음 표시 실패', }); } } /** * GET /api/mail/receive/:accountId/:seqno/attachment/:index * 첨부파일 다운로드 */ async downloadAttachment(req: Request, res: Response) { try { console.log('📎🎯 컨트롤러 downloadAttachment 진입'); const { accountId, seqno, index } = req.params; console.log(`📎 파라미터: accountId=${accountId}, seqno=${seqno}, index=${index}`); const seqnoNumber = parseInt(seqno, 10); const indexNumber = parseInt(index, 10); if (isNaN(seqnoNumber) || isNaN(indexNumber)) { console.log('❌ 유효하지 않은 파라미터'); return res.status(400).json({ success: false, message: '유효하지 않은 파라미터입니다.', }); } console.log('📎 서비스 호출 시작...'); const result = await this.mailReceiveService.downloadAttachment( accountId, seqnoNumber, indexNumber ); console.log(`📎 서비스 호출 완료: result=${result ? '있음' : '없음'}`); if (!result) { console.log('❌ 첨부파일을 찾을 수 없음'); return res.status(404).json({ success: false, message: '첨부파일을 찾을 수 없습니다.', }); } console.log(`📎 파일 다운로드 시작: ${result.filename}`); console.log(`📎 파일 경로: ${result.filePath}`); // 파일 다운로드 res.download(result.filePath, result.filename, (err) => { if (err) { console.error('파일 다운로드 오류:', err); if (!res.headersSent) { res.status(500).json({ success: false, message: '파일 다운로드 실패', }); } } }); return; // void 반환 } catch (error: unknown) { console.error('첨부파일 다운로드 실패:', error); return res.status(500).json({ success: false, message: error instanceof Error ? error.message : '첨부파일 다운로드 실패', }); } } /** * POST /api/mail/receive/:accountId/test-imap * IMAP 연결 테스트 */ async testImapConnection(req: Request, res: Response) { try { const { accountId } = req.params; const result = await this.mailReceiveService.testImapConnection(accountId); return res.status(result.success ? 200 : 400).json(result); } catch (error: unknown) { return res.status(500).json({ success: false, message: error instanceof Error ? error.message : 'IMAP 연결 테스트 실패', }); } } /** * GET /api/mail/receive/today-count * 오늘 수신 메일 수 조회 */ async getTodayReceivedCount(req: Request, res: Response) { try { const { accountId } = req.query; const count = await this.mailReceiveService.getTodayReceivedCount(accountId as string); return res.json({ success: true, data: { count } }); } catch (error: unknown) { console.error('오늘 수신 메일 수 조회 실패:', error); return res.status(500).json({ success: false, message: error instanceof Error ? error.message : '오늘 수신 메일 수 조회에 실패했습니다.' }); } } }