diff --git a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaData.kt b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaData.kt index 64135560a3..9981281db9 100644 --- a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaData.kt +++ b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaData.kt @@ -25,7 +25,7 @@ data class WCMetaData( val displayValue: WCMetaDataValue? = null ) { constructor(id: Long, key: String, value: String) : this(id, key, - WCMetaDataValue.fromRawString(value) + WCMetaDataValue(value) ) /** diff --git a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaDataValue.kt b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaDataValue.kt index cce8c27c11..e51354fd01 100644 --- a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaDataValue.kt +++ b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/model/metadata/WCMetaDataValue.kt @@ -78,6 +78,16 @@ sealed class WCMetaDataValue { } companion object { + operator fun invoke(value: String?): WCMetaDataValue { + if (value == null) return StringValue(null) + + return runCatching { JsonParser().parse(value) } + .getOrElse { JsonPrimitive(value) } + .let { fromJsonElement(it) } + } + operator fun invoke(value: Number): WCMetaDataValue = NumberValue(value) + operator fun invoke(value: Boolean): WCMetaDataValue = BooleanValue(value) + internal fun fromJsonElement(element: JsonElement): WCMetaDataValue { return when { element.isJsonPrimitive -> { @@ -95,10 +105,5 @@ sealed class WCMetaDataValue { else -> StringValue(element.toString()) } } - - fun fromRawString(value: String): WCMetaDataValue = - runCatching { JsonParser().parse(value) } - .getOrElse { JsonPrimitive(value) } - .let { fromJsonElement(it) } } } diff --git a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClient.kt b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClient.kt index 3348ddcbc6..24dcb528e9 100644 --- a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClient.kt +++ b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/network/rest/wpcom/wc/product/ProductRestClient.kt @@ -22,6 +22,7 @@ import org.wordpress.android.fluxc.model.WCProductTagModel import org.wordpress.android.fluxc.model.WCProductVariationModel import org.wordpress.android.fluxc.model.metadata.MetadataChanges import org.wordpress.android.fluxc.model.metadata.WCMetaData +import org.wordpress.android.fluxc.model.metadata.WCMetaDataValue import org.wordpress.android.fluxc.network.BaseRequest.GenericErrorType import org.wordpress.android.fluxc.network.BaseRequest.GenericErrorType.PARSE_ERROR import org.wordpress.android.fluxc.network.rest.wpapi.WPAPINetworkError @@ -1724,7 +1725,7 @@ class ProductRestClient @Inject constructor( fun addProduct( site: SiteModel, productModel: WCProductModel, - metaData: Map? = null + metaData: Map? = null ) { coroutineEngine.launch(AppLog.T.API, this, "addProduct") { val url = WOOCOMMERCE.products.pathV3 @@ -1736,7 +1737,7 @@ class ProductRestClient @Inject constructor( it.forEach { (key, value) -> add(JsonObject().apply { addProperty(WCMetaData.KEY, key) - addProperty(WCMetaData.VALUE, value) + add(WCMetaData.VALUE, value.jsonValue) }) } } diff --git a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCProductStore.kt b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCProductStore.kt index 1ca4786aa2..906cdbb6c3 100644 --- a/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCProductStore.kt +++ b/plugins/woocommerce/src/main/kotlin/org/wordpress/android/fluxc/store/WCProductStore.kt @@ -27,6 +27,7 @@ import org.wordpress.android.fluxc.model.WCProductVariationModel.ProductVariantO import org.wordpress.android.fluxc.model.addons.RemoteAddonDto import org.wordpress.android.fluxc.model.metadata.MetadataChanges import org.wordpress.android.fluxc.model.metadata.WCMetaData +import org.wordpress.android.fluxc.model.metadata.WCMetaDataValue import org.wordpress.android.fluxc.model.metadata.get import org.wordpress.android.fluxc.network.BaseRequest.BaseNetworkError import org.wordpress.android.fluxc.network.BaseRequest.GenericErrorType @@ -305,7 +306,7 @@ class WCProductStore @Inject constructor( class AddProductPayload( var site: SiteModel, val product: WCProductModel, - val metadata: Map? = null + val metadata: Map? = null ) : Payload() class DeleteProductPayload( diff --git a/plugins/woocommerce/src/test/java/org/wordpress/android/fluxc/model/WCMetaDataValueTest.kt b/plugins/woocommerce/src/test/java/org/wordpress/android/fluxc/model/WCMetaDataValueTest.kt index 0a04373d3a..3b37b611ac 100644 --- a/plugins/woocommerce/src/test/java/org/wordpress/android/fluxc/model/WCMetaDataValueTest.kt +++ b/plugins/woocommerce/src/test/java/org/wordpress/android/fluxc/model/WCMetaDataValueTest.kt @@ -6,37 +6,37 @@ import org.wordpress.android.fluxc.model.metadata.WCMetaDataValue class WCMetaDataValueTest { @Test fun `when given a plain string, should return a StringValue`() { - val string = WCMetaDataValue.fromRawString("string") + val string = WCMetaDataValue("string") assert(string is WCMetaDataValue.StringValue) } @Test fun `when given a number, should return a NumberValue`() { - val number = WCMetaDataValue.fromRawString("1") + val number = WCMetaDataValue("1") assert(number is WCMetaDataValue.NumberValue) } @Test fun `when given a float, should return a NumberValue`() { - val number = WCMetaDataValue.fromRawString("1.5") + val number = WCMetaDataValue("1.5") assert(number is WCMetaDataValue.NumberValue) } @Test fun `when given a boolean, should return a BooleanValue`() { - val boolean = WCMetaDataValue.fromRawString("true") + val boolean = WCMetaDataValue("true") assert(boolean is WCMetaDataValue.BooleanValue) } @Test fun `when given a JSON object, should return a JsonObjectValue`() { - val jsonObject = WCMetaDataValue.fromRawString("""{"key":"value"}""") + val jsonObject = WCMetaDataValue("""{"key":"value"}""") assert(jsonObject is WCMetaDataValue.JsonObjectValue) } @Test fun `when given a JSON array, should return a JsonArrayValue`() { - val jsonArray = WCMetaDataValue.fromRawString("""[{"key":"value"}]""") + val jsonArray = WCMetaDataValue("""[{"key":"value"}]""") assert(jsonArray is WCMetaDataValue.JsonArrayValue) } }