wordpress-mobile / wordpress-mobile/WordPress-Android

`DomainsResponse` is not always parsed correctly

Open
#15,487 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

[Pri] Low [Type] Bug Domains
Dominant language
Kotlin
Stars
3.2k
Forks
1.4k
Avg merge
1d 11h
Merged PRs (30d)
69

Description

The Domain model on FluxC is expecting the currentUserCannotAddEmailReason property to be a string, when in fact it is an object instead.

Here's an example of what the data in that property might look like:

"current_user_cannot_add_email_reason": {
	"errors": {
		"other-user-owns-subscription": [
			"Only the owner of the domain subscription for atestdesignportfolio.com can buy email services for that domain"
		]
	},
	"error_data": []
}

This causes the Domains dashboard to be empty upon opening after it silently fails with the following error:

2021-10-20 20:01:06.764 6626-6626/org.wordpress.android.beta E/WordPress-API: Volley error on https://public-api.wordpress.com/rest/v1.1/sites/186366855/domains/?locale=en_US
    com.android.volley.ParseError: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 1854 path $.domains[1].current_user_cannot_add_email_reason
        at org.wordpress.android.fluxc.network.rest.GsonRequest.parseNetworkResponse(GsonRequest.java:98)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:143)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111)
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90)
     Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 1854 path $.domains[1].current_user_cannot_add_email_reason
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:226)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
        at com.google.gson.Gson.fromJson(Gson.java:927)
        at com.google.gson.Gson.fromJson(Gson.java:892)
        at com.google.gson.Gson.fromJson(Gson.java:841)
        at com.google.gson.Gson.fromJson(Gson.java:813)
        at org.wordpress.android.fluxc.network.rest.GsonRequest.parseNetworkResponse(GsonRequest.java:92)
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:143) 
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111) 
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90) 
     Caused by: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 1854 path $.domains[1].current_user_cannot_add_email_reason
        at com.google.gson.stream.JsonReader.nextString(JsonReader.java:825)
        at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:402)
        at com.google.gson.internal.bind.TypeAdapters$16.read(TypeAdapters.java:390)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41) 
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82) 
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:131) 
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:222) 
        at com.google.gson.Gson.fromJson(Gson.java:927) 
        at com.google.gson.Gson.fromJson(Gson.java:892) 
        at com.google.gson.Gson.fromJson(Gson.java:841) 
        at com.google.gson.Gson.fromJson(Gson.java:813) 
        at org.wordpress.android.fluxc.network.rest.GsonRequest.parseNetworkResponse(GsonRequest.java:92) 
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:143) 
        at com.android.volley.NetworkDispatcher.processRequest(NetworkDispatcher.java:111) 
        at com.android.volley.NetworkDispatcher.run(NetworkDispatcher.java:90) 

We should probably remove all the properties that we don't know for sure we are going to need.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the Domain model in fluxc/src/main/java/org/wordpress/android/fluxc/network/rest/wpcom/site/DomainsResponse.kt, especially currentUserCannotAddEmailReason, and compare it with the example response in this issue. Confirm parsing the object no longer produces the shown Gson error and that the Domains dashboard is not empty when this response is present.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
api, mobile
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
52/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.