Skip to content
1 change: 1 addition & 0 deletions src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.ecwid.apiclient.v3.dto.variation.result

import com.ecwid.apiclient.v3.dto.common.ApiResultDTO

class ProductVariationImageAsyncUploadResult : ApiResultDTO
Original file line number Diff line number Diff line change
Expand Up @@ -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.*

Expand All @@ -14,6 +16,9 @@ internal class ProductVariationsApiClientImpl(
override fun uploadVariationImage(request: ProductVariationImageUploadRequest) =
apiClientHelper.makeObjectResultRequest<ProductVariationImageUploadResult>(request)

override fun uploadProductVariationImageAsync(request: ProductVariationImageAsyncUploadRequest) =
apiClientHelper.makeObjectResultRequest<ProductVariationImageAsyncUploadResult>(request)

override fun deleteVariationImage(request: ProductVariationImageDeleteRequest) =
apiClientHelper.makeObjectResultRequest<ProductVariationImageDeleteResult>(request)

Expand Down
41 changes: 41 additions & 0 deletions src/test/kotlin/com/ecwid/apiclient/v3/entity/VariationsTest.kt
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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<String>): UpdatedProduct.ProductOption {
Expand Down