ERP-node/backend-node/src/controllers/mailAccountFileController.ts

202 lines
5.2 KiB
TypeScript
Raw Normal View History

2025-10-01 16:15:53 +09:00
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();