diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt index 7d99d8c7c..63dd13cf2 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt @@ -299,9 +299,11 @@ interface SlugInfoApiClient { // Product reviews interface ProductReviewsApiClient { - fun searchProductReviews(request: ProductReviewsSearchRequest): ProductReviewSearchResult - fun searchProductReviewsAsSequence(request: ProductReviewsSearchRequest): Sequence + fun searchProductReviews(request: ProductReviewSearchRequest): ProductReviewSearchResult + fun searchProductReviewsAsSequence(request: ProductReviewSearchRequest): Sequence fun getProductReviewDetails(request: ProductReviewDetailsRequest): FetchedProductReview fun updateProductReviewStatus(request: ProductReviewUpdateStatusRequest): ProductReviewUpdateStatusResult fun deleteProductReview(request: ProductReviewDeleteRequest): ProductReviewDeleteResult + fun massUpdateProductReview(request: ProductReviewMassUpdateRequest): ProductReviewMassUpdateResult + fun getProductReviewsFiltersData(request: ProductReviewFiltersDataRequest): ProductReviewFiltersDataResult } diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/enums/ProductReviewSelectMode.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/enums/ProductReviewSelectMode.kt new file mode 100644 index 000000000..4d1cf978e --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/enums/ProductReviewSelectMode.kt @@ -0,0 +1,7 @@ +package com.ecwid.apiclient.v3.dto.productreview.enums + +enum class ProductReviewSelectMode { + SELECTED, + ALL_FILTERED, + ALL, +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewFiltersDataRequest.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewFiltersDataRequest.kt new file mode 100644 index 000000000..dc1b01dcc --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewFiltersDataRequest.kt @@ -0,0 +1,17 @@ +package com.ecwid.apiclient.v3.dto.productreview.request + +import com.ecwid.apiclient.v3.dto.ApiRequest +import com.ecwid.apiclient.v3.impl.RequestInfo +import com.ecwid.apiclient.v3.responsefields.ResponseFields + +data class ProductReviewFiltersDataRequest( + val responseFields: ResponseFields = ResponseFields.All, +) : ApiRequest { + override fun toRequestInfo() = RequestInfo.createGetRequest( + pathSegments = listOf( + "reviews", + "filters_data", + ), + responseFields = responseFields, + ) +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdate.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdate.kt new file mode 100644 index 000000000..8012f8ad9 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdate.kt @@ -0,0 +1,26 @@ +package com.ecwid.apiclient.v3.dto.productreview.request + +import com.ecwid.apiclient.v3.dto.common.ApiRequestDTO +import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewSelectMode +import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewStatus +import java.time.Instant + +data class ProductReviewMassUpdate( + val reviewIds: List? = null, + val selectMode: ProductReviewSelectMode? = null, + val delete: Boolean = false, + val newStatus: ProductReviewStatus? = null, + val filters: Filters? = null, +) : ApiRequestDTO { + + data class Filters( + val reviewId: String? = null, + val productId: String? = null, + val orderId: String? = null, + val status: ProductReviewStatus? = null, + val rating: Int? = null, + val createdFrom: Instant? = null, + val createdTo: Instant? = null, + val searchKeyword: String? = null, + ) +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdateRequest.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdateRequest.kt new file mode 100644 index 000000000..993d26159 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewMassUpdateRequest.kt @@ -0,0 +1,20 @@ +package com.ecwid.apiclient.v3.dto.productreview.request + +import com.ecwid.apiclient.v3.dto.ApiRequest +import com.ecwid.apiclient.v3.httptransport.HttpBody +import com.ecwid.apiclient.v3.impl.RequestInfo + +data class ProductReviewMassUpdateRequest( + val updateInfo: ProductReviewMassUpdate = ProductReviewMassUpdate(), +) : ApiRequest { + override fun toRequestInfo() = RequestInfo.createPutRequest( + pathSegments = listOf( + "reviews", + "mass_update", + ), + params = mapOf(), + httpBody = HttpBody.JsonBody( + obj = updateInfo + ) + ) +} diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewsSearchRequest.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewSearchRequest.kt similarity index 91% rename from src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewsSearchRequest.kt rename to src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewSearchRequest.kt index 823d56aa1..9082bbbd5 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewsSearchRequest.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/request/ProductReviewSearchRequest.kt @@ -9,7 +9,7 @@ import com.ecwid.apiclient.v3.responsefields.ResponseFields import java.time.Instant import java.util.concurrent.TimeUnit -data class ProductReviewsSearchRequest( +data class ProductReviewSearchRequest( val reviewId: String? = null, val productId: String? = null, val orderId: String? = null, @@ -19,11 +19,12 @@ data class ProductReviewsSearchRequest( val createdTo: Instant? = null, val updatedFrom: Instant? = null, val updatedTo: Instant? = null, + val searchKeyword: String? = null, val sortBy: ProductReviewSortOrder? = null, val limit: Int = 100, override val offset: Int = 0, val responseFields: ResponseFields = ResponseFields.All, -) : ApiRequest, PagingRequest { +) : ApiRequest, PagingRequest { override fun toRequestInfo() = RequestInfo.createGetRequest( pathSegments = listOf( "reviews" @@ -44,6 +45,7 @@ data class ProductReviewsSearchRequest( request.createdTo?.let { put("createdTo", TimeUnit.MILLISECONDS.toSeconds(it.toEpochMilli()).toString()) } request.updatedFrom?.let { put("updatedFrom", TimeUnit.MILLISECONDS.toSeconds(it.toEpochMilli()).toString()) } request.updatedTo?.let { put("updatedTo", TimeUnit.MILLISECONDS.toSeconds(it.toEpochMilli()).toString()) } + request.searchKeyword?.let { put("searchKeyword", it) } request.sortBy?.let { put("sortBy", it.name) } put("offset", request.offset.toString()) put("limit", request.limit.toString()) diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewFiltersDataResult.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewFiltersDataResult.kt new file mode 100644 index 000000000..35b57e172 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewFiltersDataResult.kt @@ -0,0 +1,9 @@ +package com.ecwid.apiclient.v3.dto.productreview.result + +import com.ecwid.apiclient.v3.dto.common.ApiResultDTO + +data class ProductReviewFiltersDataResult( + val allCount: Int = 0, + val moderatedCount: Int = 0, + val publishedCount: Int = 0, +) : ApiResultDTO diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewMassUpdateResult.kt b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewMassUpdateResult.kt new file mode 100644 index 000000000..9a2812c12 --- /dev/null +++ b/src/main/kotlin/com/ecwid/apiclient/v3/dto/productreview/result/ProductReviewMassUpdateResult.kt @@ -0,0 +1,7 @@ +package com.ecwid.apiclient.v3.dto.productreview.result + +import com.ecwid.apiclient.v3.dto.common.ApiResultDTO + +data class ProductReviewMassUpdateResult( + val updateCount: Int = 0 +) : ApiResultDTO diff --git a/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductReviewsApiClientImpl.kt b/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductReviewsApiClientImpl.kt index 6adfe41e4..fbae60fc5 100644 --- a/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductReviewsApiClientImpl.kt +++ b/src/main/kotlin/com/ecwid/apiclient/v3/impl/ProductReviewsApiClientImpl.kt @@ -8,10 +8,10 @@ import com.ecwid.apiclient.v3.dto.productreview.result.* class ProductReviewsApiClientImpl( private val apiClientHelper: ApiClientHelper, ) : ProductReviewsApiClient { - override fun searchProductReviews(request: ProductReviewsSearchRequest) = + override fun searchProductReviews(request: ProductReviewSearchRequest) = apiClientHelper.makeObjectResultRequest(request) - override fun searchProductReviewsAsSequence(request: ProductReviewsSearchRequest) = + override fun searchProductReviewsAsSequence(request: ProductReviewSearchRequest) = apiClientHelper.makeObjectResultRequest>(request) override fun getProductReviewDetails(request: ProductReviewDetailsRequest) = @@ -22,4 +22,11 @@ class ProductReviewsApiClientImpl( override fun deleteProductReview(request: ProductReviewDeleteRequest) = apiClientHelper.makeObjectResultRequest(request) + + override fun massUpdateProductReview(request: ProductReviewMassUpdateRequest) = + apiClientHelper.makeObjectResultRequest(request) + + override fun getProductReviewsFiltersData(request: ProductReviewFiltersDataRequest) = + apiClientHelper.makeObjectResultRequest(request) + } 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 2e492ab2c..b424d8990 100644 --- a/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/NullablePropertyRules.kt @@ -164,7 +164,8 @@ val nullablePropertyRules: List> = listOf( fetchedSlugInfoClassesNullablePropertyRules, slugInfoRequestNullablePropertyRules, fetchedProductReviewNullablePropertyRules, - productReviewsSearchRequestNullablePropertyRules, + productReviewMassUpdateRequestNullablePropertyRules, + productReviewSearchRequestNullablePropertyRules, ).flatten() sealed class NullablePropertyRule( diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewMassUpdateRequestRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewMassUpdateRequestRules.kt new file mode 100644 index 000000000..9e5c87ea4 --- /dev/null +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewMassUpdateRequestRules.kt @@ -0,0 +1,20 @@ +package com.ecwid.apiclient.v3.rule.nullablepropertyrules + +import com.ecwid.apiclient.v3.dto.productreview.request.ProductReviewMassUpdate +import com.ecwid.apiclient.v3.rule.NullablePropertyRule +import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable + +val productReviewMassUpdateRequestNullablePropertyRules: List> = listOf( + AllowNullable(ProductReviewMassUpdate.Filters::createdFrom), + AllowNullable(ProductReviewMassUpdate.Filters::createdTo), + AllowNullable(ProductReviewMassUpdate.Filters::orderId), + AllowNullable(ProductReviewMassUpdate.Filters::productId), + AllowNullable(ProductReviewMassUpdate.Filters::rating), + AllowNullable(ProductReviewMassUpdate.Filters::reviewId), + AllowNullable(ProductReviewMassUpdate.Filters::searchKeyword), + AllowNullable(ProductReviewMassUpdate.Filters::status), + AllowNullable(ProductReviewMassUpdate::filters), + AllowNullable(ProductReviewMassUpdate::newStatus), + AllowNullable(ProductReviewMassUpdate::reviewIds), + AllowNullable(ProductReviewMassUpdate::selectMode), +) diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewSearchRequestRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewSearchRequestRules.kt new file mode 100644 index 000000000..08e2c79a9 --- /dev/null +++ b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewSearchRequestRules.kt @@ -0,0 +1,19 @@ +package com.ecwid.apiclient.v3.rule.nullablepropertyrules + +import com.ecwid.apiclient.v3.dto.productreview.request.ProductReviewSearchRequest +import com.ecwid.apiclient.v3.rule.NullablePropertyRule +import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable + +val productReviewSearchRequestNullablePropertyRules: List> = listOf( + AllowNullable(ProductReviewSearchRequest::createdFrom), + AllowNullable(ProductReviewSearchRequest::createdTo), + AllowNullable(ProductReviewSearchRequest::orderId), + AllowNullable(ProductReviewSearchRequest::productId), + AllowNullable(ProductReviewSearchRequest::rating), + AllowNullable(ProductReviewSearchRequest::reviewId), + AllowNullable(ProductReviewSearchRequest::searchKeyword), + AllowNullable(ProductReviewSearchRequest::sortBy), + AllowNullable(ProductReviewSearchRequest::status), + AllowNullable(ProductReviewSearchRequest::updatedFrom), + AllowNullable(ProductReviewSearchRequest::updatedTo), +) diff --git a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewsSearchRequestRules.kt b/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewsSearchRequestRules.kt deleted file mode 100644 index 1fd1c77eb..000000000 --- a/src/test/kotlin/com/ecwid/apiclient/v3/rule/nullablepropertyrules/ProductReviewsSearchRequestRules.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.ecwid.apiclient.v3.rule.nullablepropertyrules - -import com.ecwid.apiclient.v3.dto.productreview.request.ProductReviewsSearchRequest -import com.ecwid.apiclient.v3.rule.NullablePropertyRule -import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable - -val productReviewsSearchRequestNullablePropertyRules: List> = listOf( - AllowNullable(ProductReviewsSearchRequest::createdFrom), - AllowNullable(ProductReviewsSearchRequest::createdTo), - AllowNullable(ProductReviewsSearchRequest::orderId), - AllowNullable(ProductReviewsSearchRequest::productId), - AllowNullable(ProductReviewsSearchRequest::rating), - AllowNullable(ProductReviewsSearchRequest::reviewId), - AllowNullable(ProductReviewsSearchRequest::sortBy), - AllowNullable(ProductReviewsSearchRequest::status), - AllowNullable(ProductReviewsSearchRequest::updatedFrom), - AllowNullable(ProductReviewsSearchRequest::updatedTo), -)