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
16 changes: 15 additions & 1 deletion src/main/kotlin/com/ecwid/apiclient/v3/ApiClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ 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.*
import com.ecwid.apiclient.v3.dto.producttype.result.*
import com.ecwid.apiclient.v3.dto.report.request.ReportRequest
Expand Down Expand Up @@ -64,6 +66,7 @@ open class ApiClient private constructor(
subscriptionsApiClient: SubscriptionsApiClientImpl,
instantSiteRedirectsApiClient: InstantSiteRedirectsApiClientImpl,
slugInfoApiClient: SlugInfoApiClientImpl,
productReviewsApiClient: ProductReviewsApiClientImpl,
) :
StoreProfileApiClient by storeProfileApiClient,
ProductsApiClient by productsApiClient,
Expand All @@ -82,7 +85,8 @@ open class ApiClient private constructor(
ReportsApiClient by reportsApiClient,
SubscriptionsApiClient by subscriptionsApiClient,
InstantSiteRedirectsApiClient by instantSiteRedirectsApiClient,
SlugInfoApiClient by slugInfoApiClient {
SlugInfoApiClient by slugInfoApiClient,
ProductReviewsApiClient by productReviewsApiClient {

constructor(apiClientHelper: ApiClientHelper) : this(
apiClientHelper = apiClientHelper,
Expand All @@ -104,6 +108,7 @@ open class ApiClient private constructor(
subscriptionsApiClient = SubscriptionsApiClientImpl(apiClientHelper),
instantSiteRedirectsApiClient = InstantSiteRedirectsApiClientImpl(apiClientHelper),
slugInfoApiClient = SlugInfoApiClientImpl(apiClientHelper),
productReviewsApiClient = ProductReviewsApiClientImpl(apiClientHelper),
)

companion object {
Expand Down Expand Up @@ -291,3 +296,12 @@ interface InstantSiteRedirectsApiClient {
interface SlugInfoApiClient {
fun getSlugInfo(request: SlugInfoRequest): FetchedSlugInfo
}

// Product reviews
interface ProductReviewsApiClient {
fun searchProductReviews(request: ProductReviewsSearchRequest): ProductReviewSearchResult
fun searchProductReviewsAsSequence(request: ProductReviewsSearchRequest): Sequence<FetchedProductReview>
fun getProductReviewDetails(request: ProductReviewDetailsRequest): FetchedProductReview
fun updateProductReviewStatus(request: ProductReviewUpdateStatusRequest): ProductReviewUpdateStatusResult
fun deleteProductReview(request: ProductReviewDeleteRequest): ProductReviewDeleteResult
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ecwid.apiclient.v3.dto.productreview.enums

@Suppress("unused")
enum class ProductReviewSortOrder {
DATE_CREATED_ASC,
DATE_CREATED_DESC,
RATING_ASC,
RATING_DESC,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ecwid.apiclient.v3.dto.productreview.enums

@Suppress("unused")
enum class ProductReviewStatus {
MODERATED,
PUBLISHED,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.ecwid.apiclient.v3.dto.productreview.request

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

data class ProductReviewDeleteRequest(
val reviewId: Int = 0
) : ApiRequest {
override fun toRequestInfo() = RequestInfo.createDeleteRequest(
pathSegments = listOf(
"reviews",
"$reviewId"
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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 ProductReviewDetailsRequest(
val reviewId: Int = 0,
val responseFields: ResponseFields = ResponseFields.All,
) : ApiRequest {
override fun toRequestInfo() = RequestInfo.createGetRequest(
pathSegments = listOf(
"reviews",
"$reviewId"
),
responseFields = responseFields,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
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 ProductReviewUpdateStatusRequest(
val reviewId: Int = 0,
val status: UpdatedProductReviewStatus = UpdatedProductReviewStatus(),
) : ApiRequest {
override fun toRequestInfo() = RequestInfo.createPutRequest(
pathSegments = listOf(
"reviews",
"$reviewId",
),
params = mapOf(),
httpBody = HttpBody.JsonBody(
obj = status
)
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.ecwid.apiclient.v3.dto.productreview.request

import com.ecwid.apiclient.v3.dto.ApiRequest
import com.ecwid.apiclient.v3.dto.common.PagingRequest
import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewSortOrder
import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewStatus
import com.ecwid.apiclient.v3.impl.RequestInfo
import com.ecwid.apiclient.v3.responsefields.ResponseFields
import java.time.Instant

data class ProductReviewsSearchRequest(
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 updatedFrom: Instant? = null,
val updatedTo: Instant? = null,
val sortBy: ProductReviewSortOrder? = null,
val limit: Int = 100,
override val offset: Int = 0,
val responseFields: ResponseFields = ResponseFields.All,
) : ApiRequest, PagingRequest<ProductReviewsSearchRequest> {
override fun toRequestInfo() = RequestInfo.createGetRequest(
pathSegments = listOf(
"reviews"
),
params = toParams(),
responseFields = responseFields,
)

private fun toParams(): Map<String, String> {
val request = this
return mutableMapOf<String, String>().apply {
request.reviewId?.let { put("reviewId", it) }
request.productId?.let { put("productId", it) }
request.orderId?.let { put("orderId", it) }
request.status?.let { put("status", it.toString()) }
request.rating?.let { put("rating", it.toString()) }
request.createdFrom?.let { put("createdFrom", it.toString()) }
request.createdTo?.let { put("createdTo", it.toString()) }
request.updatedFrom?.let { put("updatedFrom", it.toString()) }
request.updatedTo?.let { put("updatedTo", it.toString()) }
request.sortBy?.let { put("sortBy", it.name) }
put("offset", request.offset.toString())
put("limit", request.limit.toString())
}.toMap()
}

override fun copyWithOffset(offset: Int) = copy(offset = offset)

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

import com.ecwid.apiclient.v3.dto.common.ApiRequestDTO
import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewStatus

data class UpdatedProductReviewStatus(
val status: ProductReviewStatus? = null
) : ApiRequestDTO
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.ecwid.apiclient.v3.dto.productreview.result

import com.ecwid.apiclient.v3.dto.common.ApiFetchedDTO
import com.ecwid.apiclient.v3.dto.common.ApiResultDTO
import com.ecwid.apiclient.v3.dto.productreview.enums.ProductReviewStatus
import java.util.*

data class FetchedProductReview(
val id: Long? = null,
val productId: Long? = null,
val productName: String? = null,
val customerId: Long? = null,
val orderId: Long? = null,
val orderNumber: String? = null,
val orderItemId: Long? = null,
val status: ProductReviewStatus? = null,
val rating: Int? = null,
val review: String? = null,
val reviewerInfo: FetchedProductReviewerInfo? = null,
val createDate: Date? = null,
val updateDate: Date? = null,
val createTimestamp: Long? = null,
val updateTimestamp: Long? = null,
) : ApiFetchedDTO, ApiResultDTO {

override fun getModifyKind() =
ApiFetchedDTO.ModifyKind.ReadOnly

data class FetchedProductReviewerInfo(
val name: String? = null,
val email: String? = null,
val city: String? = null,
val country: String? = null,
val ordersCount: Int? = null,
)

}

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

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

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

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

data class ProductReviewSearchResult(
val items: List<FetchedProductReview> = listOf(),
val count: Int = 0,
val total: Int = 0,
val limit: Int = 0,
val offset: Int = 0,
) : ApiResultDTO
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.ecwid.apiclient.v3.dto.productreview.result

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

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

import com.ecwid.apiclient.v3.ApiClientHelper
import com.ecwid.apiclient.v3.ProductReviewsApiClient
import com.ecwid.apiclient.v3.dto.productreview.request.*
import com.ecwid.apiclient.v3.dto.productreview.result.*

class ProductReviewsApiClientImpl(
private val apiClientHelper: ApiClientHelper,
) : ProductReviewsApiClient {
override fun searchProductReviews(request: ProductReviewsSearchRequest) =
apiClientHelper.makeObjectResultRequest<ProductReviewSearchResult>(request)

override fun searchProductReviewsAsSequence(request: ProductReviewsSearchRequest) =
apiClientHelper.makeObjectResultRequest<Sequence<FetchedProductReview>>(request)

override fun getProductReviewDetails(request: ProductReviewDetailsRequest) =
apiClientHelper.makeObjectResultRequest<FetchedProductReview>(request)

override fun updateProductReviewStatus(request: ProductReviewUpdateStatusRequest) =
apiClientHelper.makeObjectResultRequest<ProductReviewUpdateStatusResult>(request)

override fun deleteProductReview(request: ProductReviewDeleteRequest) =
apiClientHelper.makeObjectResultRequest<ProductReviewDeleteResult>(request)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import com.ecwid.apiclient.v3.dto.product.request.ProductInventoryUpdateRequest
import com.ecwid.apiclient.v3.dto.product.request.ProductUpdateRequest
import com.ecwid.apiclient.v3.dto.product.result.GetProductFiltersResult
import com.ecwid.apiclient.v3.dto.product.result.ProductInventoryUpdateResult
import com.ecwid.apiclient.v3.dto.productreview.request.UpdatedProductReviewStatus
import com.ecwid.apiclient.v3.dto.profile.request.StoreProfileRequest
import com.ecwid.apiclient.v3.dto.profile.result.FetchedLatestStats
import com.ecwid.apiclient.v3.dto.report.request.ReportRequest
Expand Down Expand Up @@ -101,6 +102,8 @@ val otherNullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
AllowNullable(InstantSiteRedirectsSearchRequest::offset),

AllowNullable(InstantSiteRedirectsGetForExactPathRequest::exactPath),

AllowNullable(UpdatedProductReviewStatus::status),
)

val nullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
Expand Down Expand Up @@ -138,7 +141,9 @@ val nullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
otherNullablePropertyRules,
fetchedSlugInfoNullablePropertyRules,
fetchedSlugInfoClassesNullablePropertyRules,
slugInfoRequestNullablePropertyRules
slugInfoRequestNullablePropertyRules,
fetchedProductReviewNullablePropertyRules,
productReviewsSearchRequestNullablePropertyRules,
).flatten()

sealed class NullablePropertyRule<T, R>(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.ecwid.apiclient.v3.rule.nullablepropertyrules

import com.ecwid.apiclient.v3.dto.productreview.result.FetchedProductReview
import com.ecwid.apiclient.v3.rule.NullablePropertyRule
import com.ecwid.apiclient.v3.rule.NullablePropertyRule.AllowNullable

val fetchedProductReviewNullablePropertyRules: List<NullablePropertyRule<*, *>> = listOf(
AllowNullable(FetchedProductReview::createDate),
AllowNullable(FetchedProductReview::createTimestamp),
AllowNullable(FetchedProductReview::customerId),
AllowNullable(FetchedProductReview::id),
AllowNullable(FetchedProductReview::orderId),
AllowNullable(FetchedProductReview::orderItemId),
AllowNullable(FetchedProductReview::orderNumber),
AllowNullable(FetchedProductReview::productId),
AllowNullable(FetchedProductReview::productName),
AllowNullable(FetchedProductReview::rating),
AllowNullable(FetchedProductReview::review),
AllowNullable(FetchedProductReview::reviewerInfo),
AllowNullable(FetchedProductReview::status),
AllowNullable(FetchedProductReview::updateDate),
AllowNullable(FetchedProductReview::updateTimestamp),
AllowNullable(FetchedProductReview.FetchedProductReviewerInfo::city),
AllowNullable(FetchedProductReview.FetchedProductReviewerInfo::country),
AllowNullable(FetchedProductReview.FetchedProductReviewerInfo::email),
AllowNullable(FetchedProductReview.FetchedProductReviewerInfo::name),
AllowNullable(FetchedProductReview.FetchedProductReviewerInfo::ordersCount),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
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<NullablePropertyRule<*, *>> = 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),
)