41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
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)
|