diff --git a/README.md b/README.md index 701d5d57..92762c57 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # Apple App Store Server Java Library -The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), and [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node). +The Java server library for the [App Store Server API](https://developer.apple.com/documentation/appstoreserverapi), [App Store Server Notifications](https://developer.apple.com/documentation/appstoreservernotifications), [Retention Messaging API](https://developer.apple.com/documentation/retentionmessaging), and [Advanced Commerce API](https://developer.apple.com/documentation/AdvancedCommerceAPI). Also available in [Swift](https://github.com/apple/app-store-server-library-swift), [Python](https://github.com/apple/app-store-server-library-python), and [Node.js](https://github.com/apple/app-store-server-library-node). ## Table of Contents 1. [Installation](#installation) diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java new file mode 100644 index 00000000..a4f7100b --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceBaseItem.java @@ -0,0 +1,39 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +public abstract class AbstractAdvancedCommerceBaseItem { + private static final String SERIALIZED_NAME_SKU = "SKU"; + + @JsonProperty(value = SERIALIZED_NAME_SKU, required = true) + protected String sku; + + protected AbstractAdvancedCommerceBaseItem() {} + + protected AbstractAdvancedCommerceBaseItem(String sku) { + this.sku = AdvancedCommerceValidationUtils.validateSku(sku); + } + + protected abstract AbstractAdvancedCommerceBaseItem self(); + + public AbstractAdvancedCommerceBaseItem sku(String sku) { + this.sku = AdvancedCommerceValidationUtils.validateSku(sku); + return self(); + } + + /** + * The product identifier of an in-app purchase product you manage in your own system. + * + * @return SKU + * @see SKU + **/ + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = AdvancedCommerceValidationUtils.validateSku(sku); + } + +} diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java new file mode 100644 index 00000000..4eca35b0 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceInAppRequest.java @@ -0,0 +1,45 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +public abstract class AbstractAdvancedCommerceInAppRequest> extends AdvancedCommerceRequest implements AdvancedCommerceInAppRequest { + + private static final String SERIALIZED_NAME_OPERATION = "operation"; + private static final String SERIALIZED_NAME_VERSION = "version"; + + @JsonProperty(value = SERIALIZED_NAME_OPERATION, required = true) + private final String operation; + @JsonProperty(value = SERIALIZED_NAME_VERSION, required = true) + private final String version; + + protected AbstractAdvancedCommerceInAppRequest() { + this.operation = null; + this.version = null; + } + + protected AbstractAdvancedCommerceInAppRequest(String operation, String version, AdvancedCommerceRequestInfo requestInfo) { + super(requestInfo); + this.operation = Objects.requireNonNull(operation); + this.version = Objects.requireNonNull(version); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AbstractAdvancedCommerceInAppRequest that = (AbstractAdvancedCommerceInAppRequest) o; + return Objects.equals(operation, that.operation) && Objects.equals(version, that.version); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), operation, version); + } + + protected abstract T self(); +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java new file mode 100644 index 00000000..4a3551c3 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceItem.java @@ -0,0 +1,86 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; +import java.util.Objects; + +public abstract class AbstractAdvancedCommerceItem extends AbstractAdvancedCommerceBaseItem { + private static final String SERIALIZED_NAME_DESCRIPTION = "description"; + private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName"; + + @JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true) + protected String description; + @JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true) + protected String displayName; + + protected AbstractAdvancedCommerceItem() {} + + protected AbstractAdvancedCommerceItem(String sku, String description, String displayName) { + super(sku); + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + protected abstract AbstractAdvancedCommerceItem self(); + + public AbstractAdvancedCommerceItem description(String description) { + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + return self(); + } + + /** + * A string you provide that describes a SKU. + * + * @return description + * @see description + **/ + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + } + + public AbstractAdvancedCommerceItem displayName(String displayName) { + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + return self(); + } + + /** + * A string with a product name that you can localize and is suitable for display to customers. + * + * @return displayName + * @see displayName + **/ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + AbstractAdvancedCommerceItem that = (AbstractAdvancedCommerceItem) o; + return Objects.equals(this.sku, that.sku) && + Objects.equals(this.description, that.description) && + Objects.equals(this.displayName, that.displayName); + } + + @Override + public int hashCode() { + return Objects.hash(sku, description, displayName); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java new file mode 100644 index 00000000..d2e02a63 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AbstractAdvancedCommerceResponse.java @@ -0,0 +1,104 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; +import java.util.Objects; + +public abstract class AbstractAdvancedCommerceResponse { + + private static final String SERIALIZED_NAME_SIGNED_RENEWAL_INFO = "signedRenewalInfo"; + private static final String SERIALIZED_NAME_SIGNED_TRANSACTION_INFO = "signedTransactionInfo"; + + @JsonProperty(SERIALIZED_NAME_SIGNED_RENEWAL_INFO) + private String signedRenewalInfo; + @JsonProperty(SERIALIZED_NAME_SIGNED_TRANSACTION_INFO) + private String signedTransactionInfo; + @JsonAnySetter + private Map unknownFields; + + protected AbstractAdvancedCommerceResponse() {} + + protected abstract AbstractAdvancedCommerceResponse self(); + + protected AbstractAdvancedCommerceResponse(String signedRenewalInfo, String signedTransactionInfo) { + this.signedRenewalInfo = signedRenewalInfo; + this.signedTransactionInfo = signedTransactionInfo; + } + + public AbstractAdvancedCommerceResponse signedRenewalInfo(String signedRenewalInfo) { + this.signedRenewalInfo = signedRenewalInfo; + return self(); + } + + /** + * Subscription renewal information, signed by the App Store, in JSON Web Signature (JWS) format. + * + * @return signedRenewalInfo + * @see JWSRenewalInfo + **/ + public String getSignedRenewalInfo() { + return signedRenewalInfo; + } + + public void setSignedRenewalInfo(String signedRenewalInfo) { + this.signedRenewalInfo = signedRenewalInfo; + } + + public AbstractAdvancedCommerceResponse signedTransactionInfo(String signedTransactionInfo) { + this.signedTransactionInfo = signedTransactionInfo; + return self(); + } + + /** + * Transaction information signed by the App Store, in JSON Web Signature (JWS) Compact Serialization format. + * + * @return signedTransactionInfo + * @see JWSTransaction + **/ + public String getSignedTransactionInfo() { + return signedTransactionInfo; + } + + public void setSignedTransactionInfo(String signedTransactionInfo) { + this.signedTransactionInfo = signedTransactionInfo; + } + + public AbstractAdvancedCommerceResponse unknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + return self(); + } + + public Map getUnknownFields() { + return unknownFields; + } + + public void setUnknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AbstractAdvancedCommerceResponse that = (AbstractAdvancedCommerceResponse) o; + return Objects.equals(signedRenewalInfo, that.signedRenewalInfo) && Objects.equals(signedTransactionInfo, that.signedTransactionInfo) && Objects.equals(unknownFields, that.unknownFields); + } + + @Override + public int hashCode() { + return Objects.hash(signedRenewalInfo, signedTransactionInfo, unknownFields); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + signedRenewalInfo + '\'' + + ", signedTransactionInfo='" + signedTransactionInfo + '\'' + + ", unknownFields=" + unknownFields + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java new file mode 100644 index 00000000..e09db23c --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceDescriptors.java @@ -0,0 +1,106 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; +import java.util.Objects; + +/** + * The display name and description of a subscription product. + * + * @see Descriptors + */ +public class AdvancedCommerceDescriptors { + private static final String SERIALIZED_NAME_DESCRIPTION = "description"; + private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName"; + + @JsonProperty(value = SERIALIZED_NAME_DESCRIPTION, required = true) + protected String description; + @JsonProperty(value = SERIALIZED_NAME_DISPLAY_NAME, required = true) + protected String displayName; + @JsonAnySetter + private Map unknownFields; + + protected AdvancedCommerceDescriptors() {} + + protected AdvancedCommerceDescriptors(String description, String displayName) { + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + public AdvancedCommerceDescriptors description(String description) { + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + return this; + } + + /** + * A string you provide that describes a SKU. + * + * @return description + * @see description + **/ + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = AdvancedCommerceValidationUtils.validateDescription(description); + } + + public AdvancedCommerceDescriptors displayName(String displayName) { + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + return this; + } + + /** + * A string with a product name that you can localize and is suitable for display to customers. + * + * @return displayName + * @see displayName + **/ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + public AdvancedCommerceDescriptors unknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + return this; + } + + public Map getUnknownFields() { + return unknownFields; + } + + public void setUnknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceDescriptors that = (AdvancedCommerceDescriptors) o; + return Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName) && Objects.equals(unknownFields, that.unknownFields); + } + + @Override + public int hashCode() { + return Objects.hash(description, displayName, unknownFields); + } + + @Override + public String toString() { + return "AdvancedCommerceDescriptors{" + + "description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", unknownFields=" + unknownFields + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java new file mode 100644 index 00000000..a66e61d1 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceEffective.java @@ -0,0 +1,41 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * A string value that indicates when a requested change to an auto-renewable subscription goes into effect. + * + * @see effective + */ +public enum AdvancedCommerceEffective { + + IMMEDIATELY("IMMEDIATELY"), + NEXT_BILL_CYCLE("NEXT_BILL_CYCLE"); + + private final String value; + + AdvancedCommerceEffective(String value) { + this.value = value; + } + + public static AdvancedCommerceEffective fromValue(String value) { + for (AdvancedCommerceEffective b : AdvancedCommerceEffective.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java new file mode 100644 index 00000000..6d7ea77a --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOffer.java @@ -0,0 +1,182 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Map; +import java.util.Objects; + +/** + * A discount offer for an auto-renewable subscription. + * + * @see Offer + */ +public class AdvancedCommerceOffer { + + private static final String SERIALIZED_NAME_PERIOD = "period"; + private static final String SERIALIZED_NAME_PERIOD_COUNT = "periodCount"; + private static final String SERIALIZED_NAME_PRICE = "price"; + private static final String SERIALIZED_NAME_REASON = "reason"; + + @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true) + private String period; + @JsonProperty(value = SERIALIZED_NAME_PERIOD_COUNT, required = true) + private Integer periodCount; + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + @JsonProperty(value = SERIALIZED_NAME_REASON, required = true) + private String reason; + @JsonAnySetter + private Map unknownFields; + + private AdvancedCommerceOffer() {} + + public AdvancedCommerceOffer(String rawPeriod, Integer periodCount, Long price, String rawReason) { + this.period = Objects.requireNonNull(rawPeriod); + this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount); + this.price = Objects.requireNonNull(price); + this.reason = Objects.requireNonNull(rawReason); + } + + + public AdvancedCommerceOffer(AdvancedCommerceOfferPeriod period, Integer periodCount, Long price, AdvancedCommerceOfferReason reason) { + this.period = Objects.requireNonNull(period).getValue(); + this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount); + this.price = Objects.requireNonNull(price); + this.reason = Objects.requireNonNull(reason).getValue(); + } + + public AdvancedCommerceOffer period(AdvancedCommerceOfferPeriod period) { + this.period = Objects.requireNonNull(period).getValue(); + return this; + } + + /** + * The period of the offer. + * + * @return period + **/ + public AdvancedCommerceOfferPeriod getPeriod() { + return AdvancedCommerceOfferPeriod.fromValue(period); + } + + /** + * @see #getPeriod() + */ + public String getRawPeriod() { + return period; + } + + public void setPeriod(AdvancedCommerceOfferPeriod period) { + this.period = Objects.requireNonNull(period).getValue(); + } + + public void setRawPeriod(String rawPeriod) { + this.period = Objects.requireNonNull(rawPeriod); + } + + public AdvancedCommerceOffer periodCount(Integer periodCount) { + this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount); + return this; + } + + /** + * The number of periods the offer is active. + * + * @return periodCount + **/ + public Integer getPeriodCount() { + return periodCount; + } + + public void setPeriodCount(Integer periodCount) { + this.periodCount = AdvancedCommerceValidationUtils.validatePeriodCount(periodCount); + } + + public AdvancedCommerceOffer price(Long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * The offer price, in milliunits. + * + * @return price + * @see Price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceOffer reason(AdvancedCommerceOfferReason reason) { + this.reason = Objects.requireNonNull(reason).getValue(); + return this; + } + + /** + * The reason for the offer. + * + * @return reason + **/ + public AdvancedCommerceOfferReason getReason() { + return AdvancedCommerceOfferReason.fromValue(reason); + } + + /** + * @see #getReason() + */ + public String getRawReason() { + return reason; + } + + public void setReason(AdvancedCommerceOfferReason reason) { + this.reason = Objects.requireNonNull(reason).getValue(); + } + + public void setRawReason(String rawReason) { + this.reason = Objects.requireNonNull(rawReason); + } + + public AdvancedCommerceOffer unknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + return this; + } + + public Map getUnknownFields() { + return unknownFields; + } + + public void setUnknownFields(Map unknownFields) { + this.unknownFields = unknownFields; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceOffer that = (AdvancedCommerceOffer) o; + return Objects.equals(period, that.period) && Objects.equals(periodCount, that.periodCount) && Objects.equals(price, that.price) && Objects.equals(reason, that.reason) && Objects.equals(unknownFields, that.unknownFields); + } + + @Override + public int hashCode() { + return Objects.hash(period, periodCount, price, reason, unknownFields); + } + + @Override + public String toString() { + return "AdvancedCommerceOffer{" + + "period='" + period + '\'' + + ", periodCount=" + periodCount + + ", price=" + price + + ", reason='" + reason + '\'' + + ", unknownFields=" + unknownFields + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java new file mode 100644 index 00000000..2836b423 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferPeriod.java @@ -0,0 +1,48 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * The period of the offer. + * + * @see Offer + */ +public enum AdvancedCommerceOfferPeriod { + + P3D("P3D"), + P1W("P1W"), + P2W("P2W"), + P1M("P1M"), + P2M("P2M"), + P3M("P3M"), + P6M("P6M"), + P9M("P9M"), + P1Y("P1Y"); + + private final String value; + + AdvancedCommerceOfferPeriod(String value) { + this.value = value; + } + + public static AdvancedCommerceOfferPeriod fromValue(String value) { + for (AdvancedCommerceOfferPeriod b : AdvancedCommerceOfferPeriod.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java new file mode 100644 index 00000000..34882109 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOfferReason.java @@ -0,0 +1,42 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * The reason for the offer. + * + * @see Offer + */ +public enum AdvancedCommerceOfferReason { + + ACQUISITION("ACQUISITION"), + WIN_BACK("WIN_BACK"), + RETENTION("RETENTION"); + + private final String value; + + AdvancedCommerceOfferReason(String value) { + this.value = value; + } + + public static AdvancedCommerceOfferReason fromValue(String value) { + for (AdvancedCommerceOfferReason b : AdvancedCommerceOfferReason.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java new file mode 100644 index 00000000..182da6ac --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeCreateRequest.java @@ -0,0 +1,158 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The request data your app provides when a customer purchases a one-time-charge product. + * + * @see OneTimeChargeCreateRequest + */ +public class AdvancedCommerceOneTimeChargeCreateRequest extends AbstractAdvancedCommerceInAppRequest { + + /** + * The constant that represents the operation of this request. + */ + private static final String OPERATION = "CREATE_ONE_TIME_CHARGE"; + /** + * The version number of the API. + */ + private static final String VERSION = "1"; + + private static final String SERIALIZED_NAME_CURRENCY = "currency"; + private static final String SERIALIZED_NAME_ITEM = "item"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TAX_CODE = "taxCode"; + + @JsonProperty(value = SERIALIZED_NAME_CURRENCY, required = true) + private String currency; + @JsonProperty(value = SERIALIZED_NAME_ITEM, required = true) + private AdvancedCommerceOneTimeChargeItem item; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true) + private String taxCode; + + private AdvancedCommerceOneTimeChargeCreateRequest() {} + + public AdvancedCommerceOneTimeChargeCreateRequest( + String currency, + AdvancedCommerceOneTimeChargeItem item, + AdvancedCommerceRequestInfo requestInfo, + String taxCode + ) { + super(OPERATION, VERSION, requestInfo); + this.currency = Objects.requireNonNull(currency); + this.item = Objects.requireNonNull(item); + this.taxCode = Objects.requireNonNull(taxCode); + } + + @Override + protected AdvancedCommerceOneTimeChargeCreateRequest self() { + return this; + } + + public AdvancedCommerceOneTimeChargeCreateRequest currency(String currency) { + this.currency = Objects.requireNonNull(currency); + return this; + } + + /** + * The currency of the price of the product. + * + * @return currency + * @see currency + **/ + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = Objects.requireNonNull(currency); + } + + public AdvancedCommerceOneTimeChargeCreateRequest item(AdvancedCommerceOneTimeChargeItem item) { + this.item = Objects.requireNonNull(item); + return this; + } + + /** + * The details of the product for purchase. + * + * @return item + * @see OneTimeChargeItem + **/ + public AdvancedCommerceOneTimeChargeItem getItem() { + return item; + } + + public void setItem(AdvancedCommerceOneTimeChargeItem item) { + this.item = Objects.requireNonNull(item); + } + + public AdvancedCommerceOneTimeChargeCreateRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * The storefront for the transaction. + * + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + public AdvancedCommerceOneTimeChargeCreateRequest taxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + return this; + } + + /** + * The tax code for this product. + * + * @return taxCode + * @see taxCode + **/ + public String getTaxCode() { + return taxCode; + } + + public void setTaxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceOneTimeChargeCreateRequest that = (AdvancedCommerceOneTimeChargeCreateRequest) o; + return Objects.equals(currency, that.currency) && Objects.equals(item, that.item) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), currency, item, storefront, taxCode); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "currency='" + currency + '\'' + + ", item=" + item + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + ", taxCode='" + taxCode + '\'' + + "}"; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java new file mode 100644 index 00000000..52c86631 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceOneTimeChargeItem.java @@ -0,0 +1,76 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The details of a one-time charge product, including its display name, price, SKU, and metadata. + * + * @see OneTimeChargeItem + */ +public class AdvancedCommerceOneTimeChargeItem extends AbstractAdvancedCommerceItem { + private static final String SERIALIZED_NAME_PRICE = "price"; + + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + + private AdvancedCommerceOneTimeChargeItem() { + super(); + } + + @Override + protected AdvancedCommerceOneTimeChargeItem self() { + return this; + } + + public AdvancedCommerceOneTimeChargeItem(String description, String displayName, String sku, Long price) { + super(sku, description, displayName); + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceOneTimeChargeItem price(Long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * The price, in milliunits of the currency, of the one-time charge product. + * + * @return price + * @see price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceOneTimeChargeItem that = (AdvancedCommerceOneTimeChargeItem) o; + return Objects.equals(price, that.price); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), price); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", price=" + price + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java new file mode 100644 index 00000000..f5dca799 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommercePeriod.java @@ -0,0 +1,45 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * The duration of a single cycle of an auto-renewable subscription. + * + * @see period + */ +public enum AdvancedCommercePeriod { + + P1W("P1W"), + P1M("P1M"), + P2M("P2M"), + P3M("P3M"), + P6M("P6M"), + P1Y("P1Y"); + + private final String value; + + AdvancedCommercePeriod(String value) { + this.value = value; + } + + public static AdvancedCommercePeriod fromValue(String value) { + for (AdvancedCommercePeriod b : AdvancedCommercePeriod.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java new file mode 100644 index 00000000..46f53c1d --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceReason.java @@ -0,0 +1,41 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * The data your app provides to change an item of an auto-renewable subscription. + * + * @see SubscriptionModifyChangeItem + */ +public enum AdvancedCommerceReason { + UPGRADE("UPGRADE"), + DOWNGRADE("DOWNGRADE"), + APPLY_OFFER("APPLY_OFFER"); + + private final String value; + + AdvancedCommerceReason(String value) { + this.value = value; + } + + public static AdvancedCommerceReason fromValue(String value) { + for (AdvancedCommerceReason b : AdvancedCommerceReason.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java new file mode 100644 index 00000000..ab864e51 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundReason.java @@ -0,0 +1,46 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * A reason to request a refund. + * + * @see refundReason + */ +public enum AdvancedCommerceRefundReason { + + UNINTENDED_PURCHASE("UNINTENDED_PURCHASE"), + FULFILLMENT_ISSUE("FULFILLMENT_ISSUE"), + UNSATISFIED_WITH_PURCHASE("UNSATISFIED_WITH_PURCHASE"), + LEGAL("LEGAL"), + OTHER("OTHER"), + MODIFY_ITEMS_REFUND("MODIFY_ITEMS_REFUND"), + SIMULATE_REFUND_DECLINE("SIMULATE_REFUND_DECLINE"); + + private final String value; + + AdvancedCommerceRefundReason(String value) { + this.value = value; + } + + public static AdvancedCommerceRefundReason fromValue(String value) { + for (AdvancedCommerceRefundReason b : AdvancedCommerceRefundReason.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java new file mode 100644 index 00000000..14e0e9f3 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRefundType.java @@ -0,0 +1,42 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonValue; + +/** + * Information about the refund request for an item, such as its SKU, the refund amount, reason, and type. + * + * @see RequestRefundItem + */ +public enum AdvancedCommerceRefundType { + + FULL("FULL"), + PRORATED("PRORATED"), + CUSTOM("CUSTOM"); + + private final String value; + + AdvancedCommerceRefundType(String value) { + this.value = value; + } + + public static AdvancedCommerceRefundType fromValue(String value) { + for (AdvancedCommerceRefundType b : AdvancedCommerceRefundType.values()) { + if (b.value.equals(value)) { + return b; + } + } + return null; + } + + @JsonValue + public String getValue() { + return value; + } + + @Override + public String toString() { + return String.valueOf(value); + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java new file mode 100644 index 00000000..21fa12de --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequest.java @@ -0,0 +1,55 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +public abstract class AdvancedCommerceRequest> { + + protected static final String SERIALIZED_NAME_REQUEST_INFO = "requestInfo"; + + @JsonProperty(value = SERIALIZED_NAME_REQUEST_INFO, required = true) + protected AdvancedCommerceRequestInfo requestInfo; + + protected AdvancedCommerceRequest() {} + + public AdvancedCommerceRequest(AdvancedCommerceRequestInfo requestInfo) { + this.requestInfo = Objects.requireNonNull(requestInfo); + } + + public T requestInfo(AdvancedCommerceRequestInfo requestInfo) { + this.requestInfo = Objects.requireNonNull(requestInfo); + return self(); + } + + /** + * The metadata to include in server requests. + * + * @return requestInfo + * @see RequestInfo + **/ + public AdvancedCommerceRequestInfo getRequestInfo() { + return requestInfo; + } + + public void setRequestInfo(AdvancedCommerceRequestInfo requestInfo) { + this.requestInfo = Objects.requireNonNull(requestInfo); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceRequest that = (AdvancedCommerceRequest) o; + return Objects.equals(requestInfo, that.requestInfo); + } + + @Override + public int hashCode() { + return Objects.hashCode(requestInfo); + } + + protected abstract T self(); +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java new file mode 100644 index 00000000..d428502c --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestInfo.java @@ -0,0 +1,109 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; +import java.util.UUID; + +/** + * The metadata to include in server requests. + * + * @see RequestInfo + */ +public class AdvancedCommerceRequestInfo { + private static final String SERIALIZED_NAME_APP_ACCOUNT_TOKEN = "appAccountToken"; + private static final String SERIALIZED_NAME_CONSISTENCY_TOKEN = "consistencyToken"; + private static final String SERIALIZED_NAME_REQUEST_REFERENCE_ID = "requestReferenceId"; + + @JsonProperty(SERIALIZED_NAME_APP_ACCOUNT_TOKEN) + private UUID appAccountToken; + @JsonProperty(SERIALIZED_NAME_CONSISTENCY_TOKEN) + private String consistencyToken; + @JsonProperty(value = SERIALIZED_NAME_REQUEST_REFERENCE_ID, required = true) + private UUID requestReferenceId; + + private AdvancedCommerceRequestInfo() {} + + public AdvancedCommerceRequestInfo(UUID requestReferenceId) { + this.requestReferenceId = Objects.requireNonNull(requestReferenceId); + } + + public AdvancedCommerceRequestInfo appAccountToken(UUID appAccountToken) { + this.appAccountToken = appAccountToken; + return this; + } + + /** + * A UUID that represents an app account token, to associate with the transaction in the request. + * + * @return appAccountToken + **/ + public UUID getAppAccountToken() { + return appAccountToken; + } + + public void setAppAccountToken(UUID appAccountToken) { + this.appAccountToken = appAccountToken; + } + + public AdvancedCommerceRequestInfo consistencyToken(String consistencyToken) { + this.consistencyToken = consistencyToken; + return this; + } + + /** + * The value of the advancedCommerceConsistencyToken that you receive in the JWSRenewalInfo renewal information for a subscription. Don’t generate this value. + * + * @return consistencyToken + * @see advancedCommerceConsistencyToken + **/ + public String consistencyToken() { + return consistencyToken; + } + + public void setConsistencyToken(String consistencyToken) { + this.consistencyToken = consistencyToken; + } + + public AdvancedCommerceRequestInfo requestReferenceId(UUID requestReferenceId) { + this.requestReferenceId = Objects.requireNonNull(requestReferenceId); + return this; + } + + /** + * A UUID that you provide to uniquely identify each request. If the request times out, you can use the same requestReferenceId value to retry the request. Otherwise, provide a unique value. + * + * @return requestReferenceId + **/ + public UUID getRequestReferenceId() { + return requestReferenceId; + } + + public void setRequestReferenceId(UUID requestReferenceId) { + this.requestReferenceId = Objects.requireNonNull(requestReferenceId); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceRequestInfo that = (AdvancedCommerceRequestInfo) o; + return Objects.equals(appAccountToken, that.appAccountToken) && Objects.equals(consistencyToken, that.consistencyToken) && Objects.equals(requestReferenceId, that.requestReferenceId); + } + + @Override + public int hashCode() { + return Objects.hash(appAccountToken, consistencyToken, requestReferenceId); + } + + @Override + public String toString() { + return "RequestInfo{" + + "appAccountToken=" + appAccountToken + + ", consistencyToken='" + consistencyToken + '\'' + + ", requestReferenceId=" + requestReferenceId + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java new file mode 100644 index 00000000..45cbc7bc --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundItem.java @@ -0,0 +1,172 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * Information about the refund request for an item, such as its SKU, the refund amount, reason, and type. + * + * @see RequestRefundItem + */ +public class AdvancedCommerceRequestRefundItem extends AbstractAdvancedCommerceBaseItem { + private static final String SERIALIZED_NAME_REFUND_AMOUNT = "refundAmount"; + private static final String SERIALIZED_NAME_REFUND_REASON = "refundReason"; + private static final String SERIALIZED_NAME_REFUND_TYPE = "refundType"; + private static final String SERIALIZED_NAME_REVOKE = "revoke"; + + @JsonProperty(SERIALIZED_NAME_REFUND_AMOUNT) + private Integer refundAmount; + @JsonProperty(value = SERIALIZED_NAME_REFUND_REASON, required = true) + private String refundReason; + @JsonProperty(value = SERIALIZED_NAME_REFUND_TYPE, required = true) + private String refundType; + @JsonProperty(value = SERIALIZED_NAME_REVOKE, required = true) + private Boolean revoke; + + private AdvancedCommerceRequestRefundItem() { + super(); + } + + public AdvancedCommerceRequestRefundItem( + String sku, + String rawRefundReason, + String rawRefundType, + Boolean revoke + ) { + super(sku); + this.refundReason = Objects.requireNonNull(rawRefundReason); + this.refundType = Objects.requireNonNull(rawRefundType); + this.revoke = Objects.requireNonNull(revoke); + } + + public AdvancedCommerceRequestRefundItem( + String sku, + AdvancedCommerceRefundReason refundReason, + AdvancedCommerceRefundType refundType, + Boolean revoke + ) { + super(sku); + this.refundReason = Objects.requireNonNull(refundReason).getValue(); + this.refundType = Objects.requireNonNull(refundType).getValue(); + this.revoke = Objects.requireNonNull(revoke); + } + + @Override + protected AdvancedCommerceRequestRefundItem self() { + return this; + } + + public AdvancedCommerceRequestRefundItem refundAmount(Integer refundAmount) { + this.refundAmount = refundAmount; + return this; + } + + /** + * The refund amount you’re requesting for the SKU, in milliunits of the currency. + * + * @return refundAmount + * @see refundAmount + **/ + public Integer getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(Integer refundAmount) { + this.refundAmount = refundAmount; + } + + public AdvancedCommerceRequestRefundItem refundReason(AdvancedCommerceRefundReason refundReason) { + this.refundReason = Objects.requireNonNull(refundReason).getValue(); + return this; + } + + /** + * The reason for the refund request. + * + * @return refundReason + * @see refundReason + **/ + public AdvancedCommerceRefundReason getRefundReason() { + return AdvancedCommerceRefundReason.fromValue(refundReason); + } + + public void setRefundReason(AdvancedCommerceRefundReason refundReason) { + this.refundReason = Objects.requireNonNull(refundReason).getValue(); + } + + public void setRawRefundReason(String rawRefundReason) { + this.refundReason = Objects.requireNonNull(rawRefundReason); + } + + public AdvancedCommerceRequestRefundItem refundType(AdvancedCommerceRefundType refundType) { + this.refundType = Objects.requireNonNull(refundType).getValue(); + return this; + } + + /** + * The type of refund requested. + * + * @return refundType + **/ + public AdvancedCommerceRefundType getRefundType() { + return AdvancedCommerceRefundType.fromValue(refundType); + } + + /** + * @see #getRefundType() + */ + public String getRawRefundType() { + return refundType; + } + + public void setRefundType(AdvancedCommerceRefundType refundType) { + this.refundType = Objects.requireNonNull(refundType).getValue(); + } + + public void setRawRefundType(String rawRefundType) { + this.refundType = Objects.requireNonNull(rawRefundType); + } + + public AdvancedCommerceRequestRefundItem revoke(Boolean revoke) { + this.revoke = Objects.requireNonNull(revoke); + return this; + } + + /** + * @return revoke + **/ + public Boolean getRevoke() { + return revoke; + } + + public void setRevoke(Boolean revoke) { + this.revoke = Objects.requireNonNull(revoke); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceRequestRefundItem that = (AdvancedCommerceRequestRefundItem) o; + return Objects.equals(sku, that.sku) && Objects.equals(refundAmount, that.refundAmount) && Objects.equals(refundReason, that.refundReason) && Objects.equals(refundType, that.refundType) && Objects.equals(revoke, that.revoke); + } + + @Override + public int hashCode() { + return Objects.hash(sku, refundAmount, refundReason, refundType, revoke); + } + + @Override + public String toString() { + return "AdvancedCommerceRequestRefundItem{" + + "sku='" + sku + '\'' + + ", refundAmount=" + refundAmount + + ", refundReason=" + refundReason + + ", refundType='" + refundType + '\'' + + ", revoke=" + revoke + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java new file mode 100644 index 00000000..be527008 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundRequest.java @@ -0,0 +1,153 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Objects; + +/** + * The request body for requesting a refund for a transaction. + * + * @see RequestRefundRequest + */ +public class AdvancedCommerceRequestRefundRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_CURRENCY = "currency"; + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_REFUND_RISKING_PREFERENCE = "refundRiskingPreference"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + + @JsonProperty(SERIALIZED_NAME_CURRENCY) + private String currency; + @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true) + private List items; + @JsonProperty(value = SERIALIZED_NAME_REFUND_RISKING_PREFERENCE, required = true) + private Boolean refundRiskingPreference; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + + private AdvancedCommerceRequestRefundRequest() { + super(); + } + + public AdvancedCommerceRequestRefundRequest( + List items, + Boolean refundRiskingPreference, + AdvancedCommerceRequestInfo requestInfo + ) { + super(requestInfo); + this.items = Objects.requireNonNull(items); + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + } + + @Override + protected AdvancedCommerceRequestRefundRequest self() { + return this; + } + + public AdvancedCommerceRequestRefundRequest currency(String currency) { + this.currency = Objects.requireNonNull(currency); + return this; + } + + /** + * The currency of the transaction. + * + * @return currency + * @see currency + **/ + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = Objects.requireNonNull(currency); + } + + public AdvancedCommerceRequestRefundRequest items(List items) { + this.items = Objects.requireNonNull(items); + return this; + } + + public AdvancedCommerceRequestRefundRequest addItem(AdvancedCommerceRequestRefundItem item) { + Objects.requireNonNull(item); + this.items.add(item); + return this; + } + + /** + * @return items + * @see RequestRefundItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = Objects.requireNonNull(items); + } + + public AdvancedCommerceRequestRefundRequest refundRiskingPreference(Boolean refundRiskingPreference) { + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + return this; + } + + /** + * @return refundRiskingPreference + * @see RefundRiskingPreference + **/ + public Boolean getRefundRiskingPreference() { + return refundRiskingPreference; + } + + public void setRefundRiskingPreference(Boolean refundRiskingPreference) { + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + } + + + public AdvancedCommerceRequestRefundRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceRequestRefundRequest that = (AdvancedCommerceRequestRefundRequest) o; + return Objects.equals(currency, that.currency) && + Objects.equals(items, that.items) && + Objects.equals(refundRiskingPreference, that.refundRiskingPreference) && + Objects.equals(storefront, that.storefront); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), currency, items, refundRiskingPreference, storefront); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "currency='" + currency + '\'' + + ", items=" + items + + ", refundRiskingPreference=" + refundRiskingPreference + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java new file mode 100644 index 00000000..a4bfda29 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceRequestRefundResponse.java @@ -0,0 +1,58 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * The response body for a transaction refund request. + * + * @see RequestRefundResponse + */ +public class AdvancedCommerceRequestRefundResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceRequestRefundResponse() { + super(); + } + + public AdvancedCommerceRequestRefundResponse(String signedTransactionInfo) { + super(null, Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceRequestRefundResponse self() { + return this; + } + + @Override + public AdvancedCommerceRequestRefundResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceRequestRefundResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' + + ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java new file mode 100644 index 00000000..27907666 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelRequest.java @@ -0,0 +1,74 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The request body for turning off automatic renewal of a subscription. + * + * @see SubscriptionCancelRequest + */ +public class AdvancedCommerceSubscriptionCancelRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + + private AdvancedCommerceSubscriptionCancelRequest() { + super(); + } + + public AdvancedCommerceSubscriptionCancelRequest(AdvancedCommerceRequestInfo requestInfo) { + super(requestInfo); + } + + public AdvancedCommerceSubscriptionCancelRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + protected AdvancedCommerceSubscriptionCancelRequest self() { + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + if (!super.equals(o)) + return false; + AdvancedCommerceSubscriptionCancelRequest that = (AdvancedCommerceSubscriptionCancelRequest) o; + return Objects.equals(storefront, that.storefront); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), storefront); + } + + @Override + public String toString() { + return "AdvancedCommerceSubscriptionCancelRequest{" + + "requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java new file mode 100644 index 00000000..42b1412f --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCancelResponse.java @@ -0,0 +1,57 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * The response body for a successful subscription cancellation. + * + * @see SubscriptionCancelResponse + */ +public class AdvancedCommerceSubscriptionCancelResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceSubscriptionCancelResponse() { + super(); + } + + public AdvancedCommerceSubscriptionCancelResponse(String signedRenewalInfo, String signedTransactionInfo) { + super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceSubscriptionCancelResponse self() { + return this; + } + + @Override + public AdvancedCommerceSubscriptionCancelResponse signedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + return (AdvancedCommerceSubscriptionCancelResponse) super.signedRenewalInfo(signedRenewalInfo); + } + + @Override + public AdvancedCommerceSubscriptionCancelResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceSubscriptionCancelResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + super.setSignedRenewalInfo(signedRenewalInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' + + ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java new file mode 100644 index 00000000..66b62c3e --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataDescriptors.java @@ -0,0 +1,110 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The subscription metadata to change, specifically the description and display name. + * + * @see SubscriptionChangeMetadataDescriptors + */ +public class AdvancedCommerceSubscriptionChangeMetadataDescriptors { + private static final String SERIALIZED_NAME_EFFECTIVE = "effective"; + private static final String SERIALIZED_NAME_DESCRIPTION = "description"; + private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName"; + + @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true) + private AdvancedCommerceEffective effective; + @JsonProperty(SERIALIZED_NAME_DESCRIPTION) + private String description; + @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME) + private String displayName; + + private AdvancedCommerceSubscriptionChangeMetadataDescriptors() {} + + public AdvancedCommerceSubscriptionChangeMetadataDescriptors(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionChangeMetadataDescriptors effective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + return this; + } + + /** + * The string that determines when the metadata change goes into effect. + * + * @return effective + * @see Effective + **/ + public AdvancedCommerceEffective getEffective() { + return effective; + } + + public void setEffective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionChangeMetadataDescriptors description(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + return this; + } + + /** + * The new description for the subscription. + * + * @return description + * @see description + **/ + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + } + + public AdvancedCommerceSubscriptionChangeMetadataDescriptors displayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + return this; + } + + /** + * The new display name for the subscription. + * + * @return displayName + * @see displayName + **/ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceSubscriptionChangeMetadataDescriptors that = (AdvancedCommerceSubscriptionChangeMetadataDescriptors) o; + return Objects.equals(effective, that.effective) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), effective, description, displayName); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "effective=" + effective + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java new file mode 100644 index 00000000..37f18812 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataItem.java @@ -0,0 +1,157 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The metadata to change for an item, specifically its SKU, description, and display name. + * + * @see SubscriptionChangeMetadataItem + */ +public class AdvancedCommerceSubscriptionChangeMetadataItem { + private static final String SERIALIZED_NAME_CURRENT_SKU = "currentSKU"; + private static final String SERIALIZED_NAME_EFFECTIVE = "effective"; + private static final String SERIALIZED_NAME_DESCRIPTION = "description"; + private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName"; + private static final String SERIALIZED_NAME_SKU = "SKU"; + + @JsonProperty(value = SERIALIZED_NAME_CURRENT_SKU, required = true) + private String currentSku; + @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true) + private AdvancedCommerceEffective effective; + @JsonProperty(SERIALIZED_NAME_DESCRIPTION) + private String description; + @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME) + private String displayName; + @JsonProperty(SERIALIZED_NAME_SKU) + private String sku; + + private AdvancedCommerceSubscriptionChangeMetadataItem() {} + + public AdvancedCommerceSubscriptionChangeMetadataItem(String currentSKU, AdvancedCommerceEffective effective) { + this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSKU); + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionChangeMetadataItem currentSku(String currentSku) { + this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSku); + return this; + } + + /** + * The original SKU of the item. + * + * @return currentSku + * @see SKU + **/ + public String getCurrentSku() { + return currentSku; + } + + public void setCurrentSku(String currentSku) { + this.currentSku = AdvancedCommerceValidationUtils.validateSku(currentSku); + } + + public AdvancedCommerceSubscriptionChangeMetadataItem effective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + return this; + } + + /** + * The string that determines when the metadata change goes into effect. + * + * @return effective + * @see effective + **/ + public AdvancedCommerceEffective getEffective() { + return effective; + } + + public void setEffective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionChangeMetadataItem description(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + return this; + } + + /** + * The new description for the item. + * + * @return description + * @see description + **/ + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + } + + public AdvancedCommerceSubscriptionChangeMetadataItem displayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + return this; + } + + /** + * The new display name for the item. + * + * @return displayName + * @see displayName + **/ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + public AdvancedCommerceSubscriptionChangeMetadataItem sku(String sku) { + this.sku = AdvancedCommerceValidationUtils.validateSku(sku); + return this; + } + + /** + * The new SKU of the item. + * + * @return SKU + * @see SKU + **/ + public String getSku() { + return sku; + } + + public void setSku(String sku) { + this.sku = sku == null ? null : AdvancedCommerceValidationUtils.validateSku(sku); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceSubscriptionChangeMetadataItem that = (AdvancedCommerceSubscriptionChangeMetadataItem) o; + return Objects.equals(effective, that.effective) && Objects.equals(currentSku, that.currentSku) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName) && Objects.equals(sku, that.sku); + } + + @Override + public int hashCode() { + return Objects.hash(effective, currentSku, description, displayName, sku); + } + + @Override + public String toString() { + return "AdvancedCommerceSubscriptionChangeMetadataItem{" + + "sku='" + sku + '\'' + + ", currentSku='" + currentSku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", effective=" + effective + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java new file mode 100644 index 00000000..59e72fcd --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataRequest.java @@ -0,0 +1,144 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The request body you provide to change the metadata of a subscription. + * + * @see SubscriptionChangeMetadataRequest + */ +public class AdvancedCommerceSubscriptionChangeMetadataRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors"; + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TAX_CODE = "taxCode"; + + @JsonProperty(SERIALIZED_NAME_DESCRIPTORS) + private AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors; + @JsonProperty(SERIALIZED_NAME_ITEMS) + private List items; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(SERIALIZED_NAME_TAX_CODE) + private String taxCode; + + private AdvancedCommerceSubscriptionChangeMetadataRequest() {} + + public AdvancedCommerceSubscriptionChangeMetadataRequest(AdvancedCommerceRequestInfo requestInfo) { + super(requestInfo); + } + + @Override + protected AdvancedCommerceSubscriptionChangeMetadataRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionChangeMetadataRequest descriptors(AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors) { + this.descriptors = descriptors; + return this; + } + + /** + * @return descriptors + * @see SubscriptionChangeMetadataDescriptors + **/ + public AdvancedCommerceSubscriptionChangeMetadataDescriptors getDescriptors() { + return descriptors; + } + + public void setDescriptors(AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors) { + this.descriptors = descriptors; + } + + public AdvancedCommerceSubscriptionChangeMetadataRequest items(List items) { + this.items = items; + return this; + } + + public AdvancedCommerceSubscriptionChangeMetadataRequest addItem(AdvancedCommerceSubscriptionChangeMetadataItem item) { + Objects.requireNonNull(item); + if (this.items == null) { + this.items = new ArrayList<>(); + } + this.items.add(item); + return this; + } + + /** + * @return items + * @see SubscriptionChangeMetadataItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + + public AdvancedCommerceSubscriptionChangeMetadataRequest taxCode(String taxCode) { + this.taxCode = taxCode; + return this; + } + + /** + * @return taxCode + * @see TaxCode + **/ + public String getTaxCode() { + return taxCode; + } + + public void setTaxCode(String taxCode) { + this.taxCode = taxCode; + } + + public AdvancedCommerceSubscriptionChangeMetadataRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionChangeMetadataRequest that = (AdvancedCommerceSubscriptionChangeMetadataRequest) o; + return Objects.equals(descriptors, that.descriptors) && Objects.equals(items, that.items) && Objects.equals(taxCode, that.taxCode) && Objects.equals(storefront, that.storefront); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), descriptors, items, storefront, taxCode); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "descriptors=" + descriptors + '\'' + + ", items=" + items + '\'' + + ", requestInfo=" + getRequestInfo() + '\'' + + ", storefront='" + storefront + '\'' + + ", taxCode='" + taxCode + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java new file mode 100644 index 00000000..f3921a66 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionChangeMetadataResponse.java @@ -0,0 +1,57 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * The response body for a successful subscription metadata change. + * + * @see SubscriptionChangeMetadataResponse + */ +public class AdvancedCommerceSubscriptionChangeMetadataResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceSubscriptionChangeMetadataResponse() { + super(); + } + + public AdvancedCommerceSubscriptionChangeMetadataResponse(String signedRenewalInfo, String signedTransactionInfo) { + super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceSubscriptionChangeMetadataResponse self() { + return this; + } + + @Override + public AdvancedCommerceSubscriptionChangeMetadataResponse signedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + return (AdvancedCommerceSubscriptionChangeMetadataResponse) super.signedRenewalInfo(signedRenewalInfo); + } + + @Override + public AdvancedCommerceSubscriptionChangeMetadataResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceSubscriptionChangeMetadataResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + super.setSignedRenewalInfo(signedRenewalInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' + + ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java new file mode 100644 index 00000000..4dfb477a --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateItem.java @@ -0,0 +1,95 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The data that describes a subscription item. + * + * @see SubscriptionCreateItem + */ +public class AdvancedCommerceSubscriptionCreateItem extends AbstractAdvancedCommerceItem { + private static final String SERIALIZED_NAME_OFFER = "offer"; + private static final String SERIALIZED_NAME_PRICE = "price"; + + @JsonProperty(SERIALIZED_NAME_OFFER) + private AdvancedCommerceOffer offer; + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + + private AdvancedCommerceSubscriptionCreateItem() { + super(); + } + + @Override + protected AbstractAdvancedCommerceItem self() { + return this; + } + + public AdvancedCommerceSubscriptionCreateItem(String sku, String description, String displayName, Long price) { + super(sku, description, displayName); + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceSubscriptionCreateItem offer(AdvancedCommerceOffer offer) { + this.offer = offer; + return this; + } + + /** + * @return offer + * @see Offer + **/ + public AdvancedCommerceOffer getOffer() { + return offer; + } + + public void setOffer(AdvancedCommerceOffer offer) { + this.offer = offer; + } + + public AdvancedCommerceSubscriptionCreateItem price(Long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * @return price + * @see price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionCreateItem that = (AdvancedCommerceSubscriptionCreateItem) o; + return Objects.equals(offer, that.offer) && Objects.equals(price, that.price); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), offer, price); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", offer=" + offer + '\'' + + ", price=" + price + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java new file mode 100644 index 00000000..b518ffef --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionCreateRequest.java @@ -0,0 +1,217 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Objects; + +/** + * The request data your app provides when a customer purchases an auto-renewable subscription. + * + * @see SubscriptionCreateRequest + */ +public class AdvancedCommerceSubscriptionCreateRequest extends AbstractAdvancedCommerceInAppRequest { + private static final String OPERATION = "CREATE_SUBSCRIPTION"; + private static final String VERSION = "1"; + + private static final String SERIALIZED_NAME_CURRENCY = "currency"; + private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors"; + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_PERIOD = "period"; + private static final String SERIALIZED_NAME_PREVIOUS_TRANSACTION_ID = "previousTransactionId"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TAX_CODE = "taxCode"; + + @JsonProperty(value = SERIALIZED_NAME_CURRENCY, required = true) + private String currency; + @JsonProperty(value = SERIALIZED_NAME_DESCRIPTORS, required = true) + private AdvancedCommerceDescriptors descriptors; + @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true) + private List items; + @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true) + private AdvancedCommercePeriod period; + @JsonProperty(SERIALIZED_NAME_PREVIOUS_TRANSACTION_ID) + private String previousTransactionId; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true) + private String taxCode; + + private AdvancedCommerceSubscriptionCreateRequest() {} + + public AdvancedCommerceSubscriptionCreateRequest( + String currency, + AdvancedCommerceDescriptors descriptors, + List items, + AdvancedCommercePeriod period, + AdvancedCommerceRequestInfo requestInfo, + String taxCode + ) { + super(OPERATION, VERSION, requestInfo); + this.currency = Objects.requireNonNull(currency); + this.descriptors = Objects.requireNonNull(descriptors); + this.items = AdvancedCommerceValidationUtils.validateItems(items); + this.period = Objects.requireNonNull(period); + this.taxCode = Objects.requireNonNull(taxCode); + } + + @Override + protected AdvancedCommerceSubscriptionCreateRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionCreateRequest currency(String currency) { + this.currency = Objects.requireNonNull(currency); + return this; + } + + /** + * @return currency + * @see currency + **/ + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = Objects.requireNonNull(currency); + } + + public AdvancedCommerceSubscriptionCreateRequest descriptors(AdvancedCommerceDescriptors descriptors) { + this.descriptors = Objects.requireNonNull(descriptors); + return this; + } + + /** + * @return descriptors + * @see Descriptors + **/ + public AdvancedCommerceDescriptors getDescriptors() { + return descriptors; + } + + public void setDescriptors(AdvancedCommerceDescriptors descriptors) { + this.descriptors = Objects.requireNonNull(descriptors); + } + + public AdvancedCommerceSubscriptionCreateRequest items(List items) { + this.items = AdvancedCommerceValidationUtils.validateItems(items); + return this; + } + + public AdvancedCommerceSubscriptionCreateRequest addItem(AdvancedCommerceSubscriptionCreateItem item) { + Objects.requireNonNull(item); + this.items.add(item); + return this; + } + + /** + * @return items + * @see SubscriptionCreateItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = AdvancedCommerceValidationUtils.validateItems(items); + } + + public AdvancedCommerceSubscriptionCreateRequest period(AdvancedCommercePeriod period) { + this.period = Objects.requireNonNull(period); + return this; + } + + /** + * @return period + * @see period + **/ + public AdvancedCommercePeriod getPeriod() { + return period; + } + + public void setPeriod(AdvancedCommercePeriod period) { + this.period = Objects.requireNonNull(period); + } + + public AdvancedCommerceSubscriptionCreateRequest previousTransactionId(String previousTransactionId) { + this.previousTransactionId = previousTransactionId; + return this; + } + + /** + * @return previousTransactionId + * @see transactionId + **/ + public String getPreviousTransactionId() { + return previousTransactionId; + } + + public void setPreviousTransactionId(String previousTransactionId) { + this.previousTransactionId = previousTransactionId; + } + + public AdvancedCommerceSubscriptionCreateRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + public AdvancedCommerceSubscriptionCreateRequest taxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + return this; + } + + /** + * @return taxCode + * @see taxCode + **/ + public String getTaxCode() { + return taxCode; + } + + public void setTaxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionCreateRequest that = (AdvancedCommerceSubscriptionCreateRequest) o; + return Objects.equals(currency, that.currency) && Objects.equals(descriptors, that.descriptors) && Objects.equals(items, that.items) && Objects.equals(period, that.period) && Objects.equals(previousTransactionId, that.previousTransactionId) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), currency, descriptors, items, period, previousTransactionId, storefront, taxCode); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "currency='" + currency + '\'' + + ", descriptors=" + descriptors + + ", items=" + items + + ", period=" + period + + ", previousTransactionId='" + previousTransactionId + '\'' + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + ", taxCode='" + taxCode + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java new file mode 100644 index 00000000..438f4013 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateDescriptors.java @@ -0,0 +1,39 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +/* + * The description and display name of the subscription to migrate to that you manage. + * + * @see SubscriptionMigrateDescriptors + */ +public class AdvancedCommerceSubscriptionMigrateDescriptors extends AdvancedCommerceDescriptors { + private AdvancedCommerceSubscriptionMigrateDescriptors() { + super(); + } + + public AdvancedCommerceSubscriptionMigrateDescriptors(String description, String displayName) { + super(description, displayName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + '}'; + } + +} diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java new file mode 100644 index 00000000..ab3b25ae --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateItem.java @@ -0,0 +1,32 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +/** + * The SKU, description, and display name to use for a migrated subscription item. + * + * @see SubscriptionMigrateItem + */ +public class AdvancedCommerceSubscriptionMigrateItem extends AbstractAdvancedCommerceItem { + private AdvancedCommerceSubscriptionMigrateItem() { + super(); + } + + public AdvancedCommerceSubscriptionMigrateItem(String sku, String description, String displayName) { + super(sku, description, displayName); + } + + @Override + protected AdvancedCommerceSubscriptionMigrateItem self() { + return this; + } + + @Override + public String toString() { + return getClass().getSimpleName() + " {" + + " sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + " }"; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java new file mode 100644 index 00000000..c09015de --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRenewalItem.java @@ -0,0 +1,44 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +/** + * The item information that replaces a migrated subscription item when the subscription renews. + * + * @see SubscriptionMigrateRenewalItem + */ +public class AdvancedCommerceSubscriptionMigrateRenewalItem extends AbstractAdvancedCommerceItem { + private AdvancedCommerceSubscriptionMigrateRenewalItem() { + super(); + } + + public AdvancedCommerceSubscriptionMigrateRenewalItem(String sku, String description, String displayName) { + super(sku, description, displayName); + } + + @Override + protected AdvancedCommerceSubscriptionMigrateRenewalItem self() { + return this; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + @Override + public String toString() { + return getClass().getSimpleName() + " {" + + " sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + " }"; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java new file mode 100644 index 00000000..040d4361 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateRequest.java @@ -0,0 +1,216 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The subscription details you provide to migrate a subscription from In-App Purchase to the Advanced Commerce API, such as descriptors, items, storefront, and more. + * + * @see SubscriptionMigrateRequest + */ +public class AdvancedCommerceSubscriptionMigrateRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors"; + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_RENEWAL_ITEMS = "renewalItems"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TARGET_PRODUCT_ID = "targetProductId"; + private static final String SERIALIZED_NAME_TAX_CODE = "taxCode"; + + @JsonProperty(value = SERIALIZED_NAME_DESCRIPTORS, required = true) + private AdvancedCommerceSubscriptionMigrateDescriptors descriptors; + @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true) + private List items; + @JsonProperty(SERIALIZED_NAME_RENEWAL_ITEMS) + private List renewalItems; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(value = SERIALIZED_NAME_TARGET_PRODUCT_ID, required = true) + private String targetProductId; + @JsonProperty(value = SERIALIZED_NAME_TAX_CODE, required = true) + private String taxCode; + + + private AdvancedCommerceSubscriptionMigrateRequest() { + super(); + } + + public AdvancedCommerceSubscriptionMigrateRequest(AdvancedCommerceRequestInfo requestInfo, AdvancedCommerceSubscriptionMigrateDescriptors descriptors, List items, String targetProductId, String taxCode) { + super(requestInfo); + this.descriptors = Objects.requireNonNull(descriptors); + this.items = AdvancedCommerceValidationUtils.validateItems(items); + this.targetProductId = Objects.requireNonNull(targetProductId); + this.taxCode = Objects.requireNonNull(taxCode); + } + + public AdvancedCommerceSubscriptionMigrateRequest descriptors(AdvancedCommerceSubscriptionMigrateDescriptors descriptors) { + this.descriptors = Objects.requireNonNull(descriptors); + return this; + } + + /** + * @return descriptors + * @see SubscriptionMigrateDescriptors + **/ + public AdvancedCommerceSubscriptionMigrateDescriptors getDescriptors() { + return descriptors; + } + + public void setDescriptors(AdvancedCommerceSubscriptionMigrateDescriptors descriptors) { + this.descriptors = Objects.requireNonNull(descriptors); + } + + public AdvancedCommerceSubscriptionMigrateRequest items(List items) { + this.items = AdvancedCommerceValidationUtils.validateItems(items); + return this; + } + + public AdvancedCommerceSubscriptionMigrateRequest addItem(AdvancedCommerceSubscriptionMigrateItem item) { + Objects.requireNonNull(item); + this.items.add(item); + return this; + } + + /** + * An array of one or more SKUs, along with descriptions and display names, that are included in the subscription. + * + * @return items + * @see SubscriptionMigrateItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = AdvancedCommerceValidationUtils.validateItems(items); + } + + public AdvancedCommerceSubscriptionMigrateRequest renewalItems(List renewalItems) { + this.renewalItems = renewalItems != null ? AdvancedCommerceValidationUtils.validateItems(renewalItems) : null; + return this; + } + + public AdvancedCommerceSubscriptionMigrateRequest addRenewalItem(AdvancedCommerceSubscriptionMigrateRenewalItem renewalItem) { + Objects.requireNonNull(renewalItem); + if (this.renewalItems == null) { + this.renewalItems = new ArrayList<>(); + } + this.renewalItems.add(renewalItem); + return this; + } + + /** + * An optional array of subscription items that represents the items that renew at the next renewal period, if they differ from items. + * + * @return renewalItems + * @see SubscriptionMigrateRenewalItem + **/ + public List getRenewalItems() { + return renewalItems; + } + + public void setRenewalItems(List renewalItems) { + this.renewalItems = renewalItems != null ? AdvancedCommerceValidationUtils.validateItems(renewalItems) : null; + } + + + public AdvancedCommerceSubscriptionMigrateRequest targetProductId(String targetProductId) { + this.targetProductId = Objects.requireNonNull(targetProductId); + return this; + } + + /** + * Your generic product ID for an auto-renewable subscription. + * + * @return targetProductId + * @see targetProductId + **/ + public String getTargetProductId() { + return targetProductId; + } + + public void setTargetProductId(String targetProductId) { + this.targetProductId = Objects.requireNonNull(targetProductId); + } + + public AdvancedCommerceSubscriptionMigrateRequest taxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + return this; + } + + /** + * @return taxCode + * @see taxCode + **/ + public String getTaxCode() { + return taxCode; + } + + public void setTaxCode(String taxCode) { + this.taxCode = Objects.requireNonNull(taxCode); + } + + public AdvancedCommerceSubscriptionMigrateRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + AdvancedCommerceSubscriptionMigrateRequest that = (AdvancedCommerceSubscriptionMigrateRequest) o; + return Objects.equals(this.descriptors, that.descriptors) && + Objects.equals(this.items, that.items) && + Objects.equals(this.renewalItems, that.renewalItems) && + Objects.equals(this.storefront, that.storefront) && + Objects.equals(this.targetProductId, that.targetProductId) && + Objects.equals(this.taxCode, that.taxCode); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), descriptors, items, renewalItems, storefront, targetProductId, taxCode); + } + + @Override + protected AdvancedCommerceSubscriptionMigrateRequest self() { + return this; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "descriptors=" + descriptors + + ", items=" + items + + ", renewalItems=" + renewalItems + + ", storefront='" + storefront + '\'' + + ", targetProductId='" + targetProductId + '\'' + + ", taxCode='" + taxCode + '\'' + + ", requestInfo=" + getRequestInfo() + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java new file mode 100644 index 00000000..85f8e5e9 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionMigrateResponse.java @@ -0,0 +1,70 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * A response that contains signed renewal and transaction information after a subscription successfully migrates to the Advanced Commerce API. + * + * @see SubscriptionMigrateResponse + */ +public class AdvancedCommerceSubscriptionMigrateResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceSubscriptionMigrateResponse() { + super(); + } + + public AdvancedCommerceSubscriptionMigrateResponse(String signedRenewalInfo, String signedTransactionInfo) { + super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceSubscriptionMigrateResponse self() { + return this; + } + + @Override + public AdvancedCommerceSubscriptionMigrateResponse signedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + return (AdvancedCommerceSubscriptionMigrateResponse) super.signedRenewalInfo(signedRenewalInfo); + } + + @Override + public AdvancedCommerceSubscriptionMigrateResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceSubscriptionMigrateResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + super.setSignedRenewalInfo(signedRenewalInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + return super.equals(o); + } + + @Override + public int hashCode() { + return super.hashCode(); + } + + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' + + ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java new file mode 100644 index 00000000..ef86458e --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyAddItem.java @@ -0,0 +1,117 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The data your app provides to add items when it makes changes to an auto-renewable subscription. + * + * @see SubscriptionModifyAddItem + */ +public class AdvancedCommerceSubscriptionModifyAddItem extends AbstractAdvancedCommerceItem { + private static final String SERIALIZED_NAME_OFFER = "offer"; + private static final String SERIALIZED_NAME_PRICE = "price"; + private static final String SERIALIZED_NAME_PRORATED_PRICE = "proratedPrice"; + + @JsonProperty(SERIALIZED_NAME_OFFER) + private AdvancedCommerceOffer offer; + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + @JsonProperty(SERIALIZED_NAME_PRORATED_PRICE) + private Long proratedPrice; + + private AdvancedCommerceSubscriptionModifyAddItem() { + super(); + } + + protected AbstractAdvancedCommerceItem self() { + return this; + } + + public AdvancedCommerceSubscriptionModifyAddItem(String sku, String description, String displayName, long price) { + super(sku, description, displayName); + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceSubscriptionModifyAddItem offer(AdvancedCommerceOffer offer) { + this.offer = offer; + return this; + } + + /** + * A discount offer for an auto-renewable subscription. + * + * @return offer + * @see Offer + **/ + public AdvancedCommerceOffer getOffer() { + return offer; + } + + public void setOffer(AdvancedCommerceOffer offer) { + this.offer = offer; + } + + public AdvancedCommerceSubscriptionModifyAddItem price(long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * @return price + * @see price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceSubscriptionModifyAddItem proratedPrice(Long proratedPrice) { + this.proratedPrice = proratedPrice; + return this; + } + + /** + * @return proratedPrice + * @see proratedPrice + **/ + public Long getProratedPrice() { + return proratedPrice; + } + + public void setProratedPrice(Long proratedPrice) { + this.proratedPrice = proratedPrice; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionModifyAddItem that = (AdvancedCommerceSubscriptionModifyAddItem) o; + return Objects.equals(offer, that.offer) && Objects.equals(price, that.price) && Objects.equals(proratedPrice, that.proratedPrice); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), offer, price, proratedPrice); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", offer=" + offer + '\'' + + ", price=" + price + '\'' + + ", proratedPrice=" + proratedPrice + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java new file mode 100644 index 00000000..3830a9d3 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyChangeItem.java @@ -0,0 +1,179 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The data your app provides to change an item of an auto-renewable subscription. + * + * @see SubscriptionModifyChangeItem + */ +public class AdvancedCommerceSubscriptionModifyChangeItem extends AbstractAdvancedCommerceItem { + private static final String SERIALIZED_NAME_CURRENT_SKU = "currentSKU"; + private static final String SERIALIZED_NAME_EFFECTIVE = "effective"; + private static final String SERIALIZED_NAME_OFFER = "offer"; + private static final String SERIALIZED_NAME_PRICE = "price"; + private static final String SERIALIZED_NAME_PRORATED_PRICE = "proratedPrice"; + private static final String SERIALIZED_NAME_REASON = "reason"; + + @JsonProperty(value = SERIALIZED_NAME_CURRENT_SKU, required = true) + private String currentSKU; + @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true) + private AdvancedCommerceEffective effective; + @JsonProperty(SERIALIZED_NAME_OFFER) + private AdvancedCommerceOffer offer; + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + @JsonProperty(SERIALIZED_NAME_PRORATED_PRICE) + private Long proratedPrice; + @JsonProperty(value = SERIALIZED_NAME_REASON, required = true) + private AdvancedCommerceReason reason; + + private AdvancedCommerceSubscriptionModifyChangeItem() {} + + @Override + protected AdvancedCommerceSubscriptionModifyChangeItem self() { + return this; + } + + public AdvancedCommerceSubscriptionModifyChangeItem(String currentSKU, String description, String displayName, AdvancedCommerceEffective effective, Long price, AdvancedCommerceReason reason, String sku) { + super(sku, description, displayName); + this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU); + this.effective = Objects.requireNonNull(effective); + this.price = Objects.requireNonNull(price); + this.reason = Objects.requireNonNull(reason); + } + + public AdvancedCommerceSubscriptionModifyChangeItem currentSKU(String currentSKU) { + this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU); + return this; + } + + /** + * @return currentSKU + * @see SKU + */ + public String getCurrentSKU() { + return currentSKU; + } + + public void setCurrentSKU(String currentSKU) { + this.currentSKU = AdvancedCommerceValidationUtils.validateSku(currentSKU); + } + + public AdvancedCommerceSubscriptionModifyChangeItem effective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + return this; + } + + /** + * @return effective + * @see effective + **/ + public AdvancedCommerceEffective getEffective() { + return effective; + } + + public void setEffective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionModifyChangeItem offer(AdvancedCommerceOffer offer) { + this.offer = offer; + return this; + } + + /** + * @return offer + * @see Offer + **/ + public AdvancedCommerceOffer getOffer() { + return offer; + } + + public void setOffer(AdvancedCommerceOffer offer) { + this.offer = offer; + } + + public AdvancedCommerceSubscriptionModifyChangeItem price(Long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * @return price + * @see price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceSubscriptionModifyChangeItem proratedPrice(Long proratedPrice) { + this.proratedPrice = proratedPrice; + return this; + } + + /** + * @return proratedPrice + * @see proratedPrice + **/ + public Long getProratedPrice() { + return proratedPrice; + } + + public void setProratedPrice(Long proratedPrice) { + this.proratedPrice = proratedPrice; + } + + public AdvancedCommerceSubscriptionModifyChangeItem reason(AdvancedCommerceReason reason) { + this.reason = Objects.requireNonNull(reason); + return this; + } + + /** + * @return reason + */ + public AdvancedCommerceReason getReason() { + return reason; + } + + public void setReason(AdvancedCommerceReason reason) { + this.reason = Objects.requireNonNull(reason); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionModifyChangeItem that = (AdvancedCommerceSubscriptionModifyChangeItem) o; + return Objects.equals(currentSKU, that.currentSKU) && Objects.equals(effective, that.effective) && Objects.equals(offer, that.offer) && Objects.equals(price, that.price) && Objects.equals(proratedPrice, that.proratedPrice) && Objects.equals(reason, that.reason); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), currentSKU, effective, offer, price, proratedPrice, reason); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + ", currentSKU='" + currentSKU + '\'' + + ", effective=" + effective + '\'' + + ", offer=" + offer + '\'' + + ", price=" + price + '\'' + + ", proratedPrice=" + proratedPrice + '\'' + + ", reason=" + reason + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java new file mode 100644 index 00000000..1d72240d --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyDescriptors.java @@ -0,0 +1,104 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The data your app provides to change the description and display name of an auto-renewable subscription. + * + * @see SubscriptionModifyDescriptors + */ +public class AdvancedCommerceSubscriptionModifyDescriptors { + private static final String SERIALIZED_NAME_EFFECTIVE = "effective"; + private static final String SERIALIZED_NAME_DESCRIPTION = "description"; + private static final String SERIALIZED_NAME_DISPLAY_NAME = "displayName"; + + @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true) + private AdvancedCommerceEffective effective; + @JsonProperty(SERIALIZED_NAME_DESCRIPTION) + private String description; + @JsonProperty(SERIALIZED_NAME_DISPLAY_NAME) + private String displayName; + + private AdvancedCommerceSubscriptionModifyDescriptors() {} + + public AdvancedCommerceSubscriptionModifyDescriptors(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionModifyDescriptors effective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + return this; + } + + /** + * @return effective + * @see effective + **/ + public AdvancedCommerceEffective getEffective() { + return effective; + } + + public void setEffective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionModifyDescriptors description(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + return this; + } + + /** + * @return description + * @see description + **/ + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description == null ? null : AdvancedCommerceValidationUtils.validateDescription(description); + } + + public AdvancedCommerceSubscriptionModifyDescriptors displayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + return this; + } + + /** + * @return displayName + * @see displayName + **/ + public String getDisplayName() { + return displayName; + } + + public void setDisplayName(String displayName) { + this.displayName = displayName == null ? null : AdvancedCommerceValidationUtils.validateDisplayName(displayName); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceSubscriptionModifyDescriptors that = (AdvancedCommerceSubscriptionModifyDescriptors) o; + return Objects.equals(effective, that.effective) && Objects.equals(description, that.description) && Objects.equals(displayName, that.displayName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), effective, description, displayName); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "effective=" + effective + '\'' + + ", description='" + description + '\'' + + ", displayName='" + displayName + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java new file mode 100644 index 00000000..c62b096d --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyInAppRequest.java @@ -0,0 +1,296 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The request data your app provides to make changes to an auto-renewable subscription. + * + * @see SubscriptionModifyInAppRequest + */ +public class AdvancedCommerceSubscriptionModifyInAppRequest extends AbstractAdvancedCommerceInAppRequest { + private static final String OPERATION = "MODIFY_SUBSCRIPTION"; + private static final String VERSION = "1"; + + private static final String SERIALIZED_NAME_ADD_ITEMS = "addItems"; + private static final String SERIALIZED_NAME_CHANGE_ITEMS = "changeItems"; + private static final String SERIALIZED_NAME_CURRENCY = "currency"; + private static final String SERIALIZED_NAME_DESCRIPTORS = "descriptors"; + private static final String SERIALIZED_NAME_PERIOD_CHANGE = "periodChange"; + private static final String SERIALIZED_NAME_REMOVE_ITEMS = "removeItems"; + private static final String SERIALIZED_NAME_RETAIN_BILLING_CYCLE = "retainBillingCycle"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TAX_CODE = "taxCode"; + private static final String SERIALIZED_NAME_TRANSACTION_ID = "transactionId"; + + @JsonProperty(SERIALIZED_NAME_ADD_ITEMS) + private List addItems; + @JsonProperty(SERIALIZED_NAME_CHANGE_ITEMS) + private List changeItems; + @JsonProperty(SERIALIZED_NAME_CURRENCY) + private String currency; + @JsonProperty(SERIALIZED_NAME_DESCRIPTORS) + private AdvancedCommerceSubscriptionModifyDescriptors descriptors; + @JsonProperty(SERIALIZED_NAME_PERIOD_CHANGE) + private AdvancedCommerceSubscriptionModifyPeriodChange periodChange; + @JsonProperty(SERIALIZED_NAME_REMOVE_ITEMS) + private List removeItems; + @JsonProperty(value = SERIALIZED_NAME_RETAIN_BILLING_CYCLE, required = true) + private Boolean retainBillingCycle; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(SERIALIZED_NAME_TAX_CODE) + private String taxCode; + @JsonProperty(value = SERIALIZED_NAME_TRANSACTION_ID, required = true) + private String transactionId; + + private AdvancedCommerceSubscriptionModifyInAppRequest() {} + + public AdvancedCommerceSubscriptionModifyInAppRequest( + AdvancedCommerceRequestInfo requestInfo, + String transactionId, + Boolean retainBillingCycle + ) { + super(OPERATION, VERSION, requestInfo); + this.transactionId = Objects.requireNonNull(transactionId); + this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle); + } + + @Override + protected AdvancedCommerceSubscriptionModifyInAppRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest addItems(List addItems) { + this.addItems = addItems != null ? AdvancedCommerceValidationUtils.validateItems(addItems) : null; + return this; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest addAddItem(AdvancedCommerceSubscriptionModifyAddItem addItem) { + Objects.requireNonNull(addItem); + if (this.addItems == null) { + this.addItems = new ArrayList<>(); + } + this.addItems.add(addItem); + return this; + } + + /** + * @return addItems + * @see SubscriptionModifyAddItem + **/ + public List getAddItems() { + return addItems; + } + + public void setAddItems(List addItems) { + this.addItems = addItems != null ? AdvancedCommerceValidationUtils.validateItems(addItems) : null; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest changeItems(List changeItems) { + this.changeItems = changeItems != null ? AdvancedCommerceValidationUtils.validateItems(changeItems) : null; + return this; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest addChangeItem(AdvancedCommerceSubscriptionModifyChangeItem changeItem) { + Objects.requireNonNull(changeItem); + if (this.changeItems == null) { + this.changeItems = new ArrayList<>(); + } + this.changeItems.add(changeItem); + return this; + } + + /** + * @return changeItems + * @see SubscriptionModifyChangeItem + **/ + public List getChangeItems() { + return changeItems; + } + + public void setChangeItems(List changeItems) { + this.changeItems = changeItems != null ? AdvancedCommerceValidationUtils.validateItems(changeItems) : null; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest currency(String currency) { + this.currency = currency; + return this; + } + + /** + * @return currency + * @see currency + **/ + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest descriptors(AdvancedCommerceSubscriptionModifyDescriptors descriptors) { + this.descriptors = descriptors; + return this; + } + + /** + * @return descriptors + * @see SubscriptionModifyDescriptors + **/ + public AdvancedCommerceSubscriptionModifyDescriptors getDescriptors() { + return descriptors; + } + + public void setDescriptors(AdvancedCommerceSubscriptionModifyDescriptors descriptors) { + this.descriptors = descriptors; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest periodChange(AdvancedCommerceSubscriptionModifyPeriodChange periodChange) { + this.periodChange = periodChange; + return this; + } + + /** + * @return periodChange + * @see SubscriptionModifyPeriodChange + **/ + public AdvancedCommerceSubscriptionModifyPeriodChange getPeriodChange() { + return periodChange; + } + + public void setPeriodChange(AdvancedCommerceSubscriptionModifyPeriodChange periodChange) { + this.periodChange = periodChange; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest removeItems(List removeItems) { + this.removeItems = removeItems; + return this; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest addRemoveItem(AdvancedCommerceSubscriptionModifyRemoveItem removeItem) { + Objects.requireNonNull(removeItem); + if (this.removeItems == null) { + this.removeItems = new ArrayList<>(); + } + this.removeItems.add(removeItem); + return this; + } + + /** + * @return removeItems + * @see SubscriptionModifyRemoveItem + **/ + public List getRemoveItems() { + return removeItems; + } + + public void setRemoveItems(List removeItems) { + this.removeItems = removeItems; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest retainBillingCycle(Boolean retainBillingCycle) { + this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle); + return this; + } + + /** + * @return retainBillingCycle + * @see retainBillingCycle + **/ + public Boolean getRetainBillingCycle() { + return retainBillingCycle; + } + + public void setRetainBillingCycle(Boolean retainBillingCycle) { + this.retainBillingCycle = Objects.requireNonNull(retainBillingCycle); + } + + public AdvancedCommerceSubscriptionModifyInAppRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest taxCode(String taxCode) { + this.taxCode = taxCode; + return this; + } + + /** + * @return taxCode + * @see taxCode + **/ + public String getTaxCode() { + return taxCode; + } + + public void setTaxCode(String taxCode) { + this.taxCode = taxCode; + } + + public AdvancedCommerceSubscriptionModifyInAppRequest transactionId(String transactionId) { + this.transactionId = Objects.requireNonNull(transactionId); + return this; + } + + /** + * @return transactionId + * @see transactionId + **/ + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = Objects.requireNonNull(transactionId); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionModifyInAppRequest that = (AdvancedCommerceSubscriptionModifyInAppRequest) o; + return Objects.equals(addItems, that.addItems) && Objects.equals(changeItems, that.changeItems) && Objects.equals(currency, that.currency) && Objects.equals(descriptors, that.descriptors) && Objects.equals(periodChange, that.periodChange) && Objects.equals(removeItems, that.removeItems) && Objects.equals(retainBillingCycle, that.retainBillingCycle) && Objects.equals(storefront, that.storefront) && Objects.equals(taxCode, that.taxCode) && Objects.equals(transactionId, that.transactionId); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), addItems, changeItems, currency, descriptors, periodChange, removeItems, retainBillingCycle, storefront, taxCode, transactionId); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "addItems=" + addItems + + ", changeItems=" + changeItems + + ", currency='" + currency + '\'' + + ", descriptors=" + descriptors + + ", periodChange=" + periodChange + + ", removeItems=" + removeItems + + ", retainBillingCycle=" + retainBillingCycle + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + ", taxCode='" + taxCode + '\'' + + ", transactionId='" + transactionId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java new file mode 100644 index 00000000..4da15144 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyPeriodChange.java @@ -0,0 +1,92 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The data your app provides to change the period of an auto-renewable subscription. + * + * @see SubscriptionModifyPeriodChange + */ +public class AdvancedCommerceSubscriptionModifyPeriodChange { + private static final String SERIALIZED_NAME_EFFECTIVE = "effective"; + private static final String SERIALIZED_NAME_PERIOD = "period"; + + @JsonProperty(value = SERIALIZED_NAME_EFFECTIVE, required = true) + private AdvancedCommerceEffective effective; + @JsonProperty(value = SERIALIZED_NAME_PERIOD, required = true) + private AdvancedCommercePeriod period; + + private AdvancedCommerceSubscriptionModifyPeriodChange() {} + + public AdvancedCommerceSubscriptionModifyPeriodChange( + AdvancedCommerceEffective effective, + AdvancedCommercePeriod period + ) { + this.effective = Objects.requireNonNull(effective); + this.period = Objects.requireNonNull(period); + } + + public AdvancedCommerceSubscriptionModifyPeriodChange(String rawEffective, String rawPeriod) { + this.effective = AdvancedCommerceEffective.fromValue(rawEffective); + this.period = AdvancedCommercePeriod.fromValue(rawPeriod); + } + + public AdvancedCommerceSubscriptionModifyPeriodChange effective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + return this; + } + + /** + * @return effective + * @see effective + **/ + public AdvancedCommerceEffective getEffective() { + return effective; + } + + public void setEffective(AdvancedCommerceEffective effective) { + this.effective = Objects.requireNonNull(effective); + } + + public AdvancedCommerceSubscriptionModifyPeriodChange period(AdvancedCommercePeriod period) { + this.period = Objects.requireNonNull(period); + return this; + } + + /** + * @return period + * @see Period + **/ + public AdvancedCommercePeriod getPeriod() { + return period; + } + + public void setPeriod(AdvancedCommercePeriod period) { + this.period = Objects.requireNonNull(period); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + AdvancedCommerceSubscriptionModifyPeriodChange that = (AdvancedCommerceSubscriptionModifyPeriodChange) o; + return Objects.equals(effective, that.effective) && Objects.equals(period, that.period); + } + + @Override + public int hashCode() { + return Objects.hash(effective, period); + } + + @Override + public String toString() { + return "AdvancedCommerceSubscriptionModifyPeriodChange{" + + "effective=" + effective + + ", period=" + period + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java new file mode 100644 index 00000000..c2b99031 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionModifyRemoveItem.java @@ -0,0 +1,30 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +/** + * The data your app provides to remove an item from an auto-renewable subscription. + * + * @see SubscriptionModifyRemoveItem + */ +public class AdvancedCommerceSubscriptionModifyRemoveItem extends AbstractAdvancedCommerceBaseItem { + private AdvancedCommerceSubscriptionModifyRemoveItem() { + super(); + } + + public AdvancedCommerceSubscriptionModifyRemoveItem(String sku) { + super(sku); + } + + @Override + protected AbstractAdvancedCommerceBaseItem self() { + return this; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java new file mode 100644 index 00000000..9fd44834 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeItem.java @@ -0,0 +1,115 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The data your app provides to change a subscription price. + * + * @see SubscriptionPriceChangeItem + */ +public class AdvancedCommerceSubscriptionPriceChangeItem extends AbstractAdvancedCommerceBaseItem{ + private static final String SERIALIZED_NAME_PRICE = "price"; + private static final String SERIALIZED_DEPENDENT_SKUS = "dependentSKUs"; + + @JsonProperty(value = SERIALIZED_NAME_PRICE, required = true) + private Long price; + @JsonProperty(SERIALIZED_DEPENDENT_SKUS) + private List dependentSKUs; + + private AdvancedCommerceSubscriptionPriceChangeItem() { + super(); + } + + public AdvancedCommerceSubscriptionPriceChangeItem(String sku, Long price) { + super(sku); + this.price = Objects.requireNonNull(price); + } + + @Override + protected AdvancedCommerceSubscriptionPriceChangeItem self() { + return this; + } + + public AdvancedCommerceSubscriptionPriceChangeItem price(Long price) { + this.price = Objects.requireNonNull(price); + return this; + } + + /** + * @return price + * @see price + **/ + public Long getPrice() { + return price; + } + + public void setPrice(Long price) { + this.price = Objects.requireNonNull(price); + } + + public AdvancedCommerceSubscriptionPriceChangeItem dependentSKUs(List dependentSKUs) { + validateDependentSKUs(dependentSKUs); + this.dependentSKUs = dependentSKUs; + return this; + } + + public AdvancedCommerceSubscriptionPriceChangeItem addDependentSKU(String dependentSKU) { + Objects.requireNonNull(dependentSKU); + AdvancedCommerceValidationUtils.validateSku(dependentSKU); + if (this.dependentSKUs == null) { + this.dependentSKUs = new ArrayList<>(); + } + this.dependentSKUs.add(dependentSKU); + return this; + } + + /** + * @return dependentSKUs + * @see dependentSKU + **/ + public List getDependentSKUs() { + return dependentSKUs; + } + + public void setDependentSKUs(List dependentSKUs) { + validateDependentSKUs(dependentSKUs); + this.dependentSKUs = dependentSKUs; + } + + private void validateDependentSKUs(List dependentSKUs) { + if (dependentSKUs != null) { + for (String sku : dependentSKUs) { + AdvancedCommerceValidationUtils.validateSku(sku); + } + } + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionPriceChangeItem that = (AdvancedCommerceSubscriptionPriceChangeItem) o; + return Objects.equals(price, that.price) && Objects.equals(dependentSKUs, that.dependentSKUs); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), price, dependentSKUs); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + ", price=" + price + + ", dependentSKUs=" + dependentSKUs + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java new file mode 100644 index 00000000..118b5f8c --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeRequest.java @@ -0,0 +1,129 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.List; +import java.util.Objects; + +/** + * The request body you use to change the price of an auto-renewable subscription. + * + * @see SubscriptionPriceChangeRequest + */ +public class AdvancedCommerceSubscriptionPriceChangeRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_CURRENCY = "currency"; + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + + @JsonProperty(SERIALIZED_NAME_CURRENCY) + private String currency; + @JsonProperty(value = SERIALIZED_NAME_ITEMS, required = true) + private List items; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + public AdvancedCommerceSubscriptionPriceChangeRequest() {} + + public AdvancedCommerceSubscriptionPriceChangeRequest( + AdvancedCommerceRequestInfo requestInfo, + List items + ) { + super(requestInfo); + this.items = Objects.requireNonNull(items); + } + + @Override + protected AdvancedCommerceSubscriptionPriceChangeRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionPriceChangeRequest currency(String currency) { + this.currency = currency; + return this; + } + + /** + * The currency of the prices. + * + * @return currency + * @see currency + **/ + public String getCurrency() { + return currency; + } + + public void setCurrency(String currency) { + this.currency = currency; + } + + public AdvancedCommerceSubscriptionPriceChangeRequest items(List items) { + this.items = Objects.requireNonNull(items); + return this; + } + + public AdvancedCommerceSubscriptionPriceChangeRequest addItem(AdvancedCommerceSubscriptionPriceChangeItem item) { + Objects.requireNonNull(item); + this.items.add(item); + return this; + } + + /** + * An array that contains one or more SKUs and the changed price for each SKU. + * + * @return items + * @see SubscriptionPriceChangeItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = Objects.requireNonNull(items); + } + + public AdvancedCommerceSubscriptionPriceChangeRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * The App Store storefront of the subscription. + * + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionPriceChangeRequest that = (AdvancedCommerceSubscriptionPriceChangeRequest) o; + return Objects.equals(currency, that.currency) && + Objects.equals(items, that.items) && + Objects.equals(storefront, that.storefront); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), currency, items, storefront); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "currency='" + currency + '\'' + + ", items=" + items + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java new file mode 100644 index 00000000..98b36efc --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionPriceChangeResponse.java @@ -0,0 +1,57 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * A response that contains signed JWS renewal and JWS transaction information after a subscription price change request. + * + * @see SubscriptionPriceChangeResponse + */ +public class AdvancedCommerceSubscriptionPriceChangeResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceSubscriptionPriceChangeResponse() { + super(); + } + + public AdvancedCommerceSubscriptionPriceChangeResponse(String signedRenewalInfo, String signedTransactionInfo) { + super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceSubscriptionPriceChangeResponse self() { + return this; + } + + @Override + public AdvancedCommerceSubscriptionPriceChangeResponse signedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + return (AdvancedCommerceSubscriptionPriceChangeResponse) super.signedRenewalInfo(signedRenewalInfo); + } + + @Override + public AdvancedCommerceSubscriptionPriceChangeResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceSubscriptionPriceChangeResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + super.setSignedRenewalInfo(signedRenewalInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + + ", signedTransactionInfo='" + getSignedTransactionInfo() + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java new file mode 100644 index 00000000..878d45d0 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateInAppRequest.java @@ -0,0 +1,129 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +/** + * The request your app provides to reactivate a subscription that has automatic renewal turned off. + * + * @see SubscriptionReactivateInAppRequest + */ +public class AdvancedCommerceSubscriptionReactivateInAppRequest extends AbstractAdvancedCommerceInAppRequest { + private static final String OPERATION = "REACTIVATE_SUBSCRIPTION"; + private static final String VERSION = "1"; + + private static final String SERIALIZED_NAME_ITEMS = "items"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + private static final String SERIALIZED_NAME_TRANSACTION_ID = "transactionId"; + + @JsonProperty(SERIALIZED_NAME_ITEMS) + private List items; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + @JsonProperty(value = SERIALIZED_NAME_TRANSACTION_ID, required = true) + private String transactionId; + + private AdvancedCommerceSubscriptionReactivateInAppRequest() {} + + public AdvancedCommerceSubscriptionReactivateInAppRequest( + AdvancedCommerceRequestInfo requestInfo, + String transactionId + ) { + super(OPERATION, VERSION, requestInfo); + this.transactionId = Objects.requireNonNull(transactionId); + } + + @Override + protected AdvancedCommerceSubscriptionReactivateInAppRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionReactivateInAppRequest items(List items) { + this.items = items; + return this; + } + + public AdvancedCommerceSubscriptionReactivateInAppRequest addItem(AdvancedCommerceSubscriptionReactivateItem item) { + Objects.requireNonNull(item); + if (this.items == null) { + this.items = new ArrayList<>(); + } + this.items.add(item); + return this; + } + + /** + * @return items + * @see SubscriptionReactivateItem + **/ + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public AdvancedCommerceSubscriptionReactivateInAppRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + public AdvancedCommerceSubscriptionReactivateInAppRequest transactionId(String transactionId) { + this.transactionId = Objects.requireNonNull(transactionId); + return this; + } + + /** + * @return transactionId + * @see transactionId + **/ + public String getTransactionId() { + return transactionId; + } + + public void setTransactionId(String transactionId) { + this.transactionId = Objects.requireNonNull(transactionId); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + AdvancedCommerceSubscriptionReactivateInAppRequest that = (AdvancedCommerceSubscriptionReactivateInAppRequest) o; + return Objects.equals(items, that.items) && Objects.equals(storefront, that.storefront) && Objects.equals(transactionId, that.transactionId); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), items, storefront, transactionId); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "items=" + items + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + ", transactionId='" + transactionId + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java new file mode 100644 index 00000000..117d4e7d --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionReactivateItem.java @@ -0,0 +1,31 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +/** + * An item in a subscription to reactive. + * + * @see SubscriptionReactivateItem + */ +public class AdvancedCommerceSubscriptionReactivateItem extends AbstractAdvancedCommerceBaseItem { + + private AdvancedCommerceSubscriptionReactivateItem() { + super(); + } + + public AdvancedCommerceSubscriptionReactivateItem(String sku) { + super(sku); + } + + @Override + protected AbstractAdvancedCommerceBaseItem self() { + return this; + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "sku='" + sku + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java new file mode 100644 index 00000000..8fd80bc9 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeRequest.java @@ -0,0 +1,144 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import java.util.Objects; + +/** + * The request body you provide to terminate a subscription and all its items immediately. + * + * @see SubscriptionRevokeRequest + */ +public class AdvancedCommerceSubscriptionRevokeRequest extends AdvancedCommerceRequest { + private static final String SERIALIZED_NAME_REFUND_REASON = "refundReason"; + private static final String SERIALIZED_NAME_REFUND_RISKING_PREFERENCE = "refundRiskingPreference"; + private static final String SERIALIZED_NAME_REFUND_TYPE = "refundType"; + private static final String SERIALIZED_NAME_STOREFRONT = "storefront"; + + @JsonProperty(value = SERIALIZED_NAME_REFUND_REASON, required = true) + private AdvancedCommerceRefundReason refundReason; + @JsonProperty(value = SERIALIZED_NAME_REFUND_RISKING_PREFERENCE, required = true) + private Boolean refundRiskingPreference; + @JsonProperty(value = SERIALIZED_NAME_REFUND_TYPE, required = true) + private String refundType; + @JsonProperty(SERIALIZED_NAME_STOREFRONT) + private String storefront; + + private AdvancedCommerceSubscriptionRevokeRequest() { + super(); + } + + public AdvancedCommerceSubscriptionRevokeRequest( + AdvancedCommerceRequestInfo requestInfo, + Boolean refundRiskingPreference, + AdvancedCommerceRefundReason refundReason, + String refundType + ) { + super(requestInfo); + this.refundReason = Objects.requireNonNull(refundReason); + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + this.refundType = Objects.requireNonNull(refundType); + } + + @Override + protected AdvancedCommerceSubscriptionRevokeRequest self() { + return this; + } + + public AdvancedCommerceSubscriptionRevokeRequest refundReason(AdvancedCommerceRefundReason refundReason) { + this.refundReason = Objects.requireNonNull(refundReason); + return this; + } + + /** + * @return refundReason + * @see refundReason + **/ + public AdvancedCommerceRefundReason getRefundReason() { + return refundReason; + } + + public void setRefundReason(AdvancedCommerceRefundReason refundReason) { + this.refundReason = Objects.requireNonNull(refundReason); + } + + public AdvancedCommerceSubscriptionRevokeRequest refundRiskingPreference(Boolean refundRiskingPreference) { + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + return this; + } + + /** + * @return refundRiskingPreference + * @see refundRiskingPreference + **/ + public Boolean getRefundRiskingPreference() { + return refundRiskingPreference; + } + + public void setRefundRiskingPreference(Boolean refundRiskingPreference) { + this.refundRiskingPreference = Objects.requireNonNull(refundRiskingPreference); + } + + public AdvancedCommerceSubscriptionRevokeRequest refundType(String refundType) { + this.refundType = Objects.requireNonNull(refundType); + return this; + } + + public String getRefundType() { + return refundType; + } + + public void setRefundType(String refundType) { + this.refundType = Objects.requireNonNull(refundType); + } + + public AdvancedCommerceSubscriptionRevokeRequest storefront(String storefront) { + this.storefront = storefront; + return this; + } + + /** + * @return storefront + * @see storefront + **/ + public String getStorefront() { + return storefront; + } + + public void setStorefront(String storefront) { + this.storefront = storefront; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + if (!super.equals(o)) + return false; + AdvancedCommerceSubscriptionRevokeRequest that = (AdvancedCommerceSubscriptionRevokeRequest) o; + return Objects.equals(refundReason, that.refundReason) + && Objects.equals(refundRiskingPreference, that.refundRiskingPreference) + && Objects.equals(refundType, that.refundType) + && Objects.equals(storefront, that.storefront); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), refundReason, refundRiskingPreference, refundType, storefront); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "refundReason=" + refundReason + + ", refundRiskingPreference=" + refundRiskingPreference + + ", refundType='" + refundType + '\'' + + ", requestInfo=" + getRequestInfo() + + ", storefront='" + storefront + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java new file mode 100644 index 00000000..b2972ef7 --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceSubscriptionRevokeResponse.java @@ -0,0 +1,57 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.Objects; + +/** + * The response body for a successful revoke-subscription request. + * + * @see SubscriptionRevokeResponse + */ +public class AdvancedCommerceSubscriptionRevokeResponse extends AbstractAdvancedCommerceResponse { + private AdvancedCommerceSubscriptionRevokeResponse() { + super(); + } + + public AdvancedCommerceSubscriptionRevokeResponse(String signedRenewalInfo, String signedTransactionInfo) { + super(Objects.requireNonNull(signedRenewalInfo), Objects.requireNonNull(signedTransactionInfo)); + } + + @Override + protected AdvancedCommerceSubscriptionRevokeResponse self() { + return this; + } + + @Override + public AdvancedCommerceSubscriptionRevokeResponse signedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + return (AdvancedCommerceSubscriptionRevokeResponse) super.signedRenewalInfo(signedRenewalInfo); + } + + @Override + public AdvancedCommerceSubscriptionRevokeResponse signedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + return (AdvancedCommerceSubscriptionRevokeResponse) super.signedTransactionInfo(signedTransactionInfo); + } + + @Override + public void setSignedRenewalInfo(String signedRenewalInfo) { + Objects.requireNonNull(signedRenewalInfo); + super.setSignedRenewalInfo(signedRenewalInfo); + } + + @Override + public void setSignedTransactionInfo(String signedTransactionInfo) { + Objects.requireNonNull(signedTransactionInfo); + super.setSignedTransactionInfo(signedTransactionInfo); + } + + @Override + public String toString() { + return getClass().getSimpleName() + "{" + + "signedRenewalInfo='" + getSignedRenewalInfo() + '\'' + + ", signedTransactionInfo='" + getSignedTransactionInfo() + '\'' + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java new file mode 100644 index 00000000..851ec78c --- /dev/null +++ b/src/main/java/com/apple/itunes/storekit/model/AdvancedCommerceValidationUtils.java @@ -0,0 +1,99 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import java.util.List; +import java.util.Objects; + +public final class AdvancedCommerceValidationUtils { + + public static final int MAXIMUM_DESCRIPTION_LENGTH = 45; + public static final int MAXIMUM_DISPLAY_NAME_LENGTH = 30; + private static final int MAXIMUM_SKU_LENGTH = 128; + private static final int MIN_PERIOD = 1; + private static final int MAX_PERIOD = 12; + + /** + * Validates description is not null and does not exceed maximum length. + * + * @param description the description to validate + * @return the validated description + * @throws IllegalArgumentException if description exceeds maximum length + */ + public static String validateDescription(String description) { + return validateStringWithMaxLength(description, MAXIMUM_DESCRIPTION_LENGTH, "description"); + } + + /** + * Validates display name is not null and does not exceed maximum length. + * + * @param displayName the display name to validate + * @return the validated display name + * @throws IllegalArgumentException if display name exceeds maximum length + */ + public static String validateDisplayName(String displayName) { + return validateStringWithMaxLength(displayName, MAXIMUM_DISPLAY_NAME_LENGTH, "displayName"); + } + + /** + * Validates SKU does not exceed maximum length. + * + * @param sku + * @return the validated SKU + * @throws IllegalArgumentException if SKU exceeds maximum length + */ + public static String validateSku(String sku) { + if (sku != null && sku.length() > MAXIMUM_SKU_LENGTH) { + throw new IllegalArgumentException("SKU length cannot exceed " + MAXIMUM_SKU_LENGTH + " characters"); + } + return sku; + } + + /** + * Validates periodCount is not null and between `MIN_PERIOD` and `MAX_PERIOD` inclusive. + * + * @param periodCount + * @throws IllegalArgumentException if periodCount is null or out of range + */ + public static Integer validatePeriodCount(Integer periodCount) { + Objects.requireNonNull(periodCount, "periodCount cannot be null"); + if (periodCount < MIN_PERIOD || periodCount > MAX_PERIOD) { + throw new IllegalArgumentException("Period count must be between " + MIN_PERIOD + " and " + MAX_PERIOD); + } + return periodCount; + } + + /** + * Validates a list of items is not null, not empty, and contains no null elements. + * + * @param list the list of items to validate + * @param the type of items in the list, must extend AbstractAdvancedCommerceItem + * @return the validated list of items + * @throws IllegalArgumentException if the list is null, empty, or contains null elements + */ + public static List validateItems(List list) { + if (list == null) { + throw new IllegalArgumentException("Items list cannot be null"); + } + + if (list.isEmpty()) { + throw new IllegalArgumentException("Items list cannot be empty"); + } + + for (T item : list) { + if (item == null) { + throw new IllegalArgumentException("Item in the list cannot be null"); + } + } + + return list; + } + + private static String validateStringWithMaxLength(String value, int maxLength, String fieldName) { + Objects.requireNonNull(value, fieldName + " cannot be null"); + if (value.length() > maxLength) { + throw new IllegalArgumentException(fieldName + " length cannot exceed " + maxLength + " characters"); + } + return value; + } +} \ No newline at end of file diff --git a/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java b/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java index 2fd7f4c9..2933b1dd 100644 --- a/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java +++ b/src/main/java/com/apple/itunes/storekit/model/UpdateAppAccountTokenRequest.java @@ -23,13 +23,11 @@ private UpdateAppAccountTokenRequest() { } public UpdateAppAccountTokenRequest(UUID appAccountToken) { - Objects.requireNonNull(appAccountToken); - this.appAccountToken = appAccountToken; + this.appAccountToken = Objects.requireNonNull(appAccountToken); } public UpdateAppAccountTokenRequest appAccountToken(UUID appAccountToken) { - Objects.requireNonNull(appAccountToken); - this.appAccountToken = appAccountToken; + this.appAccountToken = Objects.requireNonNull(appAccountToken); return this; } @@ -44,8 +42,7 @@ public UUID getAppAccountToken() { } public void setAppAccountToken(UUID appAccountToken) { - Objects.requireNonNull(appAccountToken); - this.appAccountToken = appAccountToken; + this.appAccountToken = Objects.requireNonNull(appAccountToken); } @Override diff --git a/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java b/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java new file mode 100644 index 00000000..a5d05b10 --- /dev/null +++ b/src/test/java/com/apple/itunes/storekit/model/AdvancedCommerceModelsTest.java @@ -0,0 +1,655 @@ +// Copyright (c) 2026 Apple Inc. Licensed under MIT License. + +package com.apple.itunes.storekit.model; + +import com.apple.itunes.storekit.util.TestingUtility; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +public class AdvancedCommerceModelsTest { + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + public void testAdvancedCommercePeriod() { + Assertions.assertEquals("P1W", AdvancedCommercePeriod.P1W.getValue()); + Assertions.assertEquals("P1M", AdvancedCommercePeriod.P1M.getValue()); + Assertions.assertEquals("P2M", AdvancedCommercePeriod.P2M.getValue()); + Assertions.assertEquals("P3M", AdvancedCommercePeriod.P3M.getValue()); + Assertions.assertEquals("P6M", AdvancedCommercePeriod.P6M.getValue()); + Assertions.assertEquals("P1Y", AdvancedCommercePeriod.P1Y.getValue()); + + Assertions.assertEquals(AdvancedCommercePeriod.P1W, AdvancedCommercePeriod.fromValue("P1W")); + Assertions.assertEquals(AdvancedCommercePeriod.P1M, AdvancedCommercePeriod.fromValue("P1M")); + Assertions.assertEquals(AdvancedCommercePeriod.P1Y, AdvancedCommercePeriod.fromValue("P1Y")); + Assertions.assertNull(AdvancedCommercePeriod.fromValue("INVALID")); + + Assertions.assertEquals("P1W", AdvancedCommercePeriod.P1W.toString()); + } + + @Test + public void testAdvancedCommerceReason() { + Assertions.assertEquals("UPGRADE", AdvancedCommerceReason.UPGRADE.getValue()); + Assertions.assertEquals("DOWNGRADE", AdvancedCommerceReason.DOWNGRADE.getValue()); + Assertions.assertEquals("APPLY_OFFER", AdvancedCommerceReason.APPLY_OFFER.getValue()); + + Assertions.assertEquals(AdvancedCommerceReason.UPGRADE, AdvancedCommerceReason.fromValue("UPGRADE")); + Assertions.assertEquals(AdvancedCommerceReason.DOWNGRADE, AdvancedCommerceReason.fromValue("DOWNGRADE")); + Assertions.assertEquals(AdvancedCommerceReason.APPLY_OFFER, AdvancedCommerceReason.fromValue("APPLY_OFFER")); + Assertions.assertNull(AdvancedCommerceReason.fromValue("INVALID")); + + Assertions.assertEquals("UPGRADE", AdvancedCommerceReason.UPGRADE.toString()); + } + + @Test + public void testAdvancedCommerceRefundReason() { + Assertions.assertEquals("UNINTENDED_PURCHASE", AdvancedCommerceRefundReason.UNINTENDED_PURCHASE.getValue()); + Assertions.assertEquals("FULFILLMENT_ISSUE", AdvancedCommerceRefundReason.FULFILLMENT_ISSUE.getValue()); + Assertions.assertEquals("UNSATISFIED_WITH_PURCHASE", AdvancedCommerceRefundReason.UNSATISFIED_WITH_PURCHASE.getValue()); + Assertions.assertEquals("LEGAL", AdvancedCommerceRefundReason.LEGAL.getValue()); + Assertions.assertEquals("OTHER", AdvancedCommerceRefundReason.OTHER.getValue()); + Assertions.assertEquals("MODIFY_ITEMS_REFUND", AdvancedCommerceRefundReason.MODIFY_ITEMS_REFUND.getValue()); + Assertions.assertEquals("SIMULATE_REFUND_DECLINE", AdvancedCommerceRefundReason.SIMULATE_REFUND_DECLINE.getValue()); + + Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL, + AdvancedCommerceRefundReason.fromValue("LEGAL")); + Assertions.assertEquals(AdvancedCommerceRefundReason.OTHER, + AdvancedCommerceRefundReason.fromValue("OTHER")); + Assertions.assertNull(AdvancedCommerceRefundReason.fromValue("INVALID")); + + Assertions.assertEquals("LEGAL", AdvancedCommerceRefundReason.LEGAL.toString()); + } + + @Test + public void testAdvancedCommerceRefundType() { + Assertions.assertEquals("FULL", AdvancedCommerceRefundType.FULL.getValue()); + Assertions.assertEquals("PRORATED", AdvancedCommerceRefundType.PRORATED.getValue()); + Assertions.assertEquals("CUSTOM", AdvancedCommerceRefundType.CUSTOM.getValue()); + + Assertions.assertEquals(AdvancedCommerceRefundType.FULL, AdvancedCommerceRefundType.fromValue("FULL")); + Assertions.assertEquals(AdvancedCommerceRefundType.PRORATED, AdvancedCommerceRefundType.fromValue("PRORATED")); + Assertions.assertEquals(AdvancedCommerceRefundType.CUSTOM, AdvancedCommerceRefundType.fromValue("CUSTOM")); + Assertions.assertNull(AdvancedCommerceRefundType.fromValue("INVALID")); + + Assertions.assertEquals("FULL", AdvancedCommerceRefundType.FULL.toString()); + } + + @Test + public void testAdvancedCommerceOfferPeriod() { + Assertions.assertEquals("P3D", AdvancedCommerceOfferPeriod.P3D.getValue()); + Assertions.assertEquals("P1W", AdvancedCommerceOfferPeriod.P1W.getValue()); + Assertions.assertEquals("P2W", AdvancedCommerceOfferPeriod.P2W.getValue()); + Assertions.assertEquals("P1M", AdvancedCommerceOfferPeriod.P1M.getValue()); + Assertions.assertEquals("P2M", AdvancedCommerceOfferPeriod.P2M.getValue()); + Assertions.assertEquals("P3M", AdvancedCommerceOfferPeriod.P3M.getValue()); + + Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1W, AdvancedCommerceOfferPeriod.fromValue("P1W")); + Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1M, AdvancedCommerceOfferPeriod.fromValue("P1M")); + Assertions.assertEquals(AdvancedCommerceOfferPeriod.P3D, AdvancedCommerceOfferPeriod.fromValue("P3D")); + Assertions.assertNull(AdvancedCommerceOfferPeriod.fromValue("INVALID")); + + Assertions.assertEquals("P1W", AdvancedCommerceOfferPeriod.P1W.toString()); + } + + @Test + public void testAdvancedCommerceOfferReason() { + Assertions.assertEquals("ACQUISITION", AdvancedCommerceOfferReason.ACQUISITION.getValue()); + Assertions.assertEquals("WIN_BACK", AdvancedCommerceOfferReason.WIN_BACK.getValue()); + Assertions.assertEquals("RETENTION", AdvancedCommerceOfferReason.RETENTION.getValue()); + + Assertions.assertEquals(AdvancedCommerceOfferReason.ACQUISITION, + AdvancedCommerceOfferReason.fromValue("ACQUISITION")); + Assertions.assertEquals(AdvancedCommerceOfferReason.WIN_BACK, + AdvancedCommerceOfferReason.fromValue("WIN_BACK")); + Assertions.assertEquals(AdvancedCommerceOfferReason.RETENTION, + AdvancedCommerceOfferReason.fromValue("RETENTION")); + Assertions.assertNull(AdvancedCommerceOfferReason.fromValue("INVALID")); + + Assertions.assertEquals("WIN_BACK", AdvancedCommerceOfferReason.WIN_BACK.toString()); + } + + @Test + public void testAdvancedCommerceEffective() { + Assertions.assertEquals("IMMEDIATELY", AdvancedCommerceEffective.IMMEDIATELY.getValue()); + Assertions.assertEquals("NEXT_BILL_CYCLE", AdvancedCommerceEffective.NEXT_BILL_CYCLE.getValue()); + + Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, + AdvancedCommerceEffective.fromValue("IMMEDIATELY")); + Assertions.assertEquals(AdvancedCommerceEffective.NEXT_BILL_CYCLE, + AdvancedCommerceEffective.fromValue("NEXT_BILL_CYCLE")); + Assertions.assertNull(AdvancedCommerceEffective.fromValue("INVALID")); + + Assertions.assertEquals("IMMEDIATELY", AdvancedCommerceEffective.IMMEDIATELY.toString()); + } + + @Test + public void testValidationUtilsDescription() { + String validDescription = "Valid description"; + Assertions.assertEquals(validDescription, AdvancedCommerceValidationUtils.validateDescription(validDescription)); + + String maxLengthDescription = "A".repeat(45); + Assertions.assertEquals(maxLengthDescription, + AdvancedCommerceValidationUtils.validateDescription(maxLengthDescription)); + + String tooLongDescription = "A".repeat(46); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateDescription(tooLongDescription)); + + Assertions.assertThrows(NullPointerException.class, + () -> AdvancedCommerceValidationUtils.validateDescription(null)); + } + + @Test + public void testValidationUtilsDisplayName() { + String validDisplayName = "Valid Name"; + Assertions.assertEquals(validDisplayName, AdvancedCommerceValidationUtils.validateDisplayName(validDisplayName)); + + String maxLengthDisplayName = "A".repeat(30); + Assertions.assertEquals(maxLengthDisplayName, + AdvancedCommerceValidationUtils.validateDisplayName(maxLengthDisplayName)); + + String tooLongDisplayName = "A".repeat(31); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateDisplayName(tooLongDisplayName)); + + Assertions.assertThrows(NullPointerException.class, + () -> AdvancedCommerceValidationUtils.validateDisplayName(null)); + } + + @Test + public void testValidationUtilsSku() { + String validSku = "valid.sku.123"; + Assertions.assertEquals(validSku, AdvancedCommerceValidationUtils.validateSku(validSku)); + + String maxLengthSku = "A".repeat(128); + Assertions.assertEquals(maxLengthSku, AdvancedCommerceValidationUtils.validateSku(maxLengthSku)); + + String tooLongSku = "A".repeat(129); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateSku(tooLongSku)); + + Assertions.assertNull(AdvancedCommerceValidationUtils.validateSku(null)); + } + + @Test + public void testValidationUtilsPeriodCount() { + Assertions.assertEquals(1, AdvancedCommerceValidationUtils.validatePeriodCount(1)); + Assertions.assertEquals(6, AdvancedCommerceValidationUtils.validatePeriodCount(6)); + Assertions.assertEquals(12, AdvancedCommerceValidationUtils.validatePeriodCount(12)); + + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validatePeriodCount(0)); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validatePeriodCount(13)); + Assertions.assertThrows(NullPointerException.class, + () -> AdvancedCommerceValidationUtils.validatePeriodCount(null)); + } + + @Test + public void testValidationUtilsItems() { + List validList = Arrays.asList( + new AdvancedCommerceOneTimeChargeItem("desc", "name", "sku1", 1000L) + ); + Assertions.assertEquals(validList, AdvancedCommerceValidationUtils.validateItems(validList)); + + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateItems(null)); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateItems(new ArrayList<>())); + + List listWithNull = new ArrayList<>(); + listWithNull.add(null); + Assertions.assertThrows(IllegalArgumentException.class, + () -> AdvancedCommerceValidationUtils.validateItems(listWithNull)); + } + + @Test + public void testAdvancedCommerceDescriptors() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceDescriptors.json"); + + AdvancedCommerceDescriptors descriptors = objectMapper.readValue(json, AdvancedCommerceDescriptors.class); + Assertions.assertEquals("description", descriptors.getDescription()); + Assertions.assertEquals("display name", descriptors.getDisplayName()); + } + + @Test + public void testAdvancedCommerceOneTimeChargeItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceOneTimeChargeItem.json"); + + AdvancedCommerceOneTimeChargeItem item = objectMapper.readValue(json, AdvancedCommerceOneTimeChargeItem.class); + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("display name", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals(15000L, item.getPrice()); + } + + @Test + public void testAdvancedCommerceSubscriptionCreateItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCreateItem.json"); + + AdvancedCommerceSubscriptionCreateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionCreateItem.class); + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("display name", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals(20000L, item.getPrice()); + } + + @Test + public void testAdvancedCommerceRequestRefundItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceRequestRefundItem.json"); + + AdvancedCommerceRequestRefundItem item = objectMapper.readValue(json, AdvancedCommerceRequestRefundItem.class); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL, item.getRefundReason()); + Assertions.assertEquals(AdvancedCommerceRefundType.FULL, item.getRefundType()); + Assertions.assertEquals(true, item.getRevoke()); + Assertions.assertEquals(5000, item.getRefundAmount()); + } + + @Test + public void testAdvancedCommerceOffer() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceOffer.json"); + + AdvancedCommerceOffer offer = objectMapper.readValue(json, AdvancedCommerceOffer.class); + Assertions.assertEquals(AdvancedCommerceOfferPeriod.P1W, offer.getPeriod()); + Assertions.assertEquals(3, offer.getPeriodCount()); + Assertions.assertEquals(5000L, offer.getPrice()); + Assertions.assertEquals(AdvancedCommerceOfferReason.WIN_BACK, offer.getReason()); + } + + + @Test + public void testAdvancedCommerceOneTimeChargeCreateRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceOneTimeChargeCreateRequest.json"); + + AdvancedCommerceOneTimeChargeCreateRequest request = + objectMapper.readValue(json, AdvancedCommerceOneTimeChargeCreateRequest.class); + + Assertions.assertEquals("USD", request.getCurrency()); + Assertions.assertNotNull(request.getItem()); + Assertions.assertEquals("taxCode", request.getTaxCode()); + Assertions.assertNotNull(request.getRequestInfo()); + Assertions.assertEquals("USA", request.getStorefront()); + } + + @Test + public void testAdvancedCommerceSubscriptionCreateRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCreateRequest.json"); + + AdvancedCommerceSubscriptionCreateRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionCreateRequest.class); + + Assertions.assertEquals("USD", request.getCurrency()); + Assertions.assertNotNull(request.getDescriptors()); + Assertions.assertNotNull(request.getItems()); + Assertions.assertEquals(2, request.getItems().size()); + Assertions.assertEquals(AdvancedCommercePeriod.P1M, request.getPeriod()); + Assertions.assertEquals("taxCode", request.getTaxCode()); + Assertions.assertEquals("USA", request.getStorefront()); + Assertions.assertEquals("transactionId", request.getPreviousTransactionId()); + } + + @Test + public void testAdvancedCommerceRequestRefundRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceRequestRefundRequest.json"); + + AdvancedCommerceRequestRefundRequest request = + objectMapper.readValue(json, AdvancedCommerceRequestRefundRequest.class); + + Assertions.assertNotNull(request.getItems()); + Assertions.assertEquals(2, request.getItems().size()); + Assertions.assertTrue(request.getRefundRiskingPreference()); + Assertions.assertNotNull(request.getRequestInfo()); + Assertions.assertEquals("USD", request.getCurrency()); + Assertions.assertEquals("USA", request.getStorefront()); + } + + @Test + public void testAdvancedCommerceSubscriptionCancelRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCancelRequest.json"); + + AdvancedCommerceSubscriptionCancelRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelRequest.class); + + Assertions.assertNotNull(request.getRequestInfo()); + Assertions.assertEquals("USA", request.getStorefront()); + } + + @Test + public void testAdvancedCommerceSubscriptionRevokeRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionRevokeRequest.json"); + + AdvancedCommerceSubscriptionRevokeRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionRevokeRequest.class); + + Assertions.assertNotNull(request.getRequestInfo()); + Assertions.assertTrue(request.getRefundRiskingPreference()); + Assertions.assertEquals(AdvancedCommerceRefundReason.LEGAL, request.getRefundReason()); + Assertions.assertEquals("FULL", request.getRefundType()); + Assertions.assertEquals("USA", request.getStorefront()); + } + + @Test + public void testAdvancedCommerceSubscriptionPriceChangeRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeRequest.json"); + + AdvancedCommerceSubscriptionPriceChangeRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeRequest.class); + + Assertions.assertNotNull(request.getItems()); + Assertions.assertNotNull(request.getRequestInfo()); + Assertions.assertEquals("USD", request.getCurrency()); + } + + + @Test + public void testAdvancedCommerceRequestRefundResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceRequestRefundResponse.json"); + + AdvancedCommerceRequestRefundResponse response = objectMapper.readValue(json, AdvancedCommerceRequestRefundResponse.class); + + Assertions.assertNull(response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo()); + } + + @Test + public void testAdvancedCommerceSubscriptionCancelResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionCancelResponse.json"); + + AdvancedCommerceSubscriptionCancelResponse response = objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelResponse.class); + + Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo()); + } + + @Test + public void testAdvancedCommerceSubscriptionRevokeResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionRevokeResponse.json"); + + AdvancedCommerceSubscriptionRevokeResponse response = objectMapper.readValue(json, AdvancedCommerceSubscriptionRevokeResponse.class); + + Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo()); + } + + @Test + public void testAdvancedCommerceSubscriptionPriceChangeResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeResponse.json"); + + AdvancedCommerceSubscriptionPriceChangeResponse response = + objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeResponse.class); + + Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo()); + } + + @Test + public void testAdvancedCommerceSubscriptionChangeMetadataResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataResponse.json"); + + AdvancedCommerceSubscriptionChangeMetadataResponse response = + objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataResponse.class); + + Assertions.assertEquals("signed_renewal_info", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info", response.getSignedTransactionInfo()); + } + + @Test + public void testAbstractAdvancedCommerceResponseWithUnknownFields() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceResponseWithUnknownFields.json"); + + AdvancedCommerceSubscriptionCancelResponse response = + objectMapper.readValue(json, AdvancedCommerceSubscriptionCancelResponse.class); + + Assertions.assertEquals("signed_renewal_info_value", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo()); + Assertions.assertNotNull(response.getUnknownFields()); + Assertions.assertEquals(1, response.getUnknownFields().size()); + Assertions.assertEquals("unknown_value", response.getUnknownFields().get("unknownField")); + } + + + @Test + public void testAdvancedCommerceSubscriptionMigrateRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateRequest.json"); + + AdvancedCommerceSubscriptionMigrateRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateRequest.class); + + Assertions.assertNotNull(request.getDescriptors()); + Assertions.assertNotNull(request.getItems()); + Assertions.assertEquals("taxCode", request.getTaxCode()); + Assertions.assertEquals("targetProductId", request.getTargetProductId()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyInAppRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyInAppRequest.json"); + + AdvancedCommerceSubscriptionModifyInAppRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyInAppRequest.class); + + Assertions.assertEquals("USD", request.getCurrency()); + Assertions.assertNotNull(request.getDescriptors()); + Assertions.assertEquals("taxCode", request.getTaxCode()); + Assertions.assertEquals("transactionId", request.getTransactionId()); + Assertions.assertTrue(request.getRetainBillingCycle()); + } + + @Test + public void testAdvancedCommerceSubscriptionReactivateInAppRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionReactivateInAppRequest.json"); + + AdvancedCommerceSubscriptionReactivateInAppRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionReactivateInAppRequest.class); + + Assertions.assertNotNull(request.getItems()); + Assertions.assertEquals("transactionId", request.getTransactionId()); + } + + @Test + public void testAdvancedCommerceSubscriptionChangeMetadataRequest() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataRequest.json"); + + AdvancedCommerceSubscriptionChangeMetadataRequest request = + objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataRequest.class); + + Assertions.assertNotNull(request.getItems()); + Assertions.assertNotNull(request.getRequestInfo()); + } + + + @Test + public void testAdvancedCommerceSubscriptionMigrateDescriptors() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateDescriptors.json"); + + AdvancedCommerceSubscriptionMigrateDescriptors descriptors = + objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateDescriptors.class); + + Assertions.assertEquals("description", descriptors.getDescription()); + Assertions.assertEquals("displayName", descriptors.getDisplayName()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyDescriptors() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyDescriptors.json"); + + AdvancedCommerceSubscriptionModifyDescriptors descriptors = + objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyDescriptors.class); + + Assertions.assertEquals("description", descriptors.getDescription()); + Assertions.assertEquals("displayName", descriptors.getDisplayName()); + Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, descriptors.getEffective()); + } + + @Test + public void testAdvancedCommerceSubscriptionChangeMetadataDescriptors() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataDescriptors.json"); + + AdvancedCommerceSubscriptionChangeMetadataDescriptors descriptors = + objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataDescriptors.class); + + Assertions.assertEquals("description", descriptors.getDescription()); + Assertions.assertEquals("displayName", descriptors.getDisplayName()); + Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, descriptors.getEffective()); + } + + @Test + public void testAdvancedCommerceSubscriptionMigrateItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateItem.json"); + + AdvancedCommerceSubscriptionMigrateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateItem.class); + + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("displayName", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + } + + @Test + public void testAdvancedCommerceSubscriptionMigrateRenewalItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateRenewalItem.json"); + + AdvancedCommerceSubscriptionMigrateRenewalItem item = + objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateRenewalItem.class); + + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("displayName", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyAddItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyAddItem.json"); + + AdvancedCommerceSubscriptionModifyAddItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyAddItem.class); + + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("displayName", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals(12000L, item.getPrice()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyChangeItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyChangeItem.json"); + + AdvancedCommerceSubscriptionModifyChangeItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyChangeItem.class); + + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("displayName", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals("currentSKU", item.getCurrentSKU()); + Assertions.assertEquals(13000L, item.getPrice()); + Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, item.getEffective()); + Assertions.assertEquals(AdvancedCommerceReason.UPGRADE, item.getReason()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyRemoveItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyRemoveItem.json"); + + AdvancedCommerceSubscriptionModifyRemoveItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyRemoveItem.class); + + Assertions.assertEquals("sku", item.getSku()); + } + + @Test + public void testAdvancedCommerceSubscriptionModifyPeriodChange() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionModifyPeriodChange.json"); + + AdvancedCommerceSubscriptionModifyPeriodChange periodChange = + objectMapper.readValue(json, AdvancedCommerceSubscriptionModifyPeriodChange.class); + + Assertions.assertEquals(AdvancedCommercePeriod.P3M, periodChange.getPeriod()); + Assertions.assertEquals(AdvancedCommerceEffective.IMMEDIATELY, periodChange.getEffective()); + } + + @Test + public void testAdvancedCommerceSubscriptionPriceChangeItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionPriceChangeItem.json"); + + AdvancedCommerceSubscriptionPriceChangeItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionPriceChangeItem.class); + + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals(16000L, item.getPrice()); + Assertions.assertEquals("dependentSKU", item.getDependentSKUs().get(0)); + } + + @Test + public void testAdvancedCommerceSubscriptionPriceChangeItemDependentSKUValidation() { + String validSku = "A".repeat(128); + String tooLongSku = "A".repeat(129); + + AdvancedCommerceSubscriptionPriceChangeItem item = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L); + item.addDependentSKU(validSku); + Assertions.assertEquals(validSku, item.getDependentSKUs().get(0)); + + Assertions.assertThrows(IllegalArgumentException.class, + () -> new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L).addDependentSKU(tooLongSku)); + + Assertions.assertThrows(IllegalArgumentException.class, + () -> new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L).dependentSKUs(List.of(tooLongSku))); + + Assertions.assertThrows(IllegalArgumentException.class, () -> { + AdvancedCommerceSubscriptionPriceChangeItem i = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L); + i.setDependentSKUs(List.of(tooLongSku)); + }); + + AdvancedCommerceSubscriptionPriceChangeItem nullListItem = new AdvancedCommerceSubscriptionPriceChangeItem("sku", 1000L); + nullListItem.setDependentSKUs(null); + Assertions.assertNull(nullListItem.getDependentSKUs()); + } + + @Test + public void testAdvancedCommerceSubscriptionReactivateItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionReactivateItem.json"); + + AdvancedCommerceSubscriptionReactivateItem item = objectMapper.readValue(json, AdvancedCommerceSubscriptionReactivateItem.class); + + Assertions.assertEquals("sku", item.getSku()); + } + + @Test + public void testAdvancedCommerceSubscriptionChangeMetadataItem() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionChangeMetadataItem.json"); + + AdvancedCommerceSubscriptionChangeMetadataItem item = + objectMapper.readValue(json, AdvancedCommerceSubscriptionChangeMetadataItem.class); + + Assertions.assertEquals("description", item.getDescription()); + Assertions.assertEquals("displayName", item.getDisplayName()); + Assertions.assertEquals("sku", item.getSku()); + Assertions.assertEquals("currentSKU", item.getCurrentSku()); + Assertions.assertEquals(AdvancedCommerceEffective.NEXT_BILL_CYCLE, item.getEffective()); + } + + + @Test + public void testAdvancedCommerceRequestInfo() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceRequestInfo.json"); + + AdvancedCommerceRequestInfo requestInfo = objectMapper.readValue(json, AdvancedCommerceRequestInfo.class); + + Assertions.assertEquals(UUID.fromString("550e8400-e29b-41d4-a716-446655440010"), requestInfo.getRequestReferenceId()); + Assertions.assertEquals(UUID.fromString("660e8400-e29b-41d4-a716-446655440011"), requestInfo.getAppAccountToken()); + Assertions.assertEquals("consistency_token_value", requestInfo.consistencyToken()); + } + + + @Test + public void testAdvancedCommerceSubscriptionMigrateResponse() throws Exception { + String json = TestingUtility.readFile("models/advancedCommerceSubscriptionMigrateResponse.json"); + + AdvancedCommerceSubscriptionMigrateResponse response = + objectMapper.readValue(json, AdvancedCommerceSubscriptionMigrateResponse.class); + + Assertions.assertEquals("signed_renewal_info_value", response.getSignedRenewalInfo()); + Assertions.assertEquals("signed_transaction_info_value", response.getSignedTransactionInfo()); + } +} diff --git a/src/test/resources/models/advancedCommerceDescriptors.json b/src/test/resources/models/advancedCommerceDescriptors.json new file mode 100644 index 00000000..5fe14d4c --- /dev/null +++ b/src/test/resources/models/advancedCommerceDescriptors.json @@ -0,0 +1,4 @@ +{ + "description": "description", + "displayName": "display name" +} diff --git a/src/test/resources/models/advancedCommerceOffer.json b/src/test/resources/models/advancedCommerceOffer.json new file mode 100644 index 00000000..83a413fb --- /dev/null +++ b/src/test/resources/models/advancedCommerceOffer.json @@ -0,0 +1,6 @@ +{ + "period": "P1W", + "periodCount": 3, + "price": 5000, + "reason": "WIN_BACK" +} diff --git a/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json b/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json new file mode 100644 index 00000000..d9874797 --- /dev/null +++ b/src/test/resources/models/advancedCommerceOneTimeChargeCreateRequest.json @@ -0,0 +1,16 @@ +{ + "currency": "USD", + "item": { + "description": "description", + "displayName": "display name", + "SKU": "sku", + "price": 10000 + }, + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440000" + }, + "taxCode": "taxCode", + "storefront": "USA", + "operation": "CREATE", + "version": "1.0" +} diff --git a/src/test/resources/models/advancedCommerceOneTimeChargeItem.json b/src/test/resources/models/advancedCommerceOneTimeChargeItem.json new file mode 100644 index 00000000..0849bf28 --- /dev/null +++ b/src/test/resources/models/advancedCommerceOneTimeChargeItem.json @@ -0,0 +1,6 @@ +{ + "description": "description", + "displayName": "display name", + "SKU": "sku", + "price": 15000 +} diff --git a/src/test/resources/models/advancedCommerceRequestInfo.json b/src/test/resources/models/advancedCommerceRequestInfo.json new file mode 100644 index 00000000..a57cbdca --- /dev/null +++ b/src/test/resources/models/advancedCommerceRequestInfo.json @@ -0,0 +1,5 @@ +{ + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440010", + "appAccountToken": "660e8400-e29b-41d4-a716-446655440011", + "consistencyToken": "consistency_token_value" +} diff --git a/src/test/resources/models/advancedCommerceRequestRefundItem.json b/src/test/resources/models/advancedCommerceRequestRefundItem.json new file mode 100644 index 00000000..875107fa --- /dev/null +++ b/src/test/resources/models/advancedCommerceRequestRefundItem.json @@ -0,0 +1,7 @@ +{ + "SKU": "sku", + "refundReason": "LEGAL", + "refundType": "FULL", + "revoke": true, + "refundAmount": 5000 +} diff --git a/src/test/resources/models/advancedCommerceRequestRefundRequest.json b/src/test/resources/models/advancedCommerceRequestRefundRequest.json new file mode 100644 index 00000000..6a58aa7a --- /dev/null +++ b/src/test/resources/models/advancedCommerceRequestRefundRequest.json @@ -0,0 +1,22 @@ +{ + "items": [ + { + "SKU": "sku", + "refundReason": "LEGAL", + "refundType": "FULL", + "revoke": true + }, + { + "SKU": "sku", + "refundReason": "OTHER", + "refundType": "PRORATED", + "revoke": false + } + ], + "refundRiskingPreference": true, + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440002" + }, + "currency": "USD", + "storefront": "USA" +} diff --git a/src/test/resources/models/advancedCommerceRequestRefundResponse.json b/src/test/resources/models/advancedCommerceRequestRefundResponse.json new file mode 100644 index 00000000..0e4f409c --- /dev/null +++ b/src/test/resources/models/advancedCommerceRequestRefundResponse.json @@ -0,0 +1,3 @@ +{ + "signedTransactionInfo": "signed_transaction_info_value" +} diff --git a/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json b/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json new file mode 100644 index 00000000..6e516d74 --- /dev/null +++ b/src/test/resources/models/advancedCommerceResponseWithUnknownFields.json @@ -0,0 +1,5 @@ +{ + "signedRenewalInfo": "signed_renewal_info_value", + "signedTransactionInfo": "signed_transaction_info_value", + "unknownField": "unknown_value" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json b/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json new file mode 100644 index 00000000..9cbe08c5 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionCancelRequest.json @@ -0,0 +1,6 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440003" + }, + "storefront": "USA" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json b/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json new file mode 100644 index 00000000..6f14b309 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionCancelResponse.json @@ -0,0 +1,4 @@ +{ + "signedRenewalInfo": "signed_renewal_info", + "signedTransactionInfo": "signed_transaction_info" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json new file mode 100644 index 00000000..b07d7400 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataDescriptors.json @@ -0,0 +1,5 @@ +{ + "effective": "IMMEDIATELY", + "description": "description", + "displayName": "displayName" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json new file mode 100644 index 00000000..4ec7192b --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataItem.json @@ -0,0 +1,7 @@ +{ + "currentSKU": "currentSKU", + "effective": "NEXT_BILL_CYCLE", + "description": "description", + "displayName": "displayName", + "SKU": "sku" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json new file mode 100644 index 00000000..20a1e396 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataRequest.json @@ -0,0 +1,14 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440009" + }, + "items": [ + { + "currentSKU": "currentSKU", + "effective": "IMMEDIATELY", + "description": "description", + "displayName": "display name", + "SKU": "sku" + } + ] +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json new file mode 100644 index 00000000..6f14b309 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionChangeMetadataResponse.json @@ -0,0 +1,4 @@ +{ + "signedRenewalInfo": "signed_renewal_info", + "signedTransactionInfo": "signed_transaction_info" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json b/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json new file mode 100644 index 00000000..f1b00ea2 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionCreateItem.json @@ -0,0 +1,6 @@ +{ + "description": "description", + "displayName": "display name", + "SKU": "sku", + "price": 20000 +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json b/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json new file mode 100644 index 00000000..2b7a132c --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionCreateRequest.json @@ -0,0 +1,28 @@ +{ + "currency": "USD", + "descriptors": { + "description": "description", + "displayName": "display name" + }, + "items": [ + { + "SKU": "sku", + "description": "description", + "displayName": "display name", + "price": 20000 + }, + { + "SKU": "sku", + "description": "description", + "displayName": "display name", + "price": 30000 + } + ], + "period": "P1M", + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440001" + }, + "taxCode": "taxCode", + "storefront": "USA", + "previousTransactionId": "transactionId" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json new file mode 100644 index 00000000..6d0bd6ee --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateDescriptors.json @@ -0,0 +1,4 @@ +{ + "description": "description", + "displayName": "displayName" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json new file mode 100644 index 00000000..00fce710 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateItem.json @@ -0,0 +1,5 @@ +{ + "SKU": "sku", + "description": "description", + "displayName": "displayName" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json new file mode 100644 index 00000000..00fce710 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateRenewalItem.json @@ -0,0 +1,5 @@ +{ + "SKU": "sku", + "description": "description", + "displayName": "displayName" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json new file mode 100644 index 00000000..d670da51 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateRequest.json @@ -0,0 +1,18 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440006" + }, + "descriptors": { + "description": "description", + "displayName": "display name" + }, + "items": [ + { + "SKU": "sku", + "description": "description", + "displayName": "display name" + } + ], + "targetProductId": "targetProductId", + "taxCode": "taxCode" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json b/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json new file mode 100644 index 00000000..2b12972a --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionMigrateResponse.json @@ -0,0 +1,4 @@ +{ + "signedRenewalInfo": "signed_renewal_info_value", + "signedTransactionInfo": "signed_transaction_info_value" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json new file mode 100644 index 00000000..935ffb42 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyAddItem.json @@ -0,0 +1,6 @@ +{ + "SKU": "sku", + "description": "description", + "displayName": "displayName", + "price": 12000 +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json new file mode 100644 index 00000000..2874d6c4 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyChangeItem.json @@ -0,0 +1,9 @@ +{ + "currentSKU": "currentSKU", + "description": "description", + "displayName": "displayName", + "effective": "IMMEDIATELY", + "price": 13000, + "reason": "UPGRADE", + "SKU": "sku" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json b/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json new file mode 100644 index 00000000..b07d7400 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyDescriptors.json @@ -0,0 +1,5 @@ +{ + "effective": "IMMEDIATELY", + "description": "description", + "displayName": "displayName" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json b/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json new file mode 100644 index 00000000..0934cb8c --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyInAppRequest.json @@ -0,0 +1,14 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440007" + }, + "transactionId": "transactionId", + "retainBillingCycle": true, + "descriptors": { + "effective": "IMMEDIATELY", + "description": "description", + "displayName": "display name" + }, + "taxCode": "taxCode", + "currency": "USD" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json b/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json new file mode 100644 index 00000000..b46ebb58 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyPeriodChange.json @@ -0,0 +1,4 @@ +{ + "effective": "IMMEDIATELY", + "period": "P3M" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json b/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json new file mode 100644 index 00000000..c9767fb0 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionModifyRemoveItem.json @@ -0,0 +1,3 @@ +{ + "SKU": "sku" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json new file mode 100644 index 00000000..8a4b90f0 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeItem.json @@ -0,0 +1,5 @@ +{ + "SKU": "sku", + "price": 16000, + "dependentSKUs": ["dependentSKU"] +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json new file mode 100644 index 00000000..fba8aded --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeRequest.json @@ -0,0 +1,12 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440005" + }, + "items": [ + { + "SKU": "sku123", + "price": 15000 + } + ], + "currency": "USD" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json new file mode 100644 index 00000000..6f14b309 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionPriceChangeResponse.json @@ -0,0 +1,4 @@ +{ + "signedRenewalInfo": "signed_renewal_info", + "signedTransactionInfo": "signed_transaction_info" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json b/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json new file mode 100644 index 00000000..408a99b3 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionReactivateInAppRequest.json @@ -0,0 +1,11 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440008" + }, + "transactionId": "transactionId", + "items": [ + { + "SKU": "sku" + } + ] +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json b/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json new file mode 100644 index 00000000..c9767fb0 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionReactivateItem.json @@ -0,0 +1,3 @@ +{ + "SKU": "sku" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json b/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json new file mode 100644 index 00000000..d723be45 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionRevokeRequest.json @@ -0,0 +1,9 @@ +{ + "requestInfo": { + "requestReferenceId": "550e8400-e29b-41d4-a716-446655440004" + }, + "refundRiskingPreference": true, + "refundReason": "LEGAL", + "refundType": "FULL", + "storefront": "USA" +} diff --git a/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json b/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json new file mode 100644 index 00000000..6f14b309 --- /dev/null +++ b/src/test/resources/models/advancedCommerceSubscriptionRevokeResponse.json @@ -0,0 +1,4 @@ +{ + "signedRenewalInfo": "signed_renewal_info", + "signedTransactionInfo": "signed_transaction_info" +}