Spaces:
Sleeping
Sleeping
import logging | |
import os | |
from typing import Dict, Any | |
from sendgrid import SendGridAPIClient | |
from sendgrid.helpers.mail import Mail, Email, To, Content | |
from src.domain.interfaces.notification import NotificationService, NotificationFactory | |
logger = logging.getLogger(__name__) | |
class EmailNotification(NotificationService): | |
def send_notification(self, detection_data: Dict[str, Any], recipient: str) -> bool: | |
try: | |
# Verificar se há detecções | |
if not detection_data.get("detections"): | |
logger.info("Nenhuma detecção para notificar") | |
return True # Retorna True pois não é um erro | |
sender_email = os.getenv('NOTIFICATION_EMAIL') | |
sendgrid_api_key = os.getenv('SENDGRID_API_KEY') | |
if not sender_email: | |
logger.error("NOTIFICATION_EMAIL não configurado") | |
return False | |
if not sendgrid_api_key: | |
logger.error("SENDGRID_API_KEY não configurada") | |
return False | |
if not recipient: | |
logger.error("Destinatário de e-mail não fornecido") | |
return False | |
body = self._format_email_body(detection_data) | |
message = Mail( | |
from_email=sender_email, | |
to_emails=recipient, | |
subject='🚨 ALERTA DE SEGURANÇA - Detecção de Risco', | |
html_content=f'<pre style="font-family: monospace;">{body}</pre>' | |
) | |
try: | |
sg = SendGridAPIClient(sendgrid_api_key) | |
response = sg.send(message) | |
success = response.status_code == 202 | |
if success: | |
logger.info(f"E-mail enviado com sucesso para {recipient}") | |
logger.debug(f"Status: {response.status_code}") | |
logger.debug(f"Body: {response.body}") | |
logger.debug(f"Headers: {response.headers}") | |
else: | |
logger.error(f"Erro ao enviar e-mail. Status code: {response.status_code}") | |
return success | |
except Exception as e: | |
logger.error(f"Erro ao enviar e-mail via SendGrid: {str(e)}") | |
return False | |
except Exception as e: | |
logger.error(f"Erro no serviço de e-mail: {str(e)}") | |
return False | |
def _format_email_body(self, detection_data: Dict[str, Any]) -> str: | |
"""Formata o corpo do e-mail com os dados da detecção.""" | |
try: | |
detections = detection_data.get("detections", []) | |
if not detections: | |
return "Nenhuma detecção encontrada no vídeo." | |
body = """ | |
⚠️ ALERTA DE SEGURANÇA ⚠️ | |
Uma detecção de risco foi identificada: | |
""" | |
# Adicionar informações da primeira detecção | |
first_detection = detections[0] | |
body += f"""📹 Detecção: | |
- Objeto: {first_detection.get('label', 'Desconhecido')} | |
- Confiança: {first_detection.get('confidence', 0):.2%} | |
- Timestamp: {first_detection.get('timestamp', 0):.2f}s | |
""" | |
# Adicionar informações técnicas | |
if "technical" in detection_data: | |
tech = detection_data["technical"] | |
body += f"""Informações Técnicas: | |
- Threshold: {tech.get('threshold', 'N/A')} | |
- FPS: {tech.get('fps', 'N/A')} | |
- Resolução: {tech.get('resolution', 'N/A')} | |
""" | |
body += """ | |
-- | |
Este é um e-mail automático enviado pelo Sistema de Detecção de Riscos. | |
Não responda este e-mail. | |
""" | |
return body | |
except Exception as e: | |
logger.error(f"Erro ao formatar e-mail: {str(e)}") | |
return "Erro ao formatar dados da detecção." | |
class NotificationServiceFactory(NotificationFactory): | |
def __init__(self): | |
self._services = {'email': EmailNotification()} | |
def create_service(self, service_type: str) -> NotificationService: | |
return self._services.get(service_type) | |
def get_available_services(self) -> list: | |
return list(self._services.keys()) |