import uuid from typing import Annotated from fastapi import APIRouter, Depends, Header, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.auth import require_api_key from app.db import get_session from app.payments import create_payment, get_payment from app.schemas import PaymentAccepted, PaymentCreate, PaymentDetails router = APIRouter( prefix="/api/v1/payments", tags=["payments"], dependencies=[Depends(require_api_key)], ) @router.post("", response_model=PaymentAccepted, status_code=status.HTTP_202_ACCEPTED) async def post_payment( request: PaymentCreate, idempotency_key: Annotated[ str, Header(alias="Idempotency-Key", min_length=1, max_length=255), ], session: Annotated[AsyncSession, Depends(get_session)], ) -> PaymentAccepted: payment = await create_payment(session, request, idempotency_key) return PaymentAccepted.model_validate(payment) @router.get("/{payment_id}", response_model=PaymentDetails) async def read_payment( payment_id: uuid.UUID, session: Annotated[AsyncSession, Depends(get_session)], ) -> PaymentDetails: payment = await get_payment(session, payment_id) if payment is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Payment not found") return PaymentDetails.model_validate(payment)