@@ -3,9 +3,6 @@ package org.wordpress.android.fluxc.store
33import android.content.Context
44import com.wellsql.generated.SiteModelTable
55import kotlinx.coroutines.Dispatchers
6- import kotlinx.coroutines.async
7- import kotlinx.coroutines.awaitAll
8- import kotlinx.coroutines.coroutineScope
96import kotlinx.coroutines.flow.Flow
107import kotlinx.coroutines.flow.map
118import kotlinx.coroutines.runBlocking
@@ -92,9 +89,6 @@ open class WooCommerceStore @Inject internal constructor(
9289 const val WOO_API_NAMESPACE_V3 = " wc/v3"
9390 }
9491
95- private val SiteModel .needsAdditionalCheckForWooInstallation
96- get() = origin == SiteModel .ORIGIN_XMLRPC || (origin == SiteModel .ORIGIN_WPCOM_REST && isJetpackCPConnected)
97-
9892 override fun onRegister () = AppLog .d(T .API , " WooCommerceStore onRegister" )
9993
10094 @Subscribe(threadMode = ThreadMode .ASYNC )
@@ -108,33 +102,7 @@ open class WooCommerceStore @Inject internal constructor(
108102 OnSiteChanged ()
109103 }
110104
111- if (fetchResult.isError) {
112- emitChange(fetchResult)
113-
114- return WooResult (
115- WooError (
116- type = GENERIC_ERROR ,
117- message = fetchResult.error.message,
118- original = UNKNOWN
119- )
120- )
121- }
122-
123- // Fetch WooCommerce availability for non-Jetpack sites
124- val updatedSites = siteStore.sites
125- .filter { it.needsAdditionalCheckForWooInstallation }
126- .pmap { site ->
127- val isResultUpdated = fetchAndUpdateNonJetpackSite(site)
128- if (isResultUpdated.model == true && ! fetchResult.updatedSites.contains(site)) {
129- 1
130- } else {
131- 0
132- }
133- }.sum()
134-
135- val rowsAffected = fetchResult.rowsAffected + updatedSites
136-
137- emitChange(OnSiteChanged (rowsAffected, fetchResult.updatedSites))
105+ emitChange(fetchResult)
138106
139107 return withContext(Dispatchers .IO ) { WooResult (getWooCommerceSites()) }
140108 }
@@ -158,28 +126,7 @@ open class WooCommerceStore @Inject internal constructor(
158126 }
159127 }
160128
161- if (! site.isJetpackCPConnected) {
162- // The endpoint used by siteStore to fetch a single site is broken for Jetpack CP sites, so skip it for them
163- siteStore.fetchSite(site).let {
164- if (it.isError) {
165- return WooResult (
166- WooError (
167- type = GENERIC_ERROR ,
168- message = it.error.message,
169- original = UNKNOWN
170- )
171- )
172- }
173- }
174- }
175-
176- val isSiteUpdated = if (site.needsAdditionalCheckForWooInstallation) {
177- fetchAndUpdateNonJetpackSite(site).let {
178- if (it.isError) return WooResult (it.error)
179-
180- it.model!!
181- }
182- } else false
129+ val fetchResult = siteStore.fetchSite(site)
183130
184131 val updatedSite = withContext(Dispatchers .IO ) {
185132 siteStore.getSiteByLocalId(site.id)
@@ -191,7 +138,7 @@ open class WooCommerceStore @Inject internal constructor(
191138 )
192139 )
193140
194- if (isSiteUpdated ) {
141+ if (fetchResult.rowsAffected > 0 ) {
195142 emitChange(OnSiteChanged (1 , listOf (updatedSite)))
196143 }
197144
@@ -330,83 +277,6 @@ open class WooCommerceStore @Inject internal constructor(
330277 }
331278 }
332279
333- /* *
334- * Fetch additional data about non-Jetpack connected sites, and here we mean two types:
335- * 1. Jetpack CP connected sites.
336- * 2. Self-hosted sites accessed using site credentials.
337- *
338- * @return [WooResult] representing whether the result succeeded and whether the site was updated
339- */
340- @Suppress(" ReturnCount" )
341- private suspend fun fetchAndUpdateNonJetpackSite (site : SiteModel ): WooResult <Boolean > {
342- // Fetch site metadata for Jetpack CP sites
343- val isMetadataUpdated = if (site.isJetpackCPConnected) {
344- fetchAndUpdateMetaDataFromSiteSettings(site).let {
345- if (it.isError) {
346- return it
347- }
348- it.model!!
349- }
350- } else false
351-
352- // Check Woo installation status for Jetpack CP sites and non-Jetpack sites
353- val isWooStatusUpdated = fetchAndUpdateWooCommerceAvailability(site).let {
354- if (it.isError) {
355- return it
356- }
357- it.model!!
358- }
359-
360- return WooResult (isMetadataUpdated || isWooStatusUpdated)
361- }
362-
363- private suspend fun fetchAndUpdateMetaDataFromSiteSettings (site : SiteModel ): WooResult <Boolean > {
364- fun SiteModel.updateFromSiteSettings (response : WooSystemRestClient .WPSiteSettingsResponse ) = apply {
365- name = response.title ? : name
366- description = response.description ? : description
367- url = response.url ? : url
368- showOnFront = response.showOnFront ? : showOnFront
369- pageOnFront = response.pageOnFront ? : pageOnFront
370- }
371-
372- return coroutineEngine.withDefaultContext(T .API , this , " fetchAndUpdateMetaDataFromSiteSettings" ) {
373- val response = systemRestClient.fetchSiteSettings(site)
374- return @withDefaultContext when {
375- response.isError -> {
376- AppLog .w(T .API , " fetching site settings site ${site.siteId} " )
377- WooResult (response.error)
378- }
379-
380- else -> {
381- WooResult (response.result?.let {
382- siteSqlUtils.insertOrUpdateSite(site.updateFromSiteSettings(it)) == 1
383- } ? : false )
384- }
385- }
386- }
387- }
388-
389- private suspend fun fetchAndUpdateWooCommerceAvailability (site : SiteModel ): WooResult <Boolean > {
390- return coroutineEngine.withDefaultContext(T .API , this , " fetchAndUpdateWooCommerceAvailability" ) {
391- val response = systemRestClient.checkIfWooCommerceIsAvailable(site)
392- return @withDefaultContext when {
393- response.isError -> {
394- AppLog .w(T .API , " Checking WooCommerce availability failed for site ${site.siteId} " )
395- WooResult (response.error)
396- }
397-
398- else -> {
399- val updated = response.result?.takeIf { it != site.hasWooCommerce }?.let {
400- site.hasWooCommerce = it
401- siteSqlUtils.insertOrUpdateSite(site)
402- true
403- } ? : false
404- WooResult (updated)
405- }
406- }
407- }
408- }
409-
410280 suspend fun fetchSupportedApiVersion (
411281 site : SiteModel ,
412282 overrideRetryPolicy : Boolean = false
@@ -531,11 +401,13 @@ open class WooCommerceStore @Inject internal constructor(
531401 )
532402 WooResult (response.error)
533403 }
404+
534405 response.result != null -> {
535406 val settings = settingsMapper.mapTaxBasedOnSettings(response.result, site.localId())
536407 taxBasedOnDao.insertOrUpdate(settings)
537408 WooResult (settings)
538409 }
410+
539411 else -> {
540412 WooResult (WooError (GENERIC_ERROR , UNKNOWN ))
541413 }
@@ -554,12 +426,14 @@ open class WooCommerceStore @Inject internal constructor(
554426 )
555427 WooResult (response.error)
556428 }
429+
557430 response.result != null -> {
558431 val settingsMap = response.result.associate { setting ->
559432 setting.id to (setting.value ? : setting.default ? : " " )
560433 }
561434 WooResult (settingsMap)
562435 }
436+
563437 else -> {
564438 WooResult (WooError (GENERIC_ERROR , UNKNOWN ))
565439 }
@@ -648,8 +522,4 @@ open class WooCommerceStore @Inject internal constructor(
648522 ): String {
649523 return formatCurrencyForDisplay(amount.toString(), site, currencyCode, applyDecimalFormatting)
650524 }
651-
652- private suspend fun <A , B > Iterable<A>.pmap (f : suspend (A ) -> B ): List <B > = coroutineScope {
653- map { async { f(it) } }.awaitAll()
654- }
655525}
0 commit comments