BCards/src/BCards.Web/Services/EmailService.cs
2025-07-12 02:32:22 -03:00

207 lines
8.6 KiB
C#

using SendGrid;
using SendGrid.Helpers.Mail;
namespace BCards.Web.Services;
public class EmailService : IEmailService
{
private readonly ISendGridClient _sendGridClient;
private readonly IConfiguration _configuration;
private readonly ILogger<EmailService> _logger;
public EmailService(
ISendGridClient sendGridClient,
IConfiguration configuration,
ILogger<EmailService> logger)
{
_sendGridClient = sendGridClient;
_configuration = configuration;
_logger = logger;
}
public async Task SendModerationStatusAsync(string userEmail, string userName, string pageTitle, string status, string? reason = null, string? previewUrl = null)
{
var (subject, htmlContent) = status switch
{
"pending" => GetPendingModerationTemplate(userName, pageTitle, previewUrl),
"approved" => GetApprovedTemplate(userName, pageTitle),
"rejected" => GetRejectedTemplate(userName, pageTitle, reason),
_ => throw new ArgumentException($"Unknown status: {status}")
};
await SendEmailAsync(userEmail, subject, htmlContent);
}
public async Task SendModeratorNotificationAsync(string pageId, string pageTitle, string planType, string userName)
{
var moderatorEmail = _configuration["Moderation:ModeratorEmail"];
if (string.IsNullOrEmpty(moderatorEmail))
return;
var priority = GetPriorityLabel(planType);
var subject = $"[{priority}] Nova página para moderação - {pageTitle}";
var htmlContent = $@"
<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
<h2 style='color: #333;'>Nova página para moderação</h2>
<div style='background: #f8f9fa; padding: 20px; border-radius: 5px; margin: 20px 0;'>
<p><strong>Título:</strong> {pageTitle}</p>
<p><strong>Usuário:</strong> {userName}</p>
<p><strong>Plano:</strong> {planType}</p>
<p><strong>Prioridade:</strong> <span style='color: {GetPriorityColor(planType)};'>{priority}</span></p>
<p><strong>ID da Página:</strong> {pageId}</p>
</div>
<p>
<a href='{_configuration["BaseUrl"]}/moderation/review/{pageId}'
style='background: #007bff; color: white; padding: 10px 20px; text-decoration: none; border-radius: 5px;'>
Moderar Página
</a>
</p>
</div>";
await SendEmailAsync(moderatorEmail, subject, htmlContent);
}
public async Task<bool> SendEmailAsync(string to, string subject, string htmlContent)
{
try
{
var from = new EmailAddress(
_configuration["SendGrid:FromEmail"] ?? "ricardo.carneiro@jobmaker.com.br",
_configuration["SendGrid:FromName"] ?? "BCards");
var toEmail = new EmailAddress(to);
var msg = MailHelper.CreateSingleEmail(from, toEmail, subject, null, htmlContent);
var response = await _sendGridClient.SendEmailAsync(msg);
if (response.StatusCode == System.Net.HttpStatusCode.Accepted)
{
_logger.LogInformation("Email sent successfully to {Email}", to);
return true;
}
else
{
var content = await response.Body.ReadAsStringAsync();
_logger.LogWarning("Failed to send email to {Email}. Status: {StatusCode}", to, response.StatusCode);
return false;
}
}
catch (Exception ex)
{
_logger.LogError(ex, "Error sending email to {Email}", to);
return false;
}
}
private (string subject, string htmlContent) GetPendingModerationTemplate(string userName, string pageTitle, string? previewUrl)
{
var subject = "📋 Sua página está sendo analisada - bcards.site";
var previewButton = !string.IsNullOrEmpty(previewUrl)
? $"<p><a href='{previewUrl}' style='background: #28a745; color: white; padding: 12px 24px; text-decoration: none; border-radius: 5px; display: inline-block;'>Ver Preview</a></p>"
: "";
var htmlContent = $@"
<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
<h2 style='color: #333;'>Olá {userName}!</h2>
<p>Sua página <strong>'{pageTitle}'</strong> foi enviada para análise e estará disponível em breve!</p>
<div style='background: #e3f2fd; padding: 20px; border-radius: 5px; margin: 20px 0;'>
<p>🔍 <strong>Tempo estimado:</strong> 3-7 dias úteis</p>
<p>👀 <strong>Status:</strong> Em análise</p>
</div>
<p>Nossa equipe verifica se o conteúdo segue nossos termos de uso para manter a qualidade da plataforma.</p>
{previewButton}
<hr style='margin: 30px 0;'>
<p style='color: #666; font-size: 14px;'>
Você receberá outro email assim que sua página for aprovada ou se precisar de ajustes.
</p>
</div>";
return (subject, htmlContent);
}
private (string subject, string htmlContent) GetApprovedTemplate(string userName, string pageTitle)
{
var subject = "✅ Sua página foi aprovada! - bcards.site";
var htmlContent = $@"
<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
<h2 style='color: #28a745;'>Parabéns {userName}! 🎉</h2>
<p>Sua página <strong>'{pageTitle}'</strong> foi aprovada e já está no ar!</p>
<div style='background: #d4edda; padding: 20px; border-radius: 5px; margin: 20px 0;'>
<p>✅ <strong>Status:</strong> Aprovada</p>
<p>🌐 <strong>Sua página está online!</strong></p>
</div>
<p>Agora você pode:</p>
<ul>
<li>Compartilhar sua página nas redes sociais</li>
<li>Adicionar o link na sua bio</li>
<li>Acompanhar as estatísticas no painel</li>
</ul>
<p>
<a href='{_configuration["BaseUrl"]}/admin/dashboard'
style='background: #007bff; color: white; padding: 12px 24px; text-decoration: none; border-radius: 5px; display: inline-block;'>
Acessar Painel
</a>
</p>
</div>";
return (subject, htmlContent);
}
private (string subject, string htmlContent) GetRejectedTemplate(string userName, string pageTitle, string? reason)
{
var subject = "⚠️ Sua página precisa de ajustes - bcards.site";
var reasonText = !string.IsNullOrEmpty(reason) ? $"<p><strong>Motivo:</strong> {reason}</p>" : "";
var htmlContent = $@"
<div style='font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;'>
<h2 style='color: #dc3545;'>Olá {userName}</h2>
<p>Sua página <strong>'{pageTitle}'</strong> não foi aprovada, mas você pode corrigir e reenviar!</p>
<div style='background: #f8d7da; padding: 20px; border-radius: 5px; margin: 20px 0;'>
<p>❌ <strong>Status:</strong> Necessita ajustes</p>
{reasonText}
</div>
<p>Para que sua página seja aprovada, certifique-se de que:</p>
<ul>
<li>Não contém conteúdo proibido ou suspeito</li>
<li>Todos os links estão funcionando</li>
<li>As informações são precisas</li>
<li>Segue nossos termos de uso</li>
</ul>
<p>
<a href='{_configuration["BaseUrl"]}/admin/dashboard'
style='background: #dc3545; color: white; padding: 12px 24px; text-decoration: none; border-radius: 5px; display: inline-block;'>
Editar Página
</a>
</p>
</div>";
return (subject, htmlContent);
}
private string GetPriorityLabel(string planType) => planType.ToLower() switch
{
"premium" => "ALTA",
"professional" => "ALTA",
"basic" => "MÉDIA",
_ => "BAIXA"
};
private string GetPriorityColor(string planType) => planType.ToLower() switch
{
"premium" => "#dc3545",
"professional" => "#fd7e14",
"basic" => "#ffc107",
_ => "#6c757d"
};
}