178 lines
4.9 KiB
TypeScript
178 lines
4.9 KiB
TypeScript
|
|
/**
|
||
|
|
* 메일 수신 컨트롤러 (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 {
|
||
|
|
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 {
|
||
|
|
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 {
|
||
|
|
const { accountId, seqno, index } = req.params;
|
||
|
|
const seqnoNumber = parseInt(seqno, 10);
|
||
|
|
const indexNumber = parseInt(index, 10);
|
||
|
|
|
||
|
|
if (isNaN(seqnoNumber) || isNaN(indexNumber)) {
|
||
|
|
return res.status(400).json({
|
||
|
|
success: false,
|
||
|
|
message: '유효하지 않은 파라미터입니다.',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
const result = await this.mailReceiveService.downloadAttachment(
|
||
|
|
accountId,
|
||
|
|
seqnoNumber,
|
||
|
|
indexNumber
|
||
|
|
);
|
||
|
|
|
||
|
|
if (!result) {
|
||
|
|
return res.status(404).json({
|
||
|
|
success: false,
|
||
|
|
message: '첨부파일을 찾을 수 없습니다.',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
// 파일 다운로드
|
||
|
|
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 연결 테스트 실패',
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|