"""
Servicio de notificaciones por email para validación interna
Este módulo gestiona el envío de correos a los validadores internos
con la información del vídeo para su revisión regulatoria.
"""
import os
import json
import base64
from typing import Dict, Any, List, Optional
from datetime import datetime
from dataclasses import dataclass
# Imports para email (comentados hasta configuración)
# import smtplib
# from email.mime.text import MIMEText
# from email.mime.multipart import MIMEMultipart
# from email.mime.base import MIMEBase
# from email import encoders
@dataclass
class ValidationRequest:
"""Solicitud de validación para envío por email"""
document_id: str
user_email: str
user_name: str
video_title: str
video_hash: str
timestamp: str
video_url: str
consent_data: Dict[str, Any]
class EmailNotificationService:
"""Servicio de notificaciones por email para validadores"""
def __init__(self):
# Configuración SMTP (comentada hasta despliegue)
self.smtp_server = os.getenv("SMTP_SERVER", "smtp.gmail.com")
self.smtp_port = int(os.getenv("SMTP_PORT", "587"))
self.sender_email = os.getenv("SENDER_EMAIL", "validations@veureu.cat")
self.sender_password = os.getenv("SENDER_PASSWORD", "")
# Lista de validadores internos
self.validators = self._load_validators()
def _load_validators(self) -> List[str]:
"""Carga lista de validadores desde configuración"""
# En producción, esto vendría de base de datos o config
default_validators = [
"validator1@veureu.cat",
"validator2@veureu.cat",
"compliance@veureu.cat"
]
# Permitir sobreescribir por variable de entorno
env_validators = os.getenv("VALIDATOR_EMAILS", "")
if env_validators:
return [email.strip() for email in env_validators.split(",")]
return default_validators
def _generate_validation_email(self, request: ValidationRequest) -> str:
"""Genera contenido del email de validación"""
approval_link = f"https://veureu-demo.hf.space/validate?doc_id={request.document_id}&action=approve"
rejection_link = f"https://veureu-demo.hf.space/validate?doc_id={request.document_id}&action=reject"
email_content = f"""
Solicitud de Validación - Veureu
🔐 Solicitud de Validación Regulatoria
📋 Información del Envío
| Usuario: |
{request.user_name} ({request.user_email}) |
| Vídeo: |
{request.video_title} |
| Hash: |
{request.video_hash[:32]}... |
| Timestamp: |
{request.timestamp} |
| ID Documento: |
{request.document_id} |
✅ Consentimientos Aceptados
- Derechos sobre el vídeo: {'✅' if request.consent_data.get('rights') else '❌'}
- Consentimiento biométrico: {'✅' if request.consent_data.get('biometric') else '❌'}
- Contenido permitido: {'✅' if request.consent_data.get('content') else '❌'}
- Privacidad y datos: {'✅' if request.consent_data.get('privacy') else '❌'}
🎥 Acceso al Vídeo
Puedes revisar el vídeo en el siguiente enlace:
📹 Ver Vídeo
🔍 Decisión de Validación
Por favor, revisa el contenido y toma una decisión:
Esta decisión quedará registrada en AWS QLDB para cumplimiento normativo (AI Act, GDPR).
Este es un mensaje automático del sistema de validación regulatoria de Veureu.
Para consultas, contacta a compliance@veureu.cat
"""
return email_content
def send_validation_request(self, request: ValidationRequest) -> bool:
"""
Envía solicitud de validación a todos los validadores
Returns:
True si éxito, False si error
"""
try:
subject = f"🔐 Validación Regulatoria - {request.video_title}"
html_content = self._generate_validation_email(request)
# Código comentado hasta configuración SMTP
"""
# Configurar mensaje
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = self.sender_email
msg['To'] = ', '.join(self.validators)
# Adjuntar contenido HTML
html_part = MIMEText(html_content, 'html')
msg.attach(html_part)
# Enviar email
with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
server.starttls()
server.login(self.sender_email, self.sender_password)
server.send_message(msg)
"""
# Temporal: logging simulado
print(f"[EMAIL - SIMULATED] Enviando solicitud de validación:")
print(f"[EMAIL - SIMULATED] Para: {', '.join(self.validators)}")
print(f"[EMAIL - SIMULATED] Asunto: {subject}")
print(f"[EMAIL - SIMULATED] Documento: {request.document_id}")
print(f"[EMAIL - SIMULATED] Usuario: {request.user_email}")
print(f"[EMAIL - SIMULATED] Vídeo: {request.video_title}")
return True
except Exception as e:
print(f"[EMAIL ERROR] Error enviando validación: {e}")
return False
def send_decision_notification(self, validator_email: str,
decision: str,
document_id: str,
comments: str = "") -> bool:
"""
Envía notificación de decisión tomada por validador
Returns:
True si éxito, False si error
"""
try:
subject = f"🔍 Decisión de Validación - {decision.upper()}"
content = f"""
Se ha registrado una decisión de validación:
Validador: {validator_email}
Documento: {document_id}
Decisión: {decision}
Comentarios: {comments}
Timestamp: {datetime.now().isoformat()}
Esta decisión ha quedado registrada en AWS QLDB.
"""
# Código comentado hasta configuración SMTP
"""
msg = MIMEText(content)
msg['Subject'] = subject
msg['From'] = self.sender_email
msg['To'] = 'compliance@veureu.cat'
with smtplib.SMTP(self.smtp_server, self.smtp_port) as server:
server.starttls()
server.login(self.sender_email, self.sender_password)
server.send_message(msg)
"""
# Temporal: logging simulado
print(f"[EMAIL - SIMULATED] Notificación de decisión enviada:")
print(f"[EMAIL - SIMULATED] Validador: {validator_email}")
print(f"[EMAIL - SIMULATED] Decisión: {decision}")
print(f"[EMAIL - SIMULATED] Documento: {document_id}")
return True
except Exception as e:
print(f"[EMAIL ERROR] Error enviando notificación: {e}")
return False
# Instancia global
notification_service = EmailNotificationService()