Spaces:
Runtime error
Runtime error
| 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()) |