diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt index e9869a49b..cf535e806 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt @@ -250,6 +250,7 @@ interface BatchApiClient { interface ProductVariationsApiClient { fun createProductVariation(request: CreateProductVariationRequest): CreateProductVariationResult fun uploadVariationImage(request: ProductVariationImageUploadRequest): ProductVariationImageUploadResult + fun uploadProductVariationImageAsync(request: ProductVariationImageAsyncUploadRequest): ProductVariationImageAsyncUploadResult fun getAllProductVariations(request: ProductVariationsRequest): ProductVariationsResult fun getProductVariation(request: ProductVariationDetailsRequest): FetchedVariation fun updateProductVariation(request: UpdateProductVariationRequest): UpdateProductVariationResult diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/request/ProductVariationImageAsyncUploadRequest.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/request/ProductVariationImageAsyncUploadRequest.kt new file mode 100644 index 000000000..ffd0a052c --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/request/ProductVariationImageAsyncUploadRequest.kt @@ -0,0 +1,27 @@ +package com.ecwid.apiclient.v3.dto.variation.request + +import com.ecwid.apiclient.v3.dto.ApiRequest +import com.ecwid.apiclient.v3.dto.common.AsyncPictureData +import com.ecwid.apiclient.v3.httptransport.HttpBody +import com.ecwid.apiclient.v3.impl.RequestInfo + +data class ProductVariationImageAsyncUploadRequest( + val productId: Int = 0, + val variationId: Int = 0, + val asyncPictureData: AsyncPictureData = AsyncPictureData() +) : ApiRequest { + override fun toRequestInfo(): RequestInfo { + return RequestInfo.createPostRequest( + pathSegments = listOf( + "products", + "$productId", + "combinations", + "$variationId", + "image", + "async" + ), + params = mapOf(), + httpBody = HttpBody.JsonBody(obj = asyncPictureData) + ) + } +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/result/ProductVariationImageAsyncUploadResult.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/result/ProductVariationImageAsyncUploadResult.kt new file mode 100644 index 000000000..09c00e2db --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/variation/result/ProductVariationImageAsyncUploadResult.kt @@ -0,0 +1,5 @@ +package com.ecwid.apiclient.v3.dto.variation.result + +import com.ecwid.apiclient.v3.dto.common.ApiResultDTO + +class ProductVariationImageAsyncUploadResult : ApiResultDTO diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductVariationsApiClientImpl.kt b/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductVariationsApiClientImpl.kt index f926bc51d..fb5c8bd36 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductVariationsApiClientImpl.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductVariationsApiClientImpl.kt @@ -2,6 +2,8 @@ package com.ecwid.apiclient.v3.impl import com.ecwid.apiclient.v3.ApiClientHelper import com.ecwid.apiclient.v3.ProductVariationsApiClient +import com.ecwid.apiclient.v3.dto.variation.request.ProductVariationImageAsyncUploadRequest +import com.ecwid.apiclient.v3.dto.variation.result.ProductVariationImageAsyncUploadResult import com.ecwid.apiclient.v3.dto.variation.request.* import com.ecwid.apiclient.v3.dto.variation.result.* @@ -14,6 +16,9 @@ internal class ProductVariationsApiClientImpl( override fun uploadVariationImage(request: ProductVariationImageUploadRequest) = apiClientHelper.makeObjectResultRequest(request) + override fun uploadProductVariationImageAsync(request: ProductVariationImageAsyncUploadRequest) = + apiClientHelper.makeObjectResultRequest(request) + override fun deleteVariationImage(request: ProductVariationImageDeleteRequest) = apiClientHelper.makeObjectResultRequest(request) diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/entity/VariationsTest.kt b/src/test/kotlin/com/ecwid/apiclient/v3/entity/VariationsTest.kt index 44cfda6ea..315f6c2b7 100644 --- a/src/test/kotlin/com/ecwid/apiclient/v3/entity/VariationsTest.kt +++ b/src/test/kotlin/com/ecwid/apiclient/v3/entity/VariationsTest.kt @@ -1,6 +1,7 @@ package com.ecwid.apiclient.v3.entity import com.ecwid.apiclient.v3.converter.toUpdated +import com.ecwid.apiclient.v3.dto.common.AsyncPictureData import com.ecwid.apiclient.v3.dto.common.UploadFileData import com.ecwid.apiclient.v3.dto.product.request.ProductCreateRequest import com.ecwid.apiclient.v3.dto.product.request.ProductDetailsRequest @@ -284,6 +285,46 @@ class VariationsTest : BaseEntityTest() { val fetchedVariation2 = apiClient.getProductVariation(productVariationDetailsRequest) Assertions.assertNull(fetchedVariation2.imageUrl) } + + @Test + fun `test uploading product variation image asynchronously`() { + val productPrice = randomPrice() + val productCreateRequest = ProductCreateRequest( + newProduct = UpdatedProduct( + price = productPrice, + name = "Product ${randomAlphanumeric(8)}", + sku = "testVariationImageUploadAsync", + options = listOf(generateProductRadioOption("Test", listOf("1", "2", "3", "4", "5"))) + ) + ) + val productCreateResult = apiClient.createProduct(productCreateRequest) + val newProductId = productCreateResult.id + val testVariationPrice = randomPrice() + val testVariationWeight = randomWeight() + val createProductVariationRequest = CreateProductVariationRequest( + productId = newProductId, + newVariation = UpdatedVariation( + sku = "testVariation1", + quantity = 2, + price = testVariationPrice, + weight = testVariationWeight, + options = listOf(UpdatedVariation.Option(name = "Test", value = "5")) + ) + ) + val createProductVariationResult = apiClient.createProductVariation(createProductVariationRequest) + val newVariationId = createProductVariationResult.id + val uploadImageAsyncReq = ProductVariationImageAsyncUploadRequest( + productId = newProductId, + variationId = newVariationId, + asyncPictureData = AsyncPictureData("https://example.com/dummy.jpg", 100, 200) + ) + apiClient.uploadProductVariationImageAsync(uploadImageAsyncReq) + val fetchedProduct = apiClient.getProductDetails(ProductDetailsRequest(productId = newProductId)) + val variations = fetchedProduct.combinations + assertEquals(variations?.size, 1) + assertEquals(variations?.get(0)?.originalImageUrl, uploadImageAsyncReq.asyncPictureData.url) + } + } private fun generateProductSelectOption(name: String, values: List): UpdatedProduct.ProductOption {