From 82a9b483171ffde5f643a56a7d10463f5c578dcb Mon Sep 17 00:00:00 2001 From: Hicham Boushaba Date: Tue, 10 Jan 2023 14:45:59 +0100 Subject: [PATCH 1/2] Fix logic of Woo detection to work with non-eligible users --- .../wpcom/wc/system/WooSystemRestClient.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/system/WooSystemRestClient.kt b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/system/WooSystemRestClient.kt index 6e5c965d3c..8ea606b315 100644 --- a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/system/WooSystemRestClient.kt +++ b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/system/WooSystemRestClient.kt @@ -5,7 +5,6 @@ import com.google.gson.annotations.SerializedName import org.wordpress.android.fluxc.generated.endpoint.WOOCOMMERCE import org.wordpress.android.fluxc.generated.endpoint.WPAPI import org.wordpress.android.fluxc.model.SiteModel -import org.wordpress.android.fluxc.network.BaseRequest.GenericErrorType.NOT_FOUND import org.wordpress.android.fluxc.network.rest.wpapi.WPAPIResponse import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooNetwork import org.wordpress.android.fluxc.network.rest.wpcom.wc.WooPayload @@ -14,6 +13,11 @@ import org.wordpress.android.fluxc.utils.toWooPayload import javax.inject.Inject class WooSystemRestClient @Inject constructor(private val wooNetwork: WooNetwork) { + companion object { + private const val NOT_FOUND = 404 + private const val FORBIDDEN = 403 + } + suspend fun fetchInstalledPlugins(site: SiteModel): WooPayload { val url = WOOCOMMERCE.system_status.pathV3 @@ -59,10 +63,14 @@ class WooSystemRestClient @Inject constructor(private val wooNetwork: WooNetwork return when (response) { is WPAPIResponse.Success -> WooPayload(true) is WPAPIResponse.Error -> { - if (response.error.type == NOT_FOUND) { - WooPayload(false) - } else { - WooPayload(response.error.toWooError()) + when (response.error.volleyError?.networkResponse?.statusCode) { + NOT_FOUND -> WooPayload(false) + FORBIDDEN -> { + // If we get a 403 status code, we can infer that Woo is installed, + // the user just doesn't have permission to access the Woo API + WooPayload(true) + } + else -> WooPayload(response.error.toWooError()) } } } From ed3c683cbcd857e5700b77545d0e21976f3f25cf Mon Sep 17 00:00:00 2001 From: Hicham Boushaba Date: Tue, 10 Jan 2023 14:48:51 +0100 Subject: [PATCH 2/2] Offload fetching sites to a background thread --- .../wordpress/android/fluxc/store/SiteStore.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/fluxc/src/main/java/org/wordpress/android/fluxc/store/SiteStore.kt b/fluxc/src/main/java/org/wordpress/android/fluxc/store/SiteStore.kt index 28c513bc4a..57e85ca53c 100644 --- a/fluxc/src/main/java/org/wordpress/android/fluxc/store/SiteStore.kt +++ b/fluxc/src/main/java/org/wordpress/android/fluxc/store/SiteStore.kt @@ -1341,12 +1341,15 @@ open class SiteStore @Inject constructor( } suspend fun fetchSite(site: SiteModel): OnSiteChanged { - val updatedSite = if (site.isUsingWpComRestApi) { - siteRestClient.fetchSite(site) - } else { - siteXMLRPCClient.fetchSite(site) + return coroutineEngine.withDefaultContext(T.API, this, "Fetch site") { + val updatedSite = if (site.isUsingWpComRestApi) { + siteRestClient.fetchSite(site) + } else { + siteXMLRPCClient.fetchSite(site) + } + + updateSite(updatedSite) } - return updateSite(updatedSite) } suspend fun fetchSites(payload: FetchSitesPayload): OnSiteChanged { @@ -1357,7 +1360,9 @@ open class SiteStore @Inject constructor( } suspend fun fetchSitesXmlRpc(payload: RefreshSitesXMLRPCPayload): OnSiteChanged { - return updateSites(siteXMLRPCClient.fetchSites(payload.url, payload.username, payload.password)) + return coroutineEngine.withDefaultContext(T.API, this, "Fetch sites") { + updateSites(siteXMLRPCClient.fetchSites(payload.url, payload.username, payload.password)) + } } @Suppress("ForbiddenComment", "SwallowedException")