Files
payment-processing-test/app/api.py
T

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)