diff --git a/build.gradle b/build.gradle index b2621bcec..3a39e3c89 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension + // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { @@ -30,6 +32,18 @@ tasks.dokkaHtmlMultiModule.configure { outputDirectory.set(file("dokka")) } +subprojects { + afterEvaluate { project -> + project.plugins.withId('org.jetbrains.kotlin.android') { + project.extensions.configure(KotlinAndroidProjectExtension) { ext -> + ext.compilerOptions { + freeCompilerArgs.add("-Xconsistent-data-class-copy-visibility") + } + } + } + } +} + ext { minSdkVersion = 21 targetSdkVersion = 36 diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/model/request/POInvoiceRequest.kt b/sdk/src/main/kotlin/com/processout/sdk/api/model/request/POInvoiceRequest.kt index 79334e03f..84e84f205 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/model/request/POInvoiceRequest.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/model/request/POInvoiceRequest.kt @@ -1,7 +1,6 @@ package com.processout.sdk.api.model.request import android.os.Parcelable -import com.squareup.moshi.JsonClass import kotlinx.parcelize.Parcelize /** @@ -10,10 +9,29 @@ import kotlinx.parcelize.Parcelize * @param[invoiceId] Requested invoice ID. * @param[clientSecret] Client secret is a value of __X-ProcessOut-Client-Secret__ header of the invoice. * When provided payment methods saved by the customer will be included in the response if the invoice has assigned customer ID. + * @param[expand] Expanded properties. */ @Parcelize -@JsonClass(generateAdapter = true) data class POInvoiceRequest( val invoiceId: String, - val clientSecret: String? = null -) : Parcelable + val clientSecret: String? = null, + val expand: Set = emptySet() +) : Parcelable { + + /** + * Expandable invoice property. + */ + @Parcelize + data class ExpandedProperty internal constructor( + internal val queryValue: String + ) : Parcelable { + + companion object { + /** Expands transaction. */ + val transaction = ExpandedProperty(queryValue = "transaction") + + /** Expands payment methods. */ + val paymentMethods = ExpandedProperty(queryValue = "payment_methods") + } + } +} diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/network/InvoicesApi.kt b/sdk/src/main/kotlin/com/processout/sdk/api/network/InvoicesApi.kt index d59f738e7..e0bf7248b 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/network/InvoicesApi.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/network/InvoicesApi.kt @@ -44,9 +44,10 @@ internal interface InvoicesApi { @Body request: NativeAlternativePaymentCaptureRequest ): Response - @GET("/invoices/{id}?expand=transaction") + @GET("/invoices/{id}") suspend fun invoice( @Path("id") invoiceId: String, + @Query("expand") expandedProperties: String?, @Header(CLIENT_SECRET) clientSecret: String? ): Response diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/repository/DefaultInvoicesRepository.kt b/sdk/src/main/kotlin/com/processout/sdk/api/repository/DefaultInvoicesRepository.kt index 3b37e7a8b..3c57e7081 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/repository/DefaultInvoicesRepository.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/repository/DefaultInvoicesRepository.kt @@ -98,8 +98,12 @@ internal class DefaultInvoicesRepository( override suspend fun invoice(request: POInvoiceRequest) = plainApiCall { + val expandedProperties = request.expand + .joinToString(separator = ",") { it.queryValue } + .takeIf { it.isNotEmpty() } api.invoice( invoiceId = request.invoiceId, + expandedProperties = expandedProperties, clientSecret = request.clientSecret ) }.map() diff --git a/sdk/src/main/kotlin/com/processout/sdk/api/service/DefaultInvoicesService.kt b/sdk/src/main/kotlin/com/processout/sdk/api/service/DefaultInvoicesService.kt index 9a880b3c8..c7527f619 100644 --- a/sdk/src/main/kotlin/com/processout/sdk/api/service/DefaultInvoicesService.kt +++ b/sdk/src/main/kotlin/com/processout/sdk/api/service/DefaultInvoicesService.kt @@ -228,22 +228,14 @@ internal class DefaultInvoicesService( override suspend fun invoice( invoiceId: String ): ProcessOutResult = - repository.invoice( - request = POInvoiceRequest( - invoiceId = invoiceId, - clientSecret = null - ) - ) + repository.invoice(request = POInvoiceRequest(invoiceId = invoiceId)) override fun invoice( invoiceId: String, callback: ProcessOutCallback ) { repository.invoice( - request = POInvoiceRequest( - invoiceId = invoiceId, - clientSecret = null - ), + request = POInvoiceRequest(invoiceId = invoiceId), callback = callback ) } diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt index 381abd403..f385d647d 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/checkout/DynamicCheckoutInteractor.kt @@ -13,6 +13,8 @@ import com.processout.sdk.R import com.processout.sdk.api.dispatcher.POEventDispatcher import com.processout.sdk.api.model.event.PONativeAlternativePaymentMethodEvent.WillSubmitParameters import com.processout.sdk.api.model.request.* +import com.processout.sdk.api.model.request.POInvoiceRequest.ExpandedProperty.Companion.paymentMethods +import com.processout.sdk.api.model.request.POInvoiceRequest.ExpandedProperty.Companion.transaction import com.processout.sdk.api.model.response.* import com.processout.sdk.api.model.response.POBillingAddressCollectionMode.* import com.processout.sdk.api.model.response.PODynamicCheckoutPaymentMethod.* @@ -156,7 +158,10 @@ internal class DynamicCheckoutInteractor( } private suspend fun fetchConfiguration() { - invoicesService.invoice(configuration.invoiceRequest) + val request = configuration.invoiceRequest.copy( + expand = setOf(transaction, paymentMethods) + ) + invoicesService.invoice(request) .onSuccess { invoice -> when (invoice.transaction?.status()) { WAITING -> setStartedState(invoice) diff --git a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt index b91de8a36..3af68d297 100644 --- a/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt +++ b/ui/src/main/kotlin/com/processout/sdk/ui/savedpaymentmethods/SavedPaymentMethodsInteractor.kt @@ -8,6 +8,7 @@ import coil.request.ImageResult import com.processout.sdk.R import com.processout.sdk.api.dispatcher.POEventDispatcher import com.processout.sdk.api.model.request.PODeleteCustomerTokenRequest +import com.processout.sdk.api.model.request.POInvoiceRequest.ExpandedProperty.Companion.paymentMethods import com.processout.sdk.api.model.response.PODynamicCheckoutPaymentMethod import com.processout.sdk.api.model.response.PODynamicCheckoutPaymentMethod.* import com.processout.sdk.api.model.response.POImageResource @@ -77,7 +78,10 @@ internal class SavedPaymentMethodsInteractor( ) private suspend fun fetchPaymentMethods() { - invoicesService.invoice(configuration.invoiceRequest) + val request = configuration.invoiceRequest.copy( + expand = setOf(paymentMethods) + ) + invoicesService.invoice(request) .onSuccess { invoice -> val mappedPaymentMethods = invoice.paymentMethods?.map() ?: emptyList() preloadAllImages(paymentMethods = mappedPaymentMethods)