Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions config/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ complexity:
LongParameterList:
functionThreshold: 10
constructorThreshold: 15
excludes: ['**/com/ecwid/apiclient/v3/ApiClient.kt']
NestedBlockDepth:
excludes: ['**/test/**']
TooManyFunctions:
Expand Down
17 changes: 16 additions & 1 deletion src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ import com.ecwid.apiclient.v3.dto.profile.request.*
import com.ecwid.apiclient.v3.dto.profile.result.*
import com.ecwid.apiclient.v3.dto.saleschannels.request.*
import com.ecwid.apiclient.v3.dto.saleschannels.response.*
import com.ecwid.apiclient.v3.dto.storage.request.*
import com.ecwid.apiclient.v3.dto.storage.result.*
import com.ecwid.apiclient.v3.dto.variation.request.*
import com.ecwid.apiclient.v3.dto.variation.result.*
import com.ecwid.apiclient.v3.httptransport.HttpTransport
Expand All @@ -52,6 +54,7 @@ open class ApiClient private constructor(
cartsApiClient: CartsApiClient,
salesChannelsApiClient: SalesChannelsApiClient,
applicationApiClient: ApplicationApiClient,
applicationStorageApiClient: ApplicationStorageApiClient,
) :
StoreProfileApiClient by storeProfileApiClient,
ProductsApiClient by productsApiClient,
Expand All @@ -65,7 +68,8 @@ open class ApiClient private constructor(
CouponsApiClient by discountCouponsApiClient,
CartsApiClient by cartsApiClient,
SalesChannelsApiClient by salesChannelsApiClient,
ApplicationApiClient by applicationApiClient {
ApplicationApiClient by applicationApiClient,
ApplicationStorageApiClient by applicationStorageApiClient {

constructor(apiClientHelper: ApiClientHelper) : this(
apiClientHelper = apiClientHelper,
Expand All @@ -82,6 +86,7 @@ open class ApiClient private constructor(
cartsApiClient = CartsApiClientImpl(apiClientHelper),
salesChannelsApiClient = SalesChannelsApiClientImpl(apiClientHelper),
applicationApiClient = ApplicationApiClientImpl(apiClientHelper),
applicationStorageApiClient = ApplicationStorageApiClientImpl(apiClientHelper),
)

companion object {
Expand Down Expand Up @@ -290,6 +295,16 @@ interface ApplicationApiClient {
fun deleteApplication(request: ApplicationDeleteRequest): ApplicationDeleteResult
}

// Application storage
// https://developers.ecwid.com/api-documentation/app-storage
interface ApplicationStorageApiClient {
fun getStorageData(request: StorageDataRequest): FetchedStorageData
fun getAllStorageData(request: AllStorageDataRequest): AllStorageDataResult
fun createStorageData(request: StorageDataCreateRequest): StorageDataCreateResult
fun updateStorageData(request: StorageDataUpdateRequest): StorageDataUpdateResult
fun deleteStorageData(request: StorageDataDeleteRequest): StorageDataDeleteResult
}

// Starter site
// https://developers.ecwid.com/api-documentation/starter-site
// TODO
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.ecwid.apiclient.v3.converter

import com.ecwid.apiclient.v3.dto.storage.request.UpdatedStorageData
import com.ecwid.apiclient.v3.dto.storage.result.FetchedStorageData

fun FetchedStorageData.toUpdated(): UpdatedStorageData {
return UpdatedStorageData(key = key, value = value)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.impl.RequestInfo

class AllStorageDataRequest : ApiRequest {

override fun toRequestInfo() = RequestInfo.createGetRequest(
pathSegments = listOf(
"storage"
)
)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.httptransport.HttpBody
import com.ecwid.apiclient.v3.impl.MIME_TYPE_APPLICATION_JSON
import com.ecwid.apiclient.v3.impl.RequestInfo

data class StorageDataCreateRequest(
private val updatedStorageData: UpdatedStorageData = UpdatedStorageData(),
) : ApiRequest {

override fun toRequestInfo() = RequestInfo.createPostRequest(
pathSegments = listOf(
"storage",
updatedStorageData.key,
),
httpBody = HttpBody.ByteArrayBody(
bytes = updatedStorageData.value?.toByteArray() ?: ByteArray(0),
mimeType = MIME_TYPE_APPLICATION_JSON,
),
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.impl.RequestInfo

data class StorageDataDeleteRequest(
val key: String = "",
) : ApiRequest {

override fun toRequestInfo() = RequestInfo.createDeleteRequest(
pathSegments = listOf(
"storage",
key,
),
)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.impl.RequestInfo

data class StorageDataRequest(
val key: String = "",
) : ApiRequest {

override fun toRequestInfo() = RequestInfo.createGetRequest(
pathSegments = listOf(
"storage",
key
),
)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.httptransport.HttpBody
import com.ecwid.apiclient.v3.impl.MIME_TYPE_APPLICATION_JSON
import com.ecwid.apiclient.v3.impl.RequestInfo

data class StorageDataUpdateRequest(
private val updatedStorageData: UpdatedStorageData = UpdatedStorageData(),
) : ApiRequest {

override fun toRequestInfo() = RequestInfo.createPutRequest(
pathSegments = listOf(
"storage",
updatedStorageData.key,
),
httpBody = HttpBody.ByteArrayBody(
bytes = updatedStorageData.value?.toByteArray() ?: ByteArray(0),
mimeType = MIME_TYPE_APPLICATION_JSON,
),
)
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ecwid.apiclient.v3.dto.storage.request

import com.ecwid.apiclient.v3.dto.common.ApiUpdatedDTO
import com.ecwid.apiclient.v3.dto.storage.result.FetchedStorageData

data class UpdatedStorageData(
val key: String = "",
val value: String? = null,
) : ApiUpdatedDTO {

override fun getModifyKind() = ApiUpdatedDTO.ModifyKind.ReadWrite(FetchedStorageData::class)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
package com.ecwid.apiclient.v3.dto.storage.result

class AllStorageDataResult : ArrayList<FetchedStorageData>()
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.ecwid.apiclient.v3.dto.storage.result

import com.ecwid.apiclient.v3.dto.common.ApiFetchedDTO
import com.ecwid.apiclient.v3.dto.storage.request.UpdatedStorageData

data class FetchedStorageData(
val key: String = "",
val value: String? = null,
) : ApiFetchedDTO {

override fun getModifyKind() = ApiFetchedDTO.ModifyKind.ReadWrite(UpdatedStorageData::class)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ecwid.apiclient.v3.dto.storage.result

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

data class StorageDataCreateResult(
val updateCount: Int = 0,
) : ApiResultDTO
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ecwid.apiclient.v3.dto.storage.result

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

data class StorageDataDeleteResult(
val deleteCount: Int = 0,
) : ApiResultDTO
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ecwid.apiclient.v3.dto.storage.result

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

data class StorageDataUpdateResult(
val updateCount: Int = 0,
) : ApiResultDTO
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.ecwid.apiclient.v3.impl

import com.ecwid.apiclient.v3.ApiClientHelper
import com.ecwid.apiclient.v3.ApplicationStorageApiClient
import com.ecwid.apiclient.v3.dto.storage.request.*
import com.ecwid.apiclient.v3.dto.storage.result.*

internal class ApplicationStorageApiClientImpl(
private val apiClientHelper: ApiClientHelper,
) : ApplicationStorageApiClient {

override fun getStorageData(request: StorageDataRequest) =
apiClientHelper.makeObjectResultRequest<FetchedStorageData>(request)

override fun getAllStorageData(request: AllStorageDataRequest) =
apiClientHelper.makeObjectResultRequest<AllStorageDataResult>(request)

override fun createStorageData(request: StorageDataCreateRequest) =
apiClientHelper.makeObjectResultRequest<StorageDataCreateResult>(request)

override fun updateStorageData(request: StorageDataUpdateRequest) =
apiClientHelper.makeObjectResultRequest<StorageDataUpdateResult>(request)

override fun deleteStorageData(request: StorageDataDeleteRequest) =
apiClientHelper.makeObjectResultRequest<StorageDataDeleteResult>(request)

}
93 changes: 93 additions & 0 deletions src/test/kotlin/com/ecwid/apiclient/v3/entity/StorageTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package com.ecwid.apiclient.v3.entity

import com.ecwid.apiclient.v3.converter.toUpdated
import com.ecwid.apiclient.v3.dto.storage.request.*
import com.ecwid.apiclient.v3.jsontransformer.gson.GsonTransformer
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test

class StorageTest : BaseEntityTest() {

@BeforeEach
override fun beforeEach() {
super.beforeEach()
}

@Test
fun testStorageApiSingleItemOperations() {
val createApiData = StorageApiData(123, "test")
val key = "key"
val createValue = createApiData.toJson()
val createStorageData = UpdatedStorageData(key = key, value = createValue)
val createRequest = StorageDataCreateRequest(createStorageData)
val createResult = apiClient.createStorageData(createRequest)
assertEquals(1, createResult.updateCount)

val createdDataRequest = StorageDataRequest(key)
val createdDataResult = apiClient.getStorageData(createdDataRequest)
assertEquals(createStorageData, createdDataResult.toUpdated())

val createdData = createdDataResult.value?.let { StorageApiData.fromJson(it) }
assertEquals(createApiData, createdData)

val updatedStorageData = UpdatedStorageData(key = key, value = null)
val updateRequest = StorageDataUpdateRequest(updatedStorageData)
val updateResult = apiClient.updateStorageData(updateRequest)
assertEquals(1, updateResult.updateCount)

val updatedDataRequest = StorageDataRequest(key)
val updatedDataResult = apiClient.getStorageData(updatedDataRequest)
assertTrue(updatedDataResult.value.isNullOrEmpty())

val deleteRequest = StorageDataDeleteRequest(key)
val deleteResult = apiClient.deleteStorageData(deleteRequest)
assertEquals(1, deleteResult.deleteCount)
}

@Test
fun testStorageApiMultipleItemsCreation() {
val updatedEntities = listOf(
UpdatedStorageData(key = "key1", value = StorageApiData(123, "test1").toJson()),
UpdatedStorageData(key = "key2", value = StorageApiData(456, "test2").toJson()),
)

updatedEntities.forEach { entity ->
val updateRequest = StorageDataUpdateRequest(entity)
val updateResult = apiClient.updateStorageData(updateRequest)
assertEquals(1, updateResult.updateCount)
}

val storageEntitiesRequest = AllStorageDataRequest()
val storageEntitiesResult = apiClient.getAllStorageData(storageEntitiesRequest)
storageEntitiesResult.forEach { fetchedEntity ->
val updatedEntity = updatedEntities.find { it.key == fetchedEntity.key }
assertNotNull(updatedEntity)
assertEquals(updatedEntity, fetchedEntity.toUpdated())
}

updatedEntities.forEach { entity ->
val deleteRequest = StorageDataDeleteRequest(entity.key)
val deleteResult = apiClient.deleteStorageData(deleteRequest)
assertEquals(1, deleteResult.deleteCount)
}
}

private data class StorageApiData(
val number: Int = 0,
val string: String = "",
) {
fun toJson(): String {
return transformer.serialize(this, null)
}

companion object {
private val transformer = GsonTransformer(emptyList())

fun fromJson(json: String): StorageApiData? {
return transformer.deserialize(json, StorageApiData::class.java)
}
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.ecwid.apiclient.v3.dto.coupon.request.UpdatedCoupon
import com.ecwid.apiclient.v3.dto.customer.request.UpdatedCustomer
import com.ecwid.apiclient.v3.dto.customergroup.request.UpdatedCustomerGroup
import com.ecwid.apiclient.v3.dto.product.request.UpdatedProduct
import com.ecwid.apiclient.v3.dto.storage.request.UpdatedStorageData
import com.ecwid.apiclient.v3.dto.variation.request.UpdatedVariation
import com.ecwid.apiclient.v3.rule.NonnullPropertyRule.AllowNonnull
import com.ecwid.apiclient.v3.rule.NonnullPropertyRule.IgnoreNonnull
Expand All @@ -22,6 +23,8 @@ val nonnullPropertyRules: List<NonnullPropertyRule<*, *>> = listOf(
AllowNonnull(UpdatedProduct.ProductOption.TextAreaOption::required),
AllowNonnull(UpdatedProduct.ProductOption.TextFieldOption::required),
AllowNonnull(UpdatedProduct.CustomPriceTier::value),
AllowNonnull(UpdatedStorageData::key),
AllowNonnull(UpdatedStorageData::value),

IgnoreNonnull(UpdatedCoupon::code),
IgnoreNonnull(UpdatedCoupon::name),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable
import com.ecwid.apiclient.v3.rule.NullablePropertyRule.IgnoreNullable
import com.ecwid.apiclient.v3.rule.nullablepropertyrules.*
import com.ecwid.apiclient.v3.dto.product.result.FetchedProduct
import com.ecwid.apiclient.v3.dto.storage.result.FetchedStorageData
import kotlin.reflect.KProperty1

val otherNullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
Expand Down Expand Up @@ -57,8 +58,9 @@ val otherNullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
AllowNullable(PaymentAppRequest::storeId),
AllowNullable(PaymentAppRequest::token),

IgnoreNullable(ProductInventoryUpdateResult::warning)
IgnoreNullable(ProductInventoryUpdateResult::warning),

AllowNullable(FetchedStorageData::value),
)

val nullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
Expand Down