Skip to content
Merged
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
8 changes: 8 additions & 0 deletions codegen/pkg/builder/transform.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,14 @@ func (b *Builder) createObject(schema *base.Schema, name string) (Writable, []Wr
}
}

// Treat an object without declared properties or additionalProperties as an
// open-ended payload. Some APIs use this to signal "send the provider payload
// as-is", and generating an empty BaseModel would otherwise reject all keys.
if !hasProperties && !hasAdditionalProperties {
hasAdditionalProperties = true
additionalPropertyType = "object"
}

if !hasProperties && hasAdditionalProperties {
return &TypeAlias{
Comment: schemaDoc(name, schema),
Expand Down
58 changes: 52 additions & 6 deletions openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -6474,7 +6474,9 @@
"boleto",
"ideal",
"blik",
"bancontact"
"bancontact",
"google_pay",
"apple_pay"
]
},
"installments": {
Expand All @@ -6489,6 +6491,50 @@
"card": {
"$ref": "#/components/schemas/Card"
},
"google_pay": {
"description": "Raw `PaymentData` object received from Google Pay. Send the Google Pay response payload as-is.",
"type": "object",
"example": {
"apiVersionMinor": 0,
"apiVersion": 2,
"paymentMethodData": {
"description": "Visa •••• 1111",
"tokenizationData": {
"type": "PAYMENT_GATEWAY",
"token": "token-data"
},
"type": "CARD",
"info": {
"cardNetwork": "VISA",
"cardDetails": "1111"
}
}
}
},
"apple_pay": {
"description": "Raw payment token object received from Apple Pay. Send the Apple Pay response payload as-is.",
"type": "object",
"example": {
"token": {
"paymentData": {
"data": "si2xuT2ArQo689SfE-long-token",
"signature": "MIAGCSqGSIb3DQEHA-long-signature",
"header": {
"publicKeyHash": "PWfjDi3TSwgZ20TY/A7f3V6J/1rhHyRDCspbeljM0io=",
"ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEaBtz7UN2MNV0qInJVEEhXy10PU0KfO6KxFjXm93oKWL6lCsxZZGDl/EKioUHVSlKgpsKGin0xvgldfxeJVgy0g==",
"transactionId": "62e0568bc9258e9d0e059d745650fc8211d05ef7a7a1589a6411bf9b12cdfd04"
},
"version": "EC_v1"
},
"paymentMethod": {
"displayName": "MasterCard 8837",
"network": "MasterCard",
"type": "debit"
},
"transactionIdentifier": "62E0568BC9258E9D0E059D745650FC8211D05EF7A7A1589A6411BF9B12CDFD04"
}
}
},
"token": {
"description": "__Required when using a tokenized card to process a checkout.__ Unique token identifying the saved payment card for a customer.",
"type": "string"
Expand Down Expand Up @@ -8848,7 +8894,7 @@
"description": "The company's legal name.",
"type": "string",
"example": "Gin & Doughnuts Bar GmbH",
"maxLength": 512,
"maxLength": 150,
"minLength": 1
},
"merchant_category_code": {
Expand Down Expand Up @@ -8908,7 +8954,7 @@
"description": "The customer-facing business name.",
"type": "string",
"example": "Example Coffee",
"maxLength": 512,
"maxLength": 150,
"minLength": 1
},
"dynamic_descriptor": {
Expand All @@ -8924,13 +8970,13 @@
"type": "string",
"format": "uri",
"example": "https://example.com",
"maxLength": 512
"maxLength": 255
},
"email": {
"description": "A publicly available email address.",
"type": "string",
"example": "contact@example.com",
"maxLength": 256
"maxLength": 255
},
"phone_number": {
"$ref": "#/components/schemas/PhoneNumber"
Expand All @@ -8954,7 +9000,7 @@
"description": "A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.\n",
"type": "string",
"example": "+420123456789",
"maxLength": 64
"maxLength": 16
},
"Branding": {
"description": "Settings used to apply the Merchant's branding to email receipts, invoices, checkouts, and other products.",
Expand Down
22 changes: 21 additions & 1 deletion sumup/checkouts/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,9 +79,19 @@ class CreateCheckoutBody(pydantic.BaseModel):


ProcessCheckoutBodyPaymentType = typing.Union[
typing.Literal["bancontact", "blik", "boleto", "card", "ideal"], str
typing.Literal["apple_pay", "bancontact", "blik", "boleto", "card", "google_pay", "ideal"], str
]

ProcessCheckoutBodyGooglePay = dict[str, object]
"""
Raw `PaymentData` object received from Google Pay. Send the Google Pay response payload as-is.
"""

ProcessCheckoutBodyApplePay = dict[str, object]
"""
Raw payment token object received from Apple Pay. Send the Apple Pay response payload as-is.
"""


class ProcessCheckoutBody(pydantic.BaseModel):
"""
Expand All @@ -93,6 +103,11 @@ class ProcessCheckoutBody(pydantic.BaseModel):
Describes the payment method used to attempt processing
"""

apple_pay: typing.Optional[ProcessCheckoutBodyApplePay] = None
"""
Raw payment token object received from Apple Pay. Send the Apple Pay response payload as-is.
"""

card: typing.Optional[Card] = None
"""
__Required when payment type is `card`.__ Details of the payment card.
Expand All @@ -103,6 +118,11 @@ class ProcessCheckoutBody(pydantic.BaseModel):
__Required when `token` is provided.__ Unique ID of the customer.
"""

google_pay: typing.Optional[ProcessCheckoutBodyGooglePay] = None
"""
Raw `PaymentData` object received from Google Pay. Send the Google Pay response payload as-is.
"""

installments: typing.Optional[int] = None
"""
Number of installments for deferred payments. Available only to merchant users in Brazil.
Expand Down
48 changes: 34 additions & 14 deletions sumup/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -562,7 +562,7 @@ class PersonalIdentifier(pydantic.BaseModel):
"""
A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.

Max length: 64
Max length: 16
"""

Version = str
Expand Down Expand Up @@ -655,7 +655,7 @@ class BasePerson(pydantic.BaseModel):
phone_number: typing.Optional[PhoneNumber] = None
"""
A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.
Max length: 64
Max length: 16
"""

relationships: typing.Optional[list[str]] = None
Expand Down Expand Up @@ -796,27 +796,27 @@ class BusinessProfile(pydantic.BaseModel):
email: typing.Optional[str] = None
"""
A publicly available email address.
Max length: 256
Max length: 255
"""

name: typing.Optional[str] = None
"""
The customer-facing business name.
Min length: 1
Max length: 512
Max length: 150
"""

phone_number: typing.Optional[PhoneNumber] = None
"""
A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.
Max length: 64
Max length: 16
"""

website: typing.Optional[str] = None
"""
The business's publicly available website.
Format: uri
Max length: 512
Max length: 255
"""


Expand Down Expand Up @@ -1677,13 +1677,13 @@ class Company(pydantic.BaseModel):
"""
The company's legal name.
Min length: 1
Max length: 512
Max length: 150
"""

phone_number: typing.Optional[PhoneNumber] = None
"""
A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.
Max length: 64
Max length: 16
"""

trading_address: typing.Optional[Address] = None
Expand Down Expand Up @@ -2448,7 +2448,7 @@ class Person(pydantic.BaseModel):
phone_number: typing.Optional[PhoneNumber] = None
"""
A publicly available phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format.
Max length: 64
Max length: 16
"""

relationships: typing.Optional[list[str]] = None
Expand Down Expand Up @@ -3355,9 +3355,19 @@ def additional_properties(self, value: dict[str, object]) -> None:


ProcessCheckoutPaymentType = typing.Union[
typing.Literal["bancontact", "blik", "boleto", "card", "ideal"], str
typing.Literal["apple_pay", "bancontact", "blik", "boleto", "card", "google_pay", "ideal"], str
]

ProcessCheckoutGooglePay = dict[str, object]
"""
Raw `PaymentData` object received from Google Pay. Send the Google Pay response payload as-is.
"""

ProcessCheckoutApplePay = dict[str, object]
"""
Raw payment token object received from Apple Pay. Send the Apple Pay response payload as-is.
"""


class ProcessCheckout(pydantic.BaseModel):
"""
Expand All @@ -3369,6 +3379,11 @@ class ProcessCheckout(pydantic.BaseModel):
Describes the payment method used to attempt processing
"""

apple_pay: typing.Optional[ProcessCheckoutApplePay] = None
"""
Raw payment token object received from Apple Pay. Send the Apple Pay response payload as-is.
"""

card: typing.Optional[Card] = None
"""
__Required when payment type is `card`.__ Details of the payment card.
Expand All @@ -3379,6 +3394,11 @@ class ProcessCheckout(pydantic.BaseModel):
__Required when `token` is provided.__ Unique ID of the customer.
"""

google_pay: typing.Optional[ProcessCheckoutGooglePay] = None
"""
Raw `PaymentData` object received from Google Pay. Send the Google Pay response payload as-is.
"""

installments: typing.Optional[int] = None
"""
Number of installments for deferred payments. Available only to merchant users in Brazil.
Expand Down Expand Up @@ -3967,10 +3987,10 @@ class ReceiptTransaction(pydantic.BaseModel):
"""


class ReceiptEmvData(pydantic.BaseModel):
"""
EMV-specific metadata returned for card-present payments.
"""
ReceiptEmvData = dict[str, object]
"""
EMV-specific metadata returned for card-present payments.
"""


class ReceiptAcquirerData(pydantic.BaseModel):
Expand Down
Loading