aws-amplify / amplify-android

The fastest and easiest way to use AWS from your Android app.
https://docs.amplify.aws/lib/q/platform/android/
Apache License 2.0
245 stars 115 forks source link

syncExpression doesn't support lists #1509

Open PS-MS opened 2 years ago

PS-MS commented 2 years ago

Before opening, please confirm:

Language and Async Model

Kotlin

Amplify Categories

DataStore

Gradle script dependencies

```groovy // Put output below this line ```

Environment information

``` # Put output below this line ```

Please include any relevant guides or documentation you're referencing

https://docs.amplify.aws/lib/datastore/sync/q/platform/android/#selectively-syncing-a-subset-of-your-data

Describe the bug

We are using group authorisation and as AppSync doesn't support dynamic group authorisation, and tells every device when something has been created/updated/deleted despite group settings, I tried to add in the following syncExpression:

.syncExpression(::class.java) { .GROUP.contains("3bd49a54-cb68-454c-860e-d06d7dc1bd0f") }

GROUP being a list of strings, but on running the app the expression fails with: java.lang.IllegalArgumentException: group field inside provided object cannot be evaluated by the operator type: CONTAINS

Reproduction steps (if applicable)

Attempt to use a syncExpression for a QueryField that is a List<*>

Code Snippet

// Put your code below this line.

Log output

``` // Put your logs below this line ```

amplifyconfiguration.json

No response

GraphQL Schema

```graphql // Put your schema below this line ```

Additional information and screenshots

No response

PS-MS commented 2 years ago

I've run into another issue that this is very similar to, probably the same. In the below code example the condition is true, and the data is saved locally but the change doesn't sync to dynamoDB.


suspend fun testSave() {
    val userObj = UserDao().getCurrentUser()
    userObj?.let {
        val updatedUser = userObj.copyOfBuilder()
            .givenName("Sam")
            .build()
        try {
            KotlinAmplify.DataStore.save(
                updatedUser,
                User.GROUP.contains("955e8da2-9197-4f3f-ad46-f2d4556428ec")
            )
            Log.i(TAG, "testSave: all good, saved")
        } catch(dse: DataStoreException) {
            Log.e(TAG, "testSave: ${dse.localizedMessage}")
        }
    }
}