TorbatYar/backend/services/communication/app/api/v1/otp.py
Mortezakoohjani e41ecfad4c Sync platform docs, infra, and module services with Accounting integration.
Include Loyalty/Communication/Sports Center backends and registry updates alongside production nginx and compose wiring.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-25 22:35:23 +03:30

43 lines
1.5 KiB
Python

from uuid import UUID
from fastapi import APIRouter, Depends
from app.api.deps import AsyncSession, CurrentUser, get_db, require_tenant
from app.api.permissions import require_permissions
from app.permissions.definitions import OTP_REQUEST, OTP_VERIFY
from app.schemas.common import OTPRequest, OTPRequestOut, OTPVerifyOut, OTPVerifyRequest
from app.services.otp_service import OTPService
router = APIRouter()
@router.post("/request", response_model=OTPRequestOut, status_code=201)
async def request_otp(
body: OTPRequest,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
user: CurrentUser = Depends(require_permissions(OTP_REQUEST)),
):
challenge, debug_code = await OTPService(session).request(
tenant_id, body.model_dump(), actor_id=user.user_id
)
return OTPRequestOut(
challenge_id=challenge.id,
destination=challenge.destination,
channel=challenge.channel,
expires_at=challenge.expires_at,
message_id=challenge.message_id,
debug_code=debug_code,
)
@router.post("/verify", response_model=OTPVerifyOut)
async def verify_otp(
body: OTPVerifyRequest,
tenant_id: UUID = Depends(require_tenant),
session: AsyncSession = Depends(get_db),
_: CurrentUser = Depends(require_permissions(OTP_VERIFY)),
):
result = await OTPService(session).verify(tenant_id, body.model_dump())
return OTPVerifyOut(**result)