Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 12 additions & 12 deletions rest/python/server/generated_routes/ucp_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@

from typing import Annotated
from fastapi import APIRouter, Body, Header
import ucp_sdk.models.schemas.shopping.checkout_create_req
import ucp_sdk.models.schemas.shopping.checkout_resp
import ucp_sdk.models.schemas.shopping.checkout_update_req
import ucp_sdk.models.schemas.shopping.checkout_create_request
import ucp_sdk.models.schemas.shopping.checkout
import ucp_sdk.models.schemas.shopping.checkout_update_request
import ucp_sdk.models.schemas.shopping.order
import ucp_sdk.models.schemas.shopping.payment_create_req
import ucp_sdk.models.schemas.shopping.payment_resp
import ucp_sdk.models.schemas.shopping.payment_create_request
import ucp_sdk.models.schemas.shopping.payment

router = APIRouter()


@router.post(
"/checkout-sessions",
response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse,
response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout,
status_code=201,
operation_id="create_checkout",
summary="Create Checkout",
)
async def create_checkout(
body: Annotated[
ucp_sdk.models.schemas.shopping.checkout_create_req.CheckoutCreateRequest,
ucp_sdk.models.schemas.shopping.checkout_create_request.CheckoutCreateRequest,
Body(...),
],
authorization: str = Header(None, alias="Authorization"),
Expand All @@ -42,7 +42,7 @@ async def create_checkout(

@router.get(
"/checkout-sessions/{id}",
response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse,
response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout,
status_code=200,
operation_id="get_checkout",
summary="Get Checkout",
Expand All @@ -67,15 +67,15 @@ async def get_checkout(

@router.put(
"/checkout-sessions/{id}",
response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse,
response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout,
status_code=200,
operation_id="update_checkout",
summary="Update Checkout",
)
async def update_checkout(
id: str,
body: Annotated[
ucp_sdk.models.schemas.shopping.checkout_update_req.CheckoutUpdateRequest,
ucp_sdk.models.schemas.shopping.checkout_update_request.CheckoutUpdateRequest,
Body(...),
],
authorization: str = Header(None, alias="Authorization"),
Expand All @@ -96,7 +96,7 @@ async def update_checkout(

@router.post(
"/checkout-sessions/{id}/complete",
response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse,
response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout,
status_code=200,
operation_id="complete_checkout",
summary="Complete Checkout",
Expand All @@ -122,7 +122,7 @@ async def complete_checkout(

@router.post(
"/checkout-sessions/{id}/cancel",
response_model=ucp_sdk.models.schemas.shopping.checkout_resp.CheckoutResponse,
response_model=ucp_sdk.models.schemas.shopping.checkout.Checkout,
status_code=200,
operation_id="cancel_checkout",
summary="Cancel Checkout",
Expand Down
42 changes: 10 additions & 32 deletions rest/python/server/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,47 +20,25 @@
"""

from ucp_sdk.models.schemas.shopping.ap2_mandate import (
CheckoutResponseWithAp2 as Ap2Checkout,
Checkout as Ap2Checkout,
)
from ucp_sdk.models.schemas.shopping.buyer_consent_create_req import (
Checkout as BuyerConsentCheckoutCreate,
from ucp_sdk.models.schemas.shopping.buyer_consent import (
Checkout as BuyerConsentCheckout,
)
from ucp_sdk.models.schemas.shopping.buyer_consent_resp import (
Checkout as BuyerConsentCheckoutResp,
)
from ucp_sdk.models.schemas.shopping.buyer_consent_update_req import (
Checkout as BuyerConsentCheckoutUpdate,
)
from ucp_sdk.models.schemas.shopping.discount_create_req import (
Checkout as DiscountCheckoutCreate,
)
from ucp_sdk.models.schemas.shopping.discount_resp import (
Checkout as DiscountCheckoutResp,
)
from ucp_sdk.models.schemas.shopping.discount_update_req import (
Checkout as DiscountCheckoutUpdate,
)
from ucp_sdk.models.schemas.shopping.fulfillment_create_req import (
Checkout as FulfillmentCreateRequest,
)
from ucp_sdk.models.schemas.shopping.fulfillment_resp import (
Checkout as FulfillmentCheckout,
)
from ucp_sdk.models.schemas.shopping.fulfillment_update_req import (
Checkout as FulfillmentUpdateRequest,
from ucp_sdk.models.schemas.shopping.discount import (
Checkout as DiscountCheckout,
)
from ucp_sdk.models.schemas.shopping.order import Order
from ucp_sdk.models.schemas.shopping.order import PlatformConfig
from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig


class UnifiedOrder(Order):
"""Order model supporting extensions."""


class UnifiedCheckout(
BuyerConsentCheckoutResp,
FulfillmentCheckout,
DiscountCheckoutResp,
BuyerConsentCheckout,
DiscountCheckout,
Ap2Checkout,
):
"""Checkout model supporting various extensions."""
Expand All @@ -69,13 +47,13 @@ class UnifiedCheckout(


class UnifiedCheckoutCreateRequest(
FulfillmentCreateRequest, DiscountCheckoutCreate, BuyerConsentCheckoutCreate
BuyerConsentCheckout, DiscountCheckout
):
"""Create request model combining base fields and extensions."""


class UnifiedCheckoutUpdateRequest(
FulfillmentUpdateRequest, DiscountCheckoutUpdate, BuyerConsentCheckoutUpdate
BuyerConsentCheckout, DiscountCheckout
):
"""Update request model combining base fields and extensions."""

Expand Down
2 changes: 1 addition & 1 deletion rest/python/server/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ packages = ["."]

[tool.uv.sources]
# The relative path is stored here
ucp-sdk = { path = "../../../../sdk/python/", editable = true }
ucp-sdk = { path = "../../../../../sdk/python/", editable = true }

[tool.ruff]
line-length = 80
Expand Down
6 changes: 2 additions & 4 deletions rest/python/server/routes/discovery.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
import uuid
from fastapi import APIRouter
from fastapi import Request
from ucp_sdk.models.discovery.profile_schema import UcpDiscoveryProfile

router = APIRouter()

PROFILE_TEMPLATE_PATH = pathlib.Path(__file__).parent / "discovery_profile.json"
Expand All @@ -31,7 +29,7 @@

@router.get(
"/.well-known/ucp",
response_model=UcpDiscoveryProfile,
response_model=dict,
summary="Get Merchant Profile",
)
async def get_merchant_profile(request: Request):
Expand All @@ -45,4 +43,4 @@ async def get_merchant_profile(request: Request):
"{{ENDPOINT}}", str(request.base_url).rstrip("/")
).replace("{{SHOP_ID}}", SHOP_ID)

return UcpDiscoveryProfile(**json.loads(profile_json))
return json.loads(profile_json)
6 changes: 3 additions & 3 deletions rest/python/server/routes/ucp_implementation.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,10 @@
from pydantic import BaseModel
from pydantic import HttpUrl
from services.checkout_service import CheckoutService
from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2CompleteRequest
from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2 as Ap2CompleteRequest
from ucp_sdk.models.schemas.shopping.order import Order
from ucp_sdk.models.schemas.shopping.order import PlatformConfig
from ucp_sdk.models.schemas.shopping.payment_create_req import (
from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig
from ucp_sdk.models.schemas.shopping.payment_create_request import (
PaymentCreateRequest,
)
from ucp_sdk.models.schemas.shopping.types.payment_instrument import (
Expand Down
78 changes: 46 additions & 32 deletions rest/python/server/services/checkout_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,63 +54,77 @@
from pydantic import BaseModel
from services.fulfillment_service import FulfillmentService
from sqlalchemy.ext.asyncio import AsyncSession
from ucp_sdk.models._internal import Response
from ucp_sdk.models._internal import ResponseCheckout
from ucp_sdk.models._internal import ResponseOrder
from ucp_sdk.models._internal import Version
from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2CompleteRequest
from ucp_sdk.models.schemas.shopping.discount_resp import Allocation
from ucp_sdk.models.schemas.shopping.discount_resp import AppliedDiscount
from ucp_sdk.models.schemas.shopping.discount_resp import DiscountsObject
from ucp_sdk.models.schemas.shopping.fulfillment_resp import (
from pydantic import ConfigDict
from ucp_sdk.models.schemas.shopping.ap2_mandate import Ap2 as Ap2CompleteRequest
from ucp_sdk.models.schemas.shopping.discount import Allocation
from ucp_sdk.models.schemas.shopping.discount import AppliedDiscount
from ucp_sdk.models.schemas.shopping.discount import DiscountsObject
from ucp_sdk.models.schemas.shopping.fulfillment.dev.ucp.shopping import (
Fulfillment as FulfillmentResp,
)
from ucp_sdk.models.schemas.shopping.order import (
Fulfillment as OrderFulfillment,
)
from ucp_sdk.models.schemas.shopping.order import Order
from ucp_sdk.models.schemas.shopping.order import PlatformConfig
from ucp_sdk.models.schemas.shopping.payment_create_req import (
from ucp_sdk.models.schemas.shopping.order import PlatformSchema as PlatformConfig
from ucp_sdk.models.schemas.shopping.payment_create_request import (
PaymentCreateRequest,
)
from ucp_sdk.models.schemas.shopping.payment_resp import PaymentResponse
from ucp_sdk.models.schemas.shopping.payment import Payment as PaymentResponse
from ucp_sdk.models.schemas.shopping.types import order_line_item
from ucp_sdk.models.schemas.shopping.types import total_resp
from ucp_sdk.models.schemas.shopping.types.card_credential import CardCredential
from ucp_sdk.models.schemas.shopping.types.expectation import Expectation
from ucp_sdk.models.schemas.shopping.types.expectation import (
LineItem as ExpectationLineItem,
)
from ucp_sdk.models.schemas.shopping.types.fulfillment_destination_resp import (
FulfillmentDestinationResponse,
from ucp_sdk.models.schemas.shopping.types.fulfillment_destination import (
FulfillmentDestination as FulfillmentDestinationResponse,
)
from ucp_sdk.models.schemas.shopping.types.fulfillment_group_resp import (
FulfillmentGroupResponse,
from ucp_sdk.models.schemas.shopping.types.fulfillment_group import (
FulfillmentGroup as FulfillmentGroupResponse,
)
from ucp_sdk.models.schemas.shopping.types.fulfillment_method_resp import (
FulfillmentMethodResponse,
from ucp_sdk.models.schemas.shopping.types.fulfillment_method import (
FulfillmentMethod as FulfillmentMethodResponse,
)
from ucp_sdk.models.schemas.shopping.types.fulfillment_resp import (
FulfillmentResponse,
from ucp_sdk.models.schemas.shopping.types.fulfillment import (
Fulfillment as FulfillmentResponse,
)
from ucp_sdk.models.schemas.shopping.types.item_resp import ItemResponse
from ucp_sdk.models.schemas.shopping.types.line_item_resp import (
LineItemResponse,
from ucp_sdk.models.schemas.shopping.types.item import Item as ItemResponse
from ucp_sdk.models.schemas.shopping.types.line_item import (
LineItem as LineItemResponse,
)
from ucp_sdk.models.schemas.shopping.types.order_confirmation import (
OrderConfirmation,
)
from ucp_sdk.models.schemas.shopping.types.order_line_item import OrderLineItem
from ucp_sdk.models.schemas.shopping.types.postal_address import PostalAddress
from ucp_sdk.models.schemas.shopping.types.shipping_destination_resp import (
ShippingDestinationResponse,
from ucp_sdk.models.schemas.shopping.types.shipping_destination import (
ShippingDestination as ShippingDestinationResponse,
)
from ucp_sdk.models.schemas.shopping.types.token_credential_resp import (
TokenCredentialResponse,
)
from ucp_sdk.models.schemas.shopping.types.total_resp import (
TotalResponse as Total,
from ucp_sdk.models.schemas.shopping.types.token_credential import (
TokenCredential as TokenCredentialResponse,
)
from ucp_sdk.models.schemas.shopping.types.total import Total
from ucp_sdk.models.schemas.ucp import Version


# Compatibility shims for removed ucp_sdk.models._internal classes
class Response(BaseModel):
model_config = ConfigDict(extra="allow")
name: str | None = None
version: Any = None


class ResponseCheckout(BaseModel):
model_config = ConfigDict(extra="allow")
version: Any = None
capabilities: list[Any] | None = None


class ResponseOrder(BaseModel):
model_config = ConfigDict(extra="allow")
version: Any = None
capabilities: list[Any] | None = None

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -773,7 +787,7 @@ async def complete_checkout(
permalink_url=checkout.order.permalink_url,
line_items=order_line_items,
totals=[
total_resp.TotalResponse(**t.model_dump()) for t in checkout.totals
Total(**t.model_dump()) for t in checkout.totals
],
fulfillment=OrderFulfillment(expectations=expectations, events=[]),
)
Expand Down
21 changes: 9 additions & 12 deletions rest/python/server/services/fulfillment_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,11 @@

import db
from sqlalchemy.ext.asyncio import AsyncSession
from ucp_sdk.models.schemas.shopping.fulfillment_resp import FulfillmentOption
from ucp_sdk.models.schemas.shopping.types.fulfillment_option_resp import (
FulfillmentOptionResponse,
from ucp_sdk.models.schemas.shopping.types.fulfillment_option import (
FulfillmentOption,
)
from ucp_sdk.models.schemas.shopping.types.postal_address import PostalAddress
from ucp_sdk.models.schemas.shopping.types.total_resp import TotalResponse
from ucp_sdk.models.schemas.shopping.types.total import Total as TotalResponse


class FulfillmentService:
Expand Down Expand Up @@ -110,14 +109,12 @@ async def calculate_options(

options.append(
FulfillmentOption(
root=FulfillmentOptionResponse(
id=rate.id,
title=title,
totals=[
TotalResponse(type="subtotal", amount=price),
TotalResponse(type="total", amount=price),
],
)
id=rate.id,
title=title,
totals=[
TotalResponse(type="subtotal", amount=price),
TotalResponse(type="total", amount=price),
],
)
)

Expand Down