diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt index ab3964113..8f3c2a17a 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt @@ -15,6 +15,8 @@ import com.ecwid.apiclient.v3.dto.batch.result.CancelBatchGroupResult import com.ecwid.apiclient.v3.dto.batch.result.CreateBatchResult import com.ecwid.apiclient.v3.dto.batch.result.GetEscapedBatchResult import com.ecwid.apiclient.v3.dto.batch.result.GetTypedBatchResult +import com.ecwid.apiclient.v3.dto.brand.request.BrandsSearchRequest +import com.ecwid.apiclient.v3.dto.brand.result.BrandsSearchResult import com.ecwid.apiclient.v3.dto.cart.request.* import com.ecwid.apiclient.v3.dto.cart.result.* import com.ecwid.apiclient.v3.dto.common.PartialResult @@ -26,8 +28,6 @@ import com.ecwid.apiclient.v3.dto.customergroup.request.* import com.ecwid.apiclient.v3.dto.customergroup.result.* import com.ecwid.apiclient.v3.dto.instantsite.redirects.request.* import com.ecwid.apiclient.v3.dto.instantsite.redirects.result.* -import com.ecwid.apiclient.v3.dto.order.request.* -import com.ecwid.apiclient.v3.dto.order.result.* import com.ecwid.apiclient.v3.dto.productreview.request.* import com.ecwid.apiclient.v3.dto.productreview.result.* import com.ecwid.apiclient.v3.dto.producttype.request.* @@ -55,6 +55,7 @@ import kotlin.reflect.KClass open class ApiClient private constructor( protected val apiClientHelper: ApiClientHelper, storeProfileApiClient: StoreProfileApiClient, + brandsApiClient: BrandsApiClient, productsApiClient: ProductsApiClient, categoriesApiClient: CategoriesApiClient, ordersApiClient: OrdersApiClient, @@ -76,6 +77,7 @@ open class ApiClient private constructor( storeExtrafieldsApiClient: StoreExtrafieldsApiClientImpl, ) : StoreProfileApiClient by storeProfileApiClient, + BrandsApiClient by brandsApiClient, ProductsApiClient by productsApiClient, CategoriesApiClient by categoriesApiClient, OrdersApiClient by ordersApiClient, @@ -99,6 +101,7 @@ open class ApiClient private constructor( constructor(apiClientHelper: ApiClientHelper) : this( apiClientHelper = apiClientHelper, storeProfileApiClient = StoreProfileApiClientImpl(apiClientHelper), + brandsApiClient = BrandsApiClientImpl(apiClientHelper), productsApiClient = ProductsApiClientImpl(apiClientHelper), categoriesApiClient = CategoriesApiClientImpl(apiClientHelper), ordersApiClient = OrdersApiClientImpl(apiClientHelper), @@ -315,3 +318,11 @@ interface ProductReviewsApiClient { fun massUpdateProductReview(request: ProductReviewMassUpdateRequest): ProductReviewMassUpdateResult fun getProductReviewsFiltersData(request: ProductReviewFiltersDataRequest): ProductReviewFiltersDataResult } + +// Brands +// https://api-docs.ecwid.com/reference/search-product-brands +interface BrandsApiClient { + fun searchBrands(request: BrandsSearchRequest.ByFilters): BrandsSearchResult + fun searchBrands(request: BrandsSearchRequest.ByFilters, resultClass: KClass): Result + where Result: PartialResult +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/request/BrandsSearchRequest.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/request/BrandsSearchRequest.kt new file mode 100644 index 000000000..eb6876477 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/request/BrandsSearchRequest.kt @@ -0,0 +1,49 @@ +package com.ecwid.apiclient.v3.dto.brand.request + +import com.ecwid.apiclient.v3.dto.ApiRequest +import com.ecwid.apiclient.v3.dto.common.PagingRequest +import com.ecwid.apiclient.v3.impl.RequestInfo +import com.ecwid.apiclient.v3.responsefields.ResponseFields + +sealed class BrandsSearchRequest : ApiRequest { + + data class ByFilters( + val limit: Int = 100, + override val offset: Int = 0, + val lang: String? = null, + val hiddenBrands: Boolean? = null, + val baseUrl: String? = null, + val cleanUrls: Boolean? = null, + val sortBy: SortOrder? = null, + val responseFields: ResponseFields = ResponseFields.All, + ) : BrandsSearchRequest(), PagingRequest { + override fun toRequestInfo() = RequestInfo.createGetRequest( + pathSegments = listOf( + "brands", + ), + params = toParams(), + responseFields = responseFields, + ) + + private fun toParams(): Map { + val request = this + return mutableMapOf().apply { + put("limit", request.limit.toString()) + put("offset", request.offset.toString()) + request.lang?.let { put("lang", it) } + request.hiddenBrands?.let { put("hiddenBrands", it.toString()) } + request.baseUrl?.let { put("baseUrl", it) } + request.cleanUrls?.let { put("cleanUrls", it.toString()) } + request.sortBy?.let { put("sortBy", it.name) } + }.toMap() + } + + override fun copyWithOffset(offset: Int) = copy(offset = offset) + } + + @Suppress("unused") + enum class SortOrder { + PRODUCT_COUNT_DESC, + NAME_ASC, + } +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/BrandsSearchResult.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/BrandsSearchResult.kt new file mode 100644 index 000000000..ca65cc8df --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/BrandsSearchResult.kt @@ -0,0 +1,11 @@ +package com.ecwid.apiclient.v3.dto.brand.result + +import com.ecwid.apiclient.v3.dto.common.ApiResultDTO + +data class BrandsSearchResult( + val items: List = listOf(), + val count: Int = 0, + val total: Int = 0, + val limit: Int = 0, + val offset: Int = 0 +) : ApiResultDTO diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/FetchedBrand.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/FetchedBrand.kt new file mode 100644 index 000000000..7dffff726 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/brand/result/FetchedBrand.kt @@ -0,0 +1,12 @@ +package com.ecwid.apiclient.v3.dto.brand.result + +import com.ecwid.apiclient.v3.dto.common.ApiFetchedDTO +import com.ecwid.apiclient.v3.dto.common.ApiResultDTO + +data class FetchedBrand( + val name: String = "", + val nameTranslated: Map? = null, + val productsFilteredByBrandUrl: String? = null, +): ApiFetchedDTO, ApiResultDTO { + override fun getModifyKind() = ApiFetchedDTO.ModifyKind.ReadOnly +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/impl/BrandsApiClientImpl.kt b/src/main/kotlin/com/ecwid/apiclient/v3/impl/BrandsApiClientImpl.kt new file mode 100644 index 000000000..f4bbf4079 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/impl/BrandsApiClientImpl.kt @@ -0,0 +1,26 @@ +package com.ecwid.apiclient.v3.impl + +import com.ecwid.apiclient.v3.ApiClientHelper +import com.ecwid.apiclient.v3.BrandsApiClient +import com.ecwid.apiclient.v3.dto.brand.request.BrandsSearchRequest +import com.ecwid.apiclient.v3.dto.brand.result.BrandsSearchResult +import com.ecwid.apiclient.v3.dto.common.PartialResult +import kotlin.reflect.KClass + +internal class BrandsApiClientImpl( + private val apiClientHelper: ApiClientHelper, +): BrandsApiClient { + + override fun searchBrands(request: BrandsSearchRequest.ByFilters) = + apiClientHelper.makeObjectResultRequest(request) + + override fun > searchBrands( + request: BrandsSearchRequest.ByFilters, + resultClass: KClass + ): Result { + return apiClientHelper.makeObjectPartialResultRequest( + request = request, + resultClass = resultClass, + ) + } +} diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt index e0ed2c843..f139e9d67 100644 --- a/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt @@ -200,6 +200,8 @@ val nullablePropertyRules: List> = listOf( productReviewMassUpdateRequestNullablePropertyRules, productReviewSearchRequestNullablePropertyRules, fetchedCustomersConfigNullablePropertyRules, + brandsSearchRequestNullablePropertyRules, + fetchedBrandNullablePropertyRules, ).flatten() sealed class NullablePropertyRule( diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/BrandsSearchRequestRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/BrandsSearchRequestRules.kt new file mode 100644 index 000000000..7bac458af --- /dev/null +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/BrandsSearchRequestRules.kt @@ -0,0 +1,13 @@ +package com.ecwid.apiclient.v3.rule.nullablepropertyrules + +import com.ecwid.apiclient.v3.dto.brand.request.BrandsSearchRequest +import com.ecwid.apiclient.v3.rule.NullablePropertyRule +import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable + +val brandsSearchRequestNullablePropertyRules: List> = listOf( + AllowNullable(BrandsSearchRequest.ByFilters::lang), + AllowNullable(BrandsSearchRequest.ByFilters::hiddenBrands), + AllowNullable(BrandsSearchRequest.ByFilters::baseUrl), + AllowNullable(BrandsSearchRequest.ByFilters::cleanUrls), + AllowNullable(BrandsSearchRequest.ByFilters::sortBy), +) diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/FetchedBrandRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/FetchedBrandRules.kt new file mode 100644 index 000000000..6b15f06f1 --- /dev/null +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/FetchedBrandRules.kt @@ -0,0 +1,10 @@ +package com.ecwid.apiclient.v3.rule.nullablepropertyrules + +import com.ecwid.apiclient.v3.dto.brand.result.FetchedBrand +import com.ecwid.apiclient.v3.rule.NullablePropertyRule +import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable + +val fetchedBrandNullablePropertyRules: List> = listOf( + AllowNullable(FetchedBrand::nameTranslated), + AllowNullable(FetchedBrand::productsFilteredByBrandUrl), +)