207 lines
8.6 KiB
C#
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"
|
|
};
|
|
} |