41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
from __future__ import annotations
|
|
import logging
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel
|
|
from app.deps import get_sms_service
|
|
from app.service import RateLimitExceeded, SmsService
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter(prefix="/sms", tags=["SMS"])
|
|
|
|
class SendCodeRequest(BaseModel):
|
|
phone_number: str
|
|
|
|
class SendCodeResponse(BaseModel):
|
|
success: bool
|
|
provider: str
|
|
phone_number: str
|
|
code: str | None = None
|
|
error: str | None = None
|
|
|
|
@router.post("/send", response_model=SendCodeResponse)
|
|
async def send_code(
|
|
request: SendCodeRequest,
|
|
service: SmsService = Depends(get_sms_service),
|
|
) -> SendCodeResponse:
|
|
try:
|
|
result = await service.send_code(request.phone_number)
|
|
except RateLimitExceeded as e:
|
|
raise HTTPException(
|
|
status_code=429,
|
|
detail={"error": "Слишком много запросов для этого номера", "retry_after": e.retry_after},
|
|
headers={"Retry-After": str(e.retry_after)},
|
|
)
|
|
if not result.success:
|
|
raise HTTPException(status_code=502, detail=result.error or "Ошибка отправки SMS")
|
|
return SendCodeResponse(
|
|
success=True,
|
|
provider=result.provider,
|
|
phone_number=request.phone_number,
|
|
code=result.code,
|
|
) |