amplify-flutter icon indicating copy to clipboard operation
amplify-flutter copied to clipboard

Is there a good way to selectively sync based on userID after auth?

Open osehmathias opened this issue 11 months ago • 3 comments

Description

Multiple owners is not supported with Amplify DataStore, so I am trying to find a way to selectively sync based on the userID once a user has logged in.

Are there any good ways to do this?

I am storing the ownerIDs as a Cognito attribute and ideally could use that to selectively sync.

https://github.com/aws-amplify/amplify-flutter/issues/3388

Categories

  • [ ] Analytics
  • [ ] API (REST)
  • [ ] API (GraphQL)
  • [ ] Auth
  • [ ] Authenticator
  • [X] DataStore
  • [ ] Notifications (Push)
  • [ ] Storage

Steps to Reproduce

No response

Screenshots

No response

Platforms

  • [ ] iOS
  • [ ] Android
  • [ ] Web
  • [ ] macOS
  • [ ] Windows
  • [ ] Linux

Flutter Version

3.19.1

Amplify Flutter Version

1.6.2

Deployment Method

Amplify CLI

Schema

type Client
  @model
  @auth(
    rules: [
      { allow: private, provider: iam }
      { allow: owner, ownerField: "owner" }
      { allow: groups, groups: ["participant"] }
      { allow: groups, groups: ["clinician"] }
      { allow: groups, groups: ["practicemanager"] }
      { allow: groups, groups: ["admin"] }
    ]
  ) {
  id: ID!
  sub: ID!
...
}

osehmathias avatar Feb 28 '24 10:02 osehmathias

Hi @osehmathias, could you please provide more context about your use case?

Equartey avatar Feb 29 '24 20:02 Equartey

Hi @Equartey - thank you for the response!

The application allows clinicians and clients to interact with the data a client has created. You can also invite participants.

Participants are clients that have access to another client's account. This is used for family members and so forth.

Instead of using the owner field to grant participant access, I am using a group and an attribute on their Cognito object which indicates the clientID the participant has access to. This ID is used for querying.

When a participant is logging in, it's extremely slow because it's syncing the entire DB.

The ideal solution would be to use the owner field with multiple owners. However, this is not available in Amplify Flutter. https://github.com/aws-amplify/amplify-flutter/issues/3388

Another solution could be to use the clientID attribute on the participant's Cognito object to selectively sync. However, it seems like once the Amplify DataStore configuration object has been set when the app first loads, it can't be modified.

I am curious if anyone knows a way to selectively sync with a variable that becomes available when a user has logged in.

osehmathias avatar Feb 29 '24 21:02 osehmathias

Hi @osehmathias, appreciate the extra context.

If you're looking to change the selective sync during runtime, checkout this guide:

https://docs.amplify.aws/flutter/build-a-backend/more-features/datastore/sync-to-cloud/#reevaluate-expressions-at-runtime

Equartey avatar Feb 29 '24 21:02 Equartey

I did try that by setting the ID to StoredValues and re-evaluating. Strangely, it didn't filter. However, I will try another method of setting the ID to selectively sync.

Happy to consider this closed.

osehmathias avatar Mar 07 '24 10:03 osehmathias