Fix some issues

This commit is contained in:
2026-01-25 20:07:37 +01:00
parent e0be1b22f9
commit 6c6a9fc58c
32 changed files with 1719 additions and 226 deletions

View File

@@ -22,9 +22,10 @@ class AlertEventConsumer:
Handles email and Slack notifications for critical alerts
"""
def __init__(self, db_session: AsyncSession):
def __init__(self, db_session: AsyncSession, notification_client: Optional[any] = None):
self.db_session = db_session
self.notification_config = self._load_notification_config()
self.notification_client = notification_client
def _load_notification_config(self) -> Dict[str, Any]:
"""
@@ -451,7 +452,7 @@ class AlertEventConsumer:
data: Dict[str, Any]
) -> bool:
"""
Send email notification
Send email notification using notification service API
Args:
tenant_id: Tenant ID
@@ -466,42 +467,77 @@ class AlertEventConsumer:
logger.debug("Email notifications disabled")
return False
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Use notification service client if available
if self.notification_client:
# Build email content
subject = self._format_email_subject(notification_type, data)
body = self._format_email_body(notification_type, data)
# Build email content
subject = self._format_email_subject(notification_type, data)
body = self._format_email_body(notification_type, data)
# Send via notification service API
result = await self.notification_client.send_email(
tenant_id=tenant_id,
to_email=", ".join(self.notification_config['email']['recipients']),
subject=subject,
message="Supplier alert notification", # Plain text fallback
html_content=body,
priority="high" if data.get('severity') == 'critical' else "normal"
)
# Create message
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = self.notification_config['email']['from_address']
msg['To'] = ', '.join(self.notification_config['email']['recipients'])
if result:
logger.info(
"Email notification sent via notification service",
tenant_id=tenant_id,
notification_type=notification_type,
recipients=len(self.notification_config['email']['recipients'])
)
return True
else:
logger.error(
"Notification service failed to send email",
tenant_id=tenant_id,
notification_type=notification_type
)
return False
else:
# Fallback to direct SMTP for backward compatibility
logger.warning("Notification client not available, falling back to direct SMTP")
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
# Attach HTML body
html_part = MIMEText(body, 'html')
msg.attach(html_part)
# Build email content
subject = self._format_email_subject(notification_type, data)
body = self._format_email_body(notification_type, data)
# Send email
smtp_config = self.notification_config['email']
with smtplib.SMTP(smtp_config['smtp_host'], smtp_config['smtp_port']) as server:
if smtp_config['use_tls']:
server.starttls()
# Create message
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = self.notification_config['email']['from_address']
msg['To'] = ', '.join(self.notification_config['email']['recipients'])
if smtp_config['smtp_username'] and smtp_config['smtp_password']:
server.login(smtp_config['smtp_username'], smtp_config['smtp_password'])
# Attach HTML body
html_part = MIMEText(body, 'html')
msg.attach(html_part)
server.send_message(msg)
# Send email
smtp_config = self.notification_config['email']
with smtplib.SMTP(smtp_config['smtp_host'], smtp_config['smtp_port']) as server:
if smtp_config['use_tls']:
server.starttls()
logger.info(
"Email notification sent",
tenant_id=tenant_id,
notification_type=notification_type,
recipients=len(self.notification_config['email']['recipients'])
)
return True
if smtp_config['smtp_username'] and smtp_config['smtp_password']:
server.login(smtp_config['smtp_username'], smtp_config['smtp_password'])
server.send_message(msg)
logger.info(
"Email notification sent via direct SMTP (fallback)",
tenant_id=tenant_id,
notification_type=notification_type,
recipients=len(self.notification_config['email']['recipients'])
)
return True
except Exception as e:
logger.error(
@@ -785,6 +821,6 @@ class AlertEventConsumer:
# Factory function for creating consumer instance
def create_alert_event_consumer(db_session: AsyncSession) -> AlertEventConsumer:
def create_alert_event_consumer(db_session: AsyncSession, notification_client: Optional[any] = None) -> AlertEventConsumer:
"""Create alert event consumer instance"""
return AlertEventConsumer(db_session)
return AlertEventConsumer(db_session, notification_client)