using Application.Abstractions.Data;
using Application.Abstractions.Messaging.Email;
using Domain.Entities.Common;
using Domain.Entities.Common.ValueObject;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Messaging.Email;
///
/// EmailLog 큐에 INSERT만 수행. MailWorker가 별도로 폴링하여 SMTP 송신.
/// API 단에서만 사용. (Admin은 DirectMailService로 즉시 발송)
///
public class QueuedMailService : IMailService
{
private readonly ILogger _logger;
private readonly IAppDbContext _db;
public QueuedMailService(ILogger logger, IAppDbContext db)
{
_logger = logger;
_db = db;
}
public async Task SendAsync(SendData data, CancellationToken ct = default)
{
var now = DateTime.UtcNow;
var entry = new EmailLog
{
ToAddress = data.ToAddress,
Subject = data.Subject,
MessageHtml = data.MessageHtml,
MessageText = data.MessageText,
Status = MailStatus.Pending,
RetryCount = 0,
MaxRetryCount = 3,
NextRetryAt = now,
CreatedAt = now
};
await _db.EmailLog.AddAsync(entry, ct);
await _db.SaveChangesAsync(ct);
_logger.LogInformation("Email queued (ID={ID}) to {ToAddress} subject={Subject}", entry.ID, data.ToAddress, data.Subject);
}
}