Initial commit
This commit is contained in:
78
src/presentation/messaging/code.py
Normal file
78
src/presentation/messaging/code.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from fastapi import Depends
|
||||
from faststream.rabbit.fastapi import RabbitRouter, RabbitMessage
|
||||
from src.infrastructure.config import settings
|
||||
from src.infrastructure.logger import logger
|
||||
from src.infrastructure.mail import TemplateRenderer, get_email_sender, get_renderer
|
||||
from src.infrastructure.mail.sender import EmailSender
|
||||
from datetime import datetime
|
||||
from typing import Literal, Optional
|
||||
from pydantic import BaseModel, EmailStr, Field
|
||||
from src.infrastructure.rabbit.broker import email_code_queue
|
||||
|
||||
|
||||
code_broker = RabbitRouter(settings.RABBIT_URL)
|
||||
|
||||
|
||||
class Metadata(BaseModel):
|
||||
trace_id: Optional[str] = None
|
||||
source: str
|
||||
timestamp: datetime
|
||||
message_id: str
|
||||
|
||||
|
||||
class Payload(BaseModel):
|
||||
email: EmailStr
|
||||
code: str = Field(min_length=1, max_length=64)
|
||||
ttl_seconds: int = Field(gt=0, lt=24 * 3600)
|
||||
|
||||
|
||||
class LoginCodeCreated(BaseModel):
|
||||
event: Literal["login", "registration", "bank_details_update"]
|
||||
payload: Payload
|
||||
metadata: Metadata
|
||||
|
||||
|
||||
@code_broker.subscriber(email_code_queue)
|
||||
async def consume_email_code(
|
||||
msg_body: LoginCodeCreated,
|
||||
message: RabbitMessage,
|
||||
sender: EmailSender = Depends(get_email_sender),
|
||||
renderer: TemplateRenderer = Depends(get_renderer),
|
||||
):
|
||||
trace_id = (
|
||||
(message.headers or {}).get("trace_id")
|
||||
or message.correlation_id
|
||||
or msg_body.metadata.trace_id
|
||||
)
|
||||
|
||||
logger.info(
|
||||
f"received event={msg_body.event} "
|
||||
f"email={msg_body.payload.email} "
|
||||
f"ttl={msg_body.payload.ttl_seconds} "
|
||||
f"trace_id={trace_id}"
|
||||
)
|
||||
|
||||
html = renderer.render(
|
||||
"email_code.html",
|
||||
subject="Код подтверждения",
|
||||
code=msg_body.payload.code,
|
||||
ttl_minutes=msg_body.payload.ttl_seconds // 60,
|
||||
brand="Bitforce",
|
||||
trace_id=trace_id,
|
||||
year=datetime.now().year,
|
||||
)
|
||||
|
||||
text = renderer.render(
|
||||
"email_code.txt",
|
||||
code=msg_body.payload.code,
|
||||
ttl_minutes=msg_body.payload.ttl_seconds // 60,
|
||||
brand="Bitforce",
|
||||
trace_id=trace_id,
|
||||
)
|
||||
|
||||
await sender.send(
|
||||
to=msg_body.payload.email,
|
||||
subject="Код подтверждения",
|
||||
body=html,
|
||||
plain=text,
|
||||
)
|
||||
Reference in New Issue
Block a user