Skip to content
This repository was archived by the owner on Feb 4, 2025. It is now read-only.

Commit b34cc5e

Browse files
authored
Merge pull request #2948 from wordpress-mobile/10611-backend-receipts-add-the-new-endpoint
[Backend Receipts] Add the new endpoint
2 parents 1bb762c + 235834a commit b34cc5e

File tree

8 files changed

+124
-0
lines changed

8 files changed

+124
-0
lines changed

example/src/androidTest/java/org/wordpress/android/fluxc/mocked/MockedStack_WCOrdersTest.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,29 @@ class MockedStack_WCOrdersTest : MockedStack_Base() {
541541
assertEquals(payload.error.type, OrderErrorType.INVALID_RESPONSE)
542542
}
543543

544+
@Test
545+
fun testFetchOrdersReceipt() = runBlocking {
546+
interceptor.respondWith("wc-order-receipt-success.json")
547+
548+
val result = orderRestClient.fetchOrdersReceipt(
549+
siteModel,
550+
0,
551+
expirationDate = "2024-01-23",
552+
expirationDays = 365,
553+
forceNew = false,
554+
)
555+
556+
assertFalse(result.isError)
557+
assertEquals(
558+
"https://test.site/wc/file/transient/7e811783b66f468b61b4738231287b2a706ce1",
559+
result.result!!.receiptUrl
560+
)
561+
assertEquals(
562+
"2024-01-23",
563+
result.result!!.expirationDate
564+
)
565+
}
566+
544567
@Suppress("unused")
545568
@Subscribe
546569
fun onAction(action: Action<*>) {

example/src/androidTest/java/org/wordpress/android/fluxc/release/ReleaseStack_WCOrderExtTest.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,4 +222,14 @@ class ReleaseStack_WCOrderExtTest : ReleaseStack_WCBase() {
222222
val providers = orderStore.getShipmentProvidersForSite(sSite)
223223
assertTrue(providers.isNotEmpty())
224224
}
225+
226+
@Test
227+
fun givenOrderDoesntExit_WhenFetchOrderReceipt_ThenErrorReturned() = runBlocking {
228+
val result = orderStore.fetchOrdersReceipt(
229+
sSite,
230+
Long.MAX_VALUE,
231+
)
232+
233+
assertTrue(result.isError)
234+
}
225235
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"data": {
3+
"receipt_url": "https:\/\/test.site\/wc\/file\/transient\/7e811783b66f468b61b4738231287b2a706ce1",
4+
"expiration_date": "2024-01-23"
5+
}
6+
}

example/src/test/java/org/wordpress/android/fluxc/wc/order/WCOrderStoreTest.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,33 @@ class WCOrderStoreTest {
444444
}
445445
}
446446

447+
@Test
448+
fun testFetchOrdersReceipt() {
449+
runBlocking {
450+
val orderModel = OrderTestUtils.generateSampleOrder(42)
451+
val site = SiteModel().apply { id = orderModel.localSiteId.value }
452+
val orderId = 42L
453+
val expirationDate = "2021-01-05"
454+
val expirationDays = 30
455+
val forceNew = true
456+
457+
orderStore.fetchOrdersReceipt(
458+
site,
459+
orderId,
460+
expirationDate,
461+
expirationDays,
462+
forceNew
463+
)
464+
465+
verify(orderRestClient).fetchOrdersReceipt(
466+
site,
467+
orderId,
468+
expirationDate,
469+
expirationDays,
470+
forceNew
471+
)
472+
}
473+
}
447474

448475
private fun setupMissingOrders(): MutableMap<WCOrderSummaryModel, OrderEntity?> {
449476
return mutableMapOf<WCOrderSummaryModel, OrderEntity?>().apply {

fluxc-processor/src/main/resources/wc-wp-api-endpoints.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
/orders/<id>/shipment-trackings/
55
/orders/<id>/shipment-trackings/<tracking>#String/
66
/orders/<id>/shipment-trackings/providers/
7+
/orders/<id>/receipt/
78

89
/products/<id>/
910
/products/<id>/variations/
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.wordpress.android.fluxc.network.rest.wpcom.wc.order
2+
3+
import com.google.gson.annotations.SerializedName
4+
5+
data class OrderReceiptResponse(
6+
@SerializedName("receipt_url") val receiptUrl: String,
7+
@SerializedName("expiration_date") val expirationDate: String,
8+
)

plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/order/OrderRestClient.kt

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package org.wordpress.android.fluxc.network.rest.wpcom.wc.order
44

5+
import android.net.Uri
56
import com.google.gson.JsonElement
67
import org.wordpress.android.fluxc.Dispatcher
78
import org.wordpress.android.fluxc.action.WCOrderAction
@@ -839,6 +840,40 @@ class OrderRestClient @Inject constructor(
839840
}
840841
}
841842

843+
/**
844+
* expirationDate: Formatted as yyyy-mm-dd.
845+
* expirationDays: A number, 0 is today, 1 is tomorrow, etc.
846+
* forceNew: Defaults to false, if true, creates a new receipt even if one already exists for the order.
847+
*/
848+
suspend fun fetchOrdersReceipt(
849+
site: SiteModel,
850+
orderId: Long,
851+
expirationDate: String? = null,
852+
expirationDays: Int? = null,
853+
forceNew: Boolean? = null
854+
): WooPayload<OrderReceiptResponse> {
855+
val params = mutableMapOf<String, String>().apply {
856+
expirationDate?.let { put("expiration_date", it) }
857+
expirationDays?.let { put("expiration_days", it.toString()) }
858+
forceNew?.let { put("force_new", it.toString()) }
859+
}
860+
861+
val url = Uri.parse(WOOCOMMERCE.orders.id(orderId).receipt.pathV3)
862+
.buildUpon().apply {
863+
params.forEach { (key, value) ->
864+
appendQueryParameter(key, value)
865+
}
866+
}.build().toString()
867+
868+
val response = wooNetwork.executePostGsonRequest(
869+
site = site,
870+
path = url,
871+
clazz = OrderReceiptResponse::class.java
872+
)
873+
874+
return response.toWooPayload { it }
875+
}
876+
842877
private suspend fun doFetchOrderCount(site: SiteModel, filterByStatus: String?): FetchOrdersCountResponsePayload {
843878
val url = WOOCOMMERCE.reports.orders.totals.pathV3
844879

plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCOrderStore.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,20 @@ class WCOrderStore @Inject constructor(
635635
}
636636
}
637637

638+
suspend fun fetchOrdersReceipt(
639+
site: SiteModel,
640+
orderId: Long,
641+
expirationDate: String? = null,
642+
expirationDays: Int? = null,
643+
forceNew: Boolean? = null
644+
) = wcOrderRestClient.fetchOrdersReceipt(
645+
site,
646+
orderId,
647+
expirationDate,
648+
expirationDays,
649+
forceNew
650+
)
651+
638652
private suspend fun updateOrderStatusLocally(orderId: Long, localSiteId: LocalId, newStatus: String) {
639653
val updatedOrder = ordersDao.getOrder(orderId, localSiteId)!!
640654
.copy(status = newStatus)

0 commit comments

Comments
 (0)