real middleman: BTCPay payment gate + webhook + Printful adapter + checkout redirect

This commit is contained in:
drjones
2026-08-26 16:52:04 -07:00
parent f2482c72fb
commit 3037f3c996
11 changed files with 242 additions and 10 deletions

View File

@@ -15,10 +15,11 @@ from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from app.database import get_db
from app.engines.payments import btcpay
from app.routers.auth import require_admin
from app.engines.order_router import route_order
from app.models import AuditLog, Customer, Order, Product
from app.schemas import CustomerOrderOut, OrderCreate, OrderOut, TrackingIn
from app.schemas import CheckoutResponse, CustomerOrderOut, OrderCreate, OrderOut, TrackingIn
router = APIRouter()
@@ -36,7 +37,7 @@ def _new_order_number() -> str:
return f"POL-{datetime.utcnow():%Y%m%d}-{uuid.uuid4().hex[:6].upper()}"
@router.post("", response_model=OrderOut)
@router.post("", response_model=CheckoutResponse)
def create_order(body: OrderCreate, db: Session = Depends(get_db)):
email = body.customer_email.strip().lower()
customer = db.query(Customer).filter(Customer.email == email).first()
@@ -69,14 +70,27 @@ def create_order(body: OrderCreate, db: Session = Depends(get_db)):
customer_id=customer.id,
items=items,
retail_total=retail_total,
status="new",
status="pending_payment",
)
db.add(order)
db.flush()
result = route_order(db, order)
if not result.get("routed"):
raise HTTPException(status_code=400, detail="no eligible supplier for this order")
checkout_url = None
try:
inv = btcpay.create_invoice(float(order.retail_total), order.order_number)
order.btcpay_invoice_id = inv.get("invoice_id")
checkout_url = inv.get("checkout_url")
db.commit()
except Exception as e:
db.rollback()
raise HTTPException(status_code=502, detail=f"payment provider unavailable: {e}")
db.refresh(order)
return order
return CheckoutResponse(order=order, checkout_url=checkout_url)
@router.get("", response_model=List[OrderOut])