56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, Request
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from api.depends import get_session, verify_identity_token
|
|
from api.v2.schemas.payment_links import PaymentLinkCreateRequest, PaymentLinkCreateResponse
|
|
from database import identities as idb
|
|
from handlers.payments import create_payment_link
|
|
from handlers.payments.payment_links import PaymentLinkRequest
|
|
|
|
router = APIRouter(tags=["PaymentLinks"])
|
|
|
|
|
|
async def _resolve_tg_id(body: PaymentLinkCreateRequest, session: AsyncSession) -> int:
|
|
"""Возвращает tg_id из body.tg_id или из identity_id; иначе исключение."""
|
|
if body.tg_id is not None:
|
|
return body.tg_id
|
|
if body.identity_id:
|
|
tg_id = await idb.resolve_tg_id(session, body.identity_id)
|
|
if tg_id is not None:
|
|
return tg_id
|
|
raise HTTPException(
|
|
status_code=400,
|
|
detail="У идентичности не привязан Telegram. Привяжите tg_id для создания платёжной ссылки.",
|
|
)
|
|
raise HTTPException(status_code=400, detail="Укажите tg_id или identity_id")
|
|
|
|
|
|
@router.post("/", response_model=PaymentLinkCreateResponse)
|
|
async def create_link(
|
|
body: PaymentLinkCreateRequest,
|
|
http_request: Request,
|
|
session: AsyncSession = Depends(get_session),
|
|
identity=Depends(verify_identity_token),
|
|
):
|
|
"""Создаёт платёжную ссылку через выбранную кассу (единая точка входа). Принимает identity_id или tg_id."""
|
|
try:
|
|
tg_id = await _resolve_tg_id(body, session)
|
|
except HTTPException:
|
|
raise
|
|
payment_request = PaymentLinkRequest(
|
|
tg_id=tg_id,
|
|
amount=body.amount,
|
|
currency=body.currency or "RUB",
|
|
provider_id=body.provider_id,
|
|
success_url=body.success_url,
|
|
failure_url=body.failure_url,
|
|
metadata=body.metadata,
|
|
)
|
|
result = await create_payment_link(session, payment_request)
|
|
return PaymentLinkCreateResponse(
|
|
success=result.success,
|
|
payment_id=result.payment_id,
|
|
payment_url=result.payment_url,
|
|
error=result.error,
|
|
)
|