Coverage for polar/integrations/plain/endpoints.py: 48%
19 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1import hashlib
2import hmac
4from fastapi import Depends, Header, HTTPException, Request
6from polar.config import settings
7from polar.postgres import AsyncSession, get_db_session
8from polar.routing import APIRouter
10from .schemas import CustomerCardsRequest, CustomerCardsResponse
11from .service import plain as plain_service
13router = APIRouter(
14 prefix="/integrations/plain", tags=["integrations_plain"], include_in_schema=False
15)
18@router.post("/cards")
19async def get_cards(
20 request: Request,
21 customer_cards_request: CustomerCardsRequest,
22 plain_request_signature: str = Header(...),
23 session: AsyncSession = Depends(get_db_session),
24) -> CustomerCardsResponse:
25 secret = settings.PLAIN_REQUEST_SIGNING_SECRET
26 if secret is None:
27 raise HTTPException(status_code=404)
29 raw_body = await request.body()
30 signature = hmac.new(secret.encode("utf-8"), raw_body, hashlib.sha256).hexdigest()
31 if not hmac.compare_digest(signature, plain_request_signature):
32 raise HTTPException(status_code=403)
34 return await plain_service.get_cards(session, customer_cards_request)