|
1 | 1 | package org.wordpress.android.ui.domains.management.newdomainsearch.domainsfetcher |
2 | 2 |
|
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 |
9 | 12 | import javax.inject.Inject |
10 | 13 |
|
11 | | -private const val SUGGESTIONS_REQUEST_COUNT = 20 |
| 14 | +private const val SUGGESTIONS_REQUEST_COUNT = 20u |
12 | 15 |
|
13 | 16 | class NewDomainsSearchRepository @Inject constructor( |
14 | | - private val productsStore: ProductsStore, |
15 | | - private val suggestedDomainsFetcher: SuggestedDomainsFetcher |
| 17 | + private val wpComApiClientProvider: WpComApiClientProvider, |
| 18 | + private val accountStore: AccountStore, |
16 | 19 | ) { |
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 | + } |
18 | 32 |
|
19 | 33 | suspend fun searchForDomains(query: String): DomainsResult { |
20 | 34 | 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 |
33 | 67 | } |
34 | 68 | } |
35 | 69 |
|
36 | 70 | 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() |
59 | 78 | } |
60 | 79 | } |
61 | 80 |
|
62 | 81 | 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 |
65 | 86 | } |
66 | 87 | } |
0 commit comments