Skip to content

Commit 941ac5b

Browse files
authored
Migrate NewDomainsSearchRepository from FluxC to wordpress-rs (#22891)
* Migrate `NewDomainsSearchRepository` from FluxC to wordpress-rs Replace FluxC's `ProductsStore` + dispatcher-based domain suggestions with direct wordpress-rs API calls: - Fetch domain suggestions via `WpComApiClient.domains().suggestions()` - Fetch products via `WpComApiClient.products().list()` for sale pricing - Match suggestions to products by `productId` to get server-formatted `combinedSaleCostDisplay` (1:1 with trunk's behavior) - Remove `SuggestedDomainsFetcher` (FluxC dispatcher wrapper) * Add checkstyle suppression for API param names and test for products fetch failure
1 parent 14a65bc commit 941ac5b

3 files changed

Lines changed: 293 additions & 278 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -1,66 +1,87 @@
11
package org.wordpress.android.ui.domains.management.newdomainsearch.domainsfetcher
22

3-
import org.wordpress.android.Constants
4-
import org.wordpress.android.fluxc.generated.SiteActionBuilder
5-
import org.wordpress.android.fluxc.model.products.Product
6-
import org.wordpress.android.fluxc.store.ProductsStore
7-
import org.wordpress.android.fluxc.store.SiteStore
8-
import org.wordpress.android.fluxc.store.SiteStore.OnSuggestedDomains
3+
import org.wordpress.android.fluxc.store.AccountStore
4+
import org.wordpress.android.networking.restapi.WpComApiClientProvider
5+
import rs.wordpress.api.kotlin.WpComApiClient
6+
import rs.wordpress.api.kotlin.WpRequestResult
7+
import uniffi.wp_api.DomainSuggestion
8+
import uniffi.wp_api.DomainSuggestionsParams
9+
import uniffi.wp_api.Product
10+
import uniffi.wp_api.ProductTypeFilter
11+
import uniffi.wp_api.ProductsParams
912
import javax.inject.Inject
1013

11-
private const val SUGGESTIONS_REQUEST_COUNT = 20
14+
private const val SUGGESTIONS_REQUEST_COUNT = 20u
1215

1316
class NewDomainsSearchRepository @Inject constructor(
14-
private val productsStore: ProductsStore,
15-
private val suggestedDomainsFetcher: SuggestedDomainsFetcher
17+
private val wpComApiClientProvider: WpComApiClientProvider,
18+
private val accountStore: AccountStore,
1619
) {
17-
var products: List<Product>? = null
20+
private var wpComApiClient: WpComApiClient? = null
21+
private var products: List<Product>? = null
22+
23+
@Synchronized
24+
private fun getOrCreateClient(): WpComApiClient {
25+
val token = requireNotNull(accountStore.accessToken) {
26+
"WP.com access token is required"
27+
}
28+
return wpComApiClient
29+
?: wpComApiClientProvider.getWpComApiClient(token)
30+
.also { wpComApiClient = it }
31+
}
1832

1933
suspend fun searchForDomains(query: String): DomainsResult {
2034
if (products == null) fetchProducts()
21-
return SiteActionBuilder.newSuggestDomainsAction(
22-
SiteStore.SuggestDomainsPayload(
23-
query = query,
24-
onlyWordpressCom = false,
25-
includeWordpressCom = false,
26-
includeDotBlogSubdomain = false,
27-
quantity = SUGGESTIONS_REQUEST_COUNT
28-
)
29-
).let { action ->
30-
suggestedDomainsFetcher.fetch(action)
31-
}.let { event ->
32-
onDomainSuggestionsFetched(query, event)
35+
36+
val params = DomainSuggestionsParams(
37+
query = query,
38+
quantity = SUGGESTIONS_REQUEST_COUNT,
39+
onlyWordpressdotcom = false, // checkstyle ignore
40+
includeWordpressdotcom = false, // checkstyle ignore
41+
includeDotblogsubdomain = false,
42+
)
43+
44+
return when (
45+
val result = getOrCreateClient()
46+
.request { it.domains().suggestions(params).data }
47+
) {
48+
is WpRequestResult.Success -> {
49+
val suggestions = result.response
50+
.filterIsInstance<DomainSuggestion.Paid>()
51+
.sortedByDescending { it.v1.relevance }
52+
.map { paid ->
53+
val product = products?.firstOrNull {
54+
it.productId == paid.v1.productId
55+
}
56+
ProposedDomain(
57+
productId = paid.v1.productId.toInt(),
58+
domain = paid.v1.domainName,
59+
price = paid.v1.cost,
60+
salePrice = product?.combinedSaleCostDisplay,
61+
supportsPrivacy = paid.v1.supportsPrivacy,
62+
)
63+
}
64+
DomainsResult.Success(suggestions)
65+
}
66+
else -> DomainsResult.Error
3367
}
3468
}
3569

3670
private suspend fun fetchProducts() {
37-
val result = productsStore.fetchProducts(Constants.TYPE_DOMAINS_PRODUCT)
38-
if (!result.isError) result.products?.let { products = it }
39-
}
40-
41-
private fun onDomainSuggestionsFetched(query: String, event: OnSuggestedDomains): DomainsResult {
42-
return if (query == event.query && !event.isError) {
43-
val suggestions = event.suggestions
44-
.filter { !it.is_free }
45-
.sortedByDescending { it.relevance }
46-
.map { domain ->
47-
val product = products?.firstOrNull { product -> product.productId == domain.product_id }
48-
ProposedDomain(
49-
productId = domain.product_id,
50-
domain = domain.domain_name,
51-
price = domain.cost,
52-
salePrice = product?.combinedSaleCostDisplay,
53-
supportsPrivacy = domain.supports_privacy
54-
)
55-
}
56-
DomainsResult.Success(suggestions)
57-
} else {
58-
DomainsResult.Error
71+
val params = ProductsParams(
72+
productType = ProductTypeFilter.Domains
73+
)
74+
val result = getOrCreateClient()
75+
.request { it.products().list(params).data }
76+
if (result is WpRequestResult.Success) {
77+
products = result.response.values.toList()
5978
}
6079
}
6180

6281
sealed interface DomainsResult {
63-
data class Success(val proposedDomains: List<ProposedDomain>) : DomainsResult
64-
object Error : DomainsResult
82+
data class Success(
83+
val proposedDomains: List<ProposedDomain>
84+
) : DomainsResult
85+
data object Error : DomainsResult
6586
}
6687
}

WordPress/src/main/java/org/wordpress/android/ui/domains/management/newdomainsearch/domainsfetcher/SuggestedDomainsFetcher.kt

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)