aws-amplify / amplify-swift

A declarative library for application development using cloud services.
Apache License 2.0
453 stars 196 forks source link

Realtime update not working on Amplify.DataStore.observeQuery #3495

Closed jaymeen-unadkat-differenz closed 8 months ago

jaymeen-unadkat-differenz commented 8 months ago

Amplify.DataStore.observeQuery real-time data not updating

I'm getting data in Amplify.DataStore.observeQuery,

But when I update the value in the model from Amplify studio's data console

I get this error: I've been stuck for the past 15 days on this issue

onUpdateValueListener: data(Swift.Result<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>>>.failure(GraphQLResponseError<MutationSync<AnyModel>>: GraphQL service returned a partially-successful response containing errors: [Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/createdAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("createdAt")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/updatedAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("updatedAt")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'Int\' within parent \'Drink\' (/onUpdateCampaign/drink/_version)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("_version")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSTimestamp\' within parent \'Drink\' (/onUpdateCampaign/drink/_lastChangedAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("_lastChangedAt")]), extensions: nil)]
Recovery suggestion: The list of `GraphQLError` contains service-specific messages.))
receive(_:): data(Swift.Result<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>>>.failure(GraphQLResponseError<MutationSync<AnyModel>>: GraphQL service returned a partially-successful response containing errors: [Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/createdAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("createdAt")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/updatedAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("updatedAt")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'Int\' within parent \'Drink\' (/onUpdateCampaign/drink/_version)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("_version")]), extensions: nil), Amplify.GraphQLError(message: "Cannot return null for non-nullable type: \'AWSTimestamp\' within parent \'Drink\' (/onUpdateCampaign/drink/_lastChangedAt)", locations: nil, path: Optional([Amplify.JSONValue.string("onUpdateCampaign"), Amplify.JSONValue.string("drink"), Amplify.JSONValue.string("_lastChangedAt")]), extensions: nil)]
Recovery suggestion: The list of `GraphQLError` contains service-specific messages.))

Steps To Reproduce

Steps to reproduce the behavior:
1. Go to 'Amplify Console'
2. Click on 'Content -> Data Manager'
3. Update any value in the model
4. See the error in the XCode console

Expected behavior

Data should update in the array(variable)

Amplify Framework Version

2.25.6

Amplify Categories

DataStore

Dependency manager

Swift PM

Swift version

5.9

CLI version

12.10.1

Xcode version

XCode 15

Relevant log output

<details>
<summary>Log Messages</summary>

INSERT LOG MESSAGES HERE



### Is this a regression?

Yes

### Regression additional context

_No response_

### Platforms

iOS

### OS Version

14.0

### Device

Simulator iPhone 11

### Specific to simulators

No - Not working anywhere

### Additional context

_No response_
thisisabhash commented 8 months ago

Hello, Thank you for posting this. Can you share your model schema, verbose logs(without sensitive information) and code snippets you're using? This will help us understand the issue better and reproduce it locally.

jaymeen-unadkat-differenz commented 8 months ago

Schema:

enum WholesalerType {
  CLASSA
  CLASSB
}

type Wholesaler @model @auth(rules: [{allow: public}]) {
  id: ID!
  name: String
  ordersEmail: String
  type: WholesalerType
}

enum ProductCategory {
  WHISKEY
  GIN
  LAGER
  PILSNER
  CABERNET
  CHARDONNAY
}

enum ProductType {
  SPIRITS
  WINE
  BEER
  NONALCOHOLIC
}

type Product @model @auth(rules: [{allow: public}]) {
  id: ID!
  name: String
  description: String
  imageUrl: String
  type: ProductType
  cost: Int
  category: ProductCategory
  campaignProduct: [CampaignProduct] @hasMany
  productLogoUrl: String
  wholesaler: Wholesaler @hasOne
}

type CampaignProduct @model @auth(rules: [{allow: public}]) {
  id: ID!
  quantity: Int
  campaignID: ID! @index(name: "byCampaign")
  product: Product @belongsTo
  primaryProduct: Boolean
}

enum DrinkType {
  BEER
  WINE
  COCKTAIL
  NONALCOHOLIC
}

type Drink @model @auth(rules: [{allow: public}]) {
  id: ID!
  name: String
  type: DrinkType
  description: String
  imageURL: String
  numberOfDrinks: Int
  campaigns: [Campaign] @hasMany
}

enum RetailerType {
  ONPREMISE
  OFFPREMISE
}

enum CampaignStatus {
  PENDING
  LIVE
  FINISHED
}

type RetailManager @model @auth(rules: [{allow: public}]) {
  id: ID!
  name: String
  cognitoID: String
  retailerID: ID! @index(name: "byRetailer")
  test: String
  campaignParticipation: [CampaignParticipation] @hasMany
}

type CampaignParticipation @model @auth(rules: [{allow: public}]) {
  id: ID!
  retailer: Retailer @belongsTo(fields: ["retailerID"])
  retailerID: ID! @index(name: "byRetailer")
  campaign: Campaign @belongsTo(fields: ["campaignID"])
  campaignID: ID! @index(name: "byCampaign")
  startingNumberOfOffers: Int
  remainingNumberOfOffers: Int
  retailManagerID: ID
  retailManager: RetailManager @belongsTo
  campaignStatus: CampaignStatus
}

type Retailer @model @auth(rules: [{allow: public}]) {
  id: ID!
  Name: String
  campaignParticipations: [CampaignParticipation] @hasMany(indexName: "byRetailer", fields: ["id"])
  retailManagers: [RetailManager] @hasMany(indexName: "byRetailer", fields: ["id"])
  street: String
  city: String
  state: String
  zipcode: String
  lat: String
  lng: String
  description: String
  imageURL: String
  type: RetailerType
  operatingHours: AWSJSON
  wholesaler: Wholesaler @hasOne
}

type Campaign @model @auth(rules: [{allow: public}]) {
  id: ID!
  Name: String
  numberOfCampaigns: Int
  numberOfOffers: Int
  campaignParticipations: [CampaignParticipation] @hasMany(indexName: "byCampaign", fields: ["id"])
  description: String
  publishDate: AWSDateTime
  expirationDate: AWSDateTime
  status: CampaignStatus
  eligibleZipCodes: [String]
  imageURL: String
  drink: Drink @belongsTo
  campaignProducts: [CampaignProduct] @hasMany(indexName: "byCampaign", fields: ["id"])
  numberOfCampaignsRemaining: String
}
jaymeen-unadkat-differenz commented 8 months ago

Sometimes Errors are like this

Creating not loaded list of CampaignProduct with Metadata(appSyncAssociatedIdentifiers: ["xxxxxx"], appSyncAssociatedFields: ["campaign"], apiName: nil)
Creating not loaded list of AcceptedCampaigns with Metadata(appSyncAssociatedIdentifiers: ["xxxxx"], appSyncAssociatedFields: ["campaign"], apiName: nil)
jaymeen-unadkat-differenz commented 8 months ago

Anyone?

lawmicha commented 8 months ago

Hi @jaymeen-unadkat-differenz, taking a look. Here's the formatted error you are seeing is an error from AppSync on the subscription event.

onUpdateValueListener: data(
    Swift.Result<
        AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>,
        Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>>
    >.failure(
        GraphQLResponseError<MutationSync<AnyModel>>: GraphQL service returned a partially-successful response containing errors: [
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/createdAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("createdAt")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/updatedAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("updatedAt")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'Int\' within parent \'Drink\' (/onUpdateCampaign/drink/_version)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("_version")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSTimestamp\' within parent \'Drink\' (/onUpdateCampaign/drink/_lastChangedAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("_lastChangedAt")
                ]),
                extensions: nil
            )
        ]
    )
    Recovery suggestion: The list of `GraphQLError` contains service-specific messages.
)

receive(_:): data(
    Swift.Result<
        AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>,
        Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync<AWSPluginsCore.AnyModel>>
    >.failure(
        GraphQLResponseError<MutationSync<AnyModel>>: GraphQL service returned a partially-successful response containing errors: [
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/createdAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("createdAt")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSDateTime\' within parent \'Drink\' (/onUpdateCampaign/drink/updatedAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("updatedAt")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'Int\' within parent \'Drink\' (/onUpdateCampaign/drink/_version)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("_version")
                ]),
                extensions: nil
            ),
            Amplify.GraphQLError(
                message: "Cannot return null for non-nullable type: \'AWSTimestamp\' within parent \'Drink\' (/onUpdateCampaign/drink/_lastChangedAt)",
                locations: nil,
                path: Optional([
                    Amplify.JSONValue.string("onUpdateCampaign"),
                    Amplify.JSONValue.string("drink"),
                    Amplify.JSONValue.string("_lastChangedAt")
                ]),
                extensions: nil
            )
        ]
    )
    Recovery suggestion: The list of `GraphQLError` contains service-specific messages.
)

The message Cannot return null for non-nullable type: 'AWSDateTime' within parent 'Drink' (/onUpdateCampaign/drink/createdAt).

The relevant schema is the Campaign model, with a parent Drink model

type Campaign @model @auth(rules: [{allow: public}]) {
  id: ID!
  Name: String
  numberOfCampaigns: Int
  numberOfOffers: Int
  campaignParticipations: [CampaignParticipation] @hasMany(indexName: "byCampaign", fields: ["id"])
  description: String
  publishDate: AWSDateTime
  expirationDate: AWSDateTime
  status: CampaignStatus
  eligibleZipCodes: [String]
  imageURL: String
  drink: Drink @belongsTo
  campaignProducts: [CampaignProduct] @hasMany(indexName: "byCampaign", fields: ["id"])
  numberOfCampaignsRemaining: String
}
 type Drink @model @auth(rules: [{allow: public}]) {
  id: ID!
  name: String
  type: DrinkType
  description: String
  imageURL: String
  numberOfDrinks: Int
  campaigns: [Campaign] @hasMany
}

Can you clarify if you have the lazy loading feature enabled? This feature is required to decode data from Amplify Studio.

In cli.json do you have the feature flag generateModelsForLazyLoadAndCustomSelectionSet set to true? If you are setting it to true now, please make sure to re-run amplify codegen models to re-generate the proper files

jaymeen-unadkat-differenz commented 8 months ago

@lawmicha this is set to false Whole schema

{ "features": { "graphqltransformer": { "addmissingownerfields": true, "improvepluralization": false, "validatetypenamereservedwords": true, "useexperimentalpipelinedtransformer": true, "enableiterativegsiupdates": true, "secondarykeyasgsi": true, "skipoverridemutationinputtypes": true, "transformerversion": 2, "suppressschemamigrationprompt": true, "securityenhancementnotification": false, "showfieldauthnotification": false, "usesubusernamefordefaultidentityclaim": true, "usefieldnameforprimarykeyconnectionfield": false, "enableautoindexquerynames": true, "respectprimarykeyattributesonconnectionfield": true, "shoulddeepmergedirectiveconfigdefaults": false, "populateownerfieldforstaticgroupauth": true }, "frontend-ios": { "enablexcodeintegration": true }, "auth": { "enablecaseinsensitivity": true, "useinclusiveterminology": true, "breakcirculardependency": true, "forcealiasattributes": false, "useenabledmfas": true }, "codegen": { "useappsyncmodelgenplugin": true, "usedocsgeneratorplugin": true, "usetypesgeneratorplugin": true, "cleangeneratedmodelsdirectory": true, "retaincasestyle": true, "addtimestampfields": true, "handlelistnullabilitytransparently": true, "emitauthprovider": true, "generateindexrules": true, "enabledartnullsafety": true, "generatemodelsforlazyloadandcustomselectionset": false }, "appsync": { "generategraphqlpermissions": true }, "latestregionsupport": { "pinpoint": 1, "translate": 1, "transcribe": 1, "rekognition": 1, "textract": 1, "comprehend": 1 }, "project": { "overrides": true } }, "debug": { "shareProjectConfig": true } }

jaymeen-unadkat-differenz commented 8 months ago

@lawmicha We can even have a google meet if it is possible from your end

lawmicha commented 8 months ago

Please set it to true and re-run amplify codegen models and re-run the app, then try again with Amplify Studio sourced mutations.

Ref: https://docs.amplify.aws/swift/tools/cli/migration/lazy-load-custom-selection-set/#cross-platform-app-development-with-datastore-swift

The reason why "lazy loading" is required is because so Swift models support decoding data sourced from Amplify Studio.

jaymeen-unadkat-differenz commented 8 months ago

Okay after enabling the lazy load the error got even bigger

resolve(reconciling([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"RET#1\"#\"RET#1\"", instance: ImbybeTestDemo.Imbybe(pk: "RET#1", sk: "RET#1", gsi1: Optional("master"), gsisk1: Optional("RET#1"), name: Optional("Chris"), description: Optional("retailer desc"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: Optional("ONPREMISE"), street: Optional("Nanpura"), city: Optional("Surat"), state: Optional("Gujarat"), zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: Optional(21.21121766939695), lng: Optional(72.8298565952018), operatingHours: Optional("[{\"closetime\":\"20:00\",\"day\":\"Sun\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Mon\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Tue\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Wed\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Thu\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Fri\",\"opentime\":\"09:00\"},{\"closetime\":\"20:00\",\"day\":\"Sat\",\"opentime\":\"09:00\"}]"), cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:34:36 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 12:50:56 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"RET#1\"#\"RET#1\"", deleted: false, lastChangedAt: 1707310256640, version: 22)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"BRD#1\"#\"BRD#1\"", instance: ImbybeTestDemo.Imbybe(pk: "BRD#1", sk: "BRD#1", gsi1: Optional("master"), gsisk1: Optional("BRD#1"), name: Optional("Brand 2"), description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 1:35:36 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:07:57 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"BRD#1\"#\"BRD#1\"", deleted: false, lastChangedAt: 1707304077148, version: 14)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"BRD#1\"#\"SUP#1\"", instance: ImbybeTestDemo.Imbybe(pk: "BRD#1", sk: "SUP#1", gsi1: Optional("brandSupplier"), gsisk1: Optional("BRD#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 1:37:50 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 1:37:50 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"BRD#1\"#\"SUP#1\"", deleted: false, lastChangedAt: 1707226670770, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"SUP#3\"#\"SUP#3\"", instance: ImbybeTestDemo.Imbybe(pk: "SUP#3", sk: "SUP#3", gsi1: Optional("master"), gsisk1: Optional("SUP#3"), name: Optional("Supplier 3"), description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: nil, numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: nil, lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:18:34 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:18:34 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"SUP#3\"#\"SUP#3\"", deleted: false, lastChangedAt: 1707311914794, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"PRO#2\"#\"BRD#2\"", instance: ImbybeTestDemo.Imbybe(pk: "PRO#2", sk: "BRD#2", gsi1: Optional("productBrand"), gsisk1: Optional("PRO#2"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:58:48 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 12:46:00 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"PRO#2\"#\"BRD#2\"", deleted: false, lastChangedAt: 1707309960888, version: 3)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"PRO#2\"#\"PRO#2\"", instance: ImbybeTestDemo.Imbybe(pk: "PRO#2", sk: "PRO#2", gsi1: Optional("master"), gsisk1: Optional("PRO#2"), name: Optional("Prouct 3"), description: Optional("product desc 2"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: Optional("WINE"), street: nil, city: nil, state: nil, zipCode: nil, productCost: Optional(20), productCategory: Optional("CHARDONNAY"), numberOfDrinks: Optional(50), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: Optional(20), primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:47:57 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:05:08 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"PRO#2\"#\"PRO#2\"", deleted: false, lastChangedAt: 1707314708581, version: 24)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"BRD#2\"#\"BRD#2\"", instance: ImbybeTestDemo.Imbybe(pk: "BRD#2", sk: "BRD#2", gsi1: Optional("master"), gsisk1: Optional("BRD#2"), name: Optional("Brand 2"), description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 6:21:47 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 6:21:47 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"BRD#2\"#\"BRD#2\"", deleted: false, lastChangedAt: 1707286907966, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"BRD#2\"#\"SUP#2\"", instance: ImbybeTestDemo.Imbybe(pk: "BRD#2", sk: "SUP#2", gsi1: Optional("brandSupplier"), gsisk1: Optional("BRD#2"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:03:23 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:03:23 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"BRD#2\"#\"SUP#2\"", deleted: false, lastChangedAt: 1707303803028, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#1\"#\"CAM#1\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#1", sk: "CAM#1", gsi1: Optional("master"), gsisk1: Optional("CAM#1"), name: Optional("Ultimate Tequilla Sunrise 11"), description: Optional("campaign desc"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-08 12:26:00 PM +0000, timeZone: Optional(GMT (fixed)))), expirationDate: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-10 12:26:00 PM +0000, timeZone: Optional(GMT (fixed)))), eligibleZipCodes: Optional([]), numberOfCampaigns: Optional(50), numberOfOffers: Optional(10), remainingNumberOfCampaigns: Optional(50), productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: Optional("New"), rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:27:05 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:32:42 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#1\"#\"CAM#1\"", deleted: false, lastChangedAt: 1707312762827, version: 9)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#1", sk: "DRI#1", gsi1: Optional("campaignDrink"), gsisk1: Optional("CAM#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:44:29 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:00:30 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707303630415, version: 25)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#1\"#\"PRO#1\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#1", sk: "PRO#1", gsi1: Optional("campaignProduct"), gsisk1: Optional("CAM#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: Optional(50), primaryProduct: Optional(true), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:49:46 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:05:30 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#1\"#\"PRO#1\"", deleted: false, lastChangedAt: 1707311130694, version: 12)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#1\"#\"PRO#2\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#1", sk: "PRO#2", gsi1: Optional("campaignProduct"), gsisk1: Optional("CAM#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: Optional(50), primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:50:18 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:05:36 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#1\"#\"PRO#2\"", deleted: false, lastChangedAt: 1707311136207, version: 14)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#1\"#\"RET#1\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#1", sk: "RET#1", gsi1: Optional("campaignParticipation"), gsisk1: Optional("CAM#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: Optional(50), remainingNumberOfOffers: Optional(50), campaignStatus: Optional("PENDING"), rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:41:14 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 9:09:01 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#1\"#\"RET#1\"", deleted: false, lastChangedAt: 1707296941200, version: 11)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 7"), description: Optional("drink desc"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(202), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:36:14 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707316574530, version: 41)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"SUP#2\"#\"SUP#2\"", instance: ImbybeTestDemo.Imbybe(pk: "SUP#2", sk: "SUP#2", gsi1: Optional("master"), gsisk1: Optional("SUP#2"), name: Optional("Supplier 2"), description: nil, imageURL: Optional("https://images.unsplash.com/photo-1513558161293-cdaf765ed2fd?q=80&w=1374&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"), ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:02:38 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:02:38 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"SUP#2\"#\"SUP#2\"", deleted: false, lastChangedAt: 1707303758062, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"PRO#1\"#\"BRD#1\"", instance: ImbybeTestDemo.Imbybe(pk: "PRO#1", sk: "BRD#1", gsi1: Optional("productBrand"), gsisk1: Optional("PRO#1"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(true), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 1:37:19 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:20:31 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"PRO#1\"#\"BRD#1\"", deleted: false, lastChangedAt: 1707301231853, version: 2)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"PRO#1\"#\"PRO#1\"", instance: ImbybeTestDemo.Imbybe(pk: "PRO#1", sk: "PRO#1", gsi1: Optional("master"), gsisk1: Optional("PRO#1"), name: Optional("Product 1"), description: Optional("product desc 1"), imageURL: Optional("https://images.unsplash.com/photo-1513558161293-cdaf765ed2fd?q=80&w=1374&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"), ordersEmail: nil, type: Optional("SPIRITS"), street: nil, city: nil, state: nil, zipCode: nil, productCost: Optional(10), productCategory: Optional("WINE"), numberOfDrinks: Optional(10), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: Optional(10), primaryProduct: Optional(true), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:46:42 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:36:06 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"PRO#1\"#\"PRO#1\"", deleted: false, lastChangedAt: 1707312966236, version: 23)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"SUP#4\"#\"SUP#4\"", instance: ImbybeTestDemo.Imbybe(pk: "SUP#4", sk: "SUP#4", gsi1: Optional("master"), gsisk1: Optional("SUP#4"), name: Optional("Supplier 4"), description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: nil, numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: nil, lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:24:59 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 1:24:59 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"SUP#4\"#\"SUP#4\"", deleted: false, lastChangedAt: 1707312299918, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"SUP#1\"#\"SUP#1\"", instance: ImbybeTestDemo.Imbybe(pk: "SUP#1", sk: "SUP#1", gsi1: Optional("master"), gsisk1: Optional("SUP#1"), name: Optional("Supplier 1"), description: nil, imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 1:34:52 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 11:02:31 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"SUP#1\"#\"SUP#1\"", deleted: false, lastChangedAt: 1707303752015, version: 6)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#2\"#\"CAM#2\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#2", sk: "CAM#2", gsi1: Optional("master"), gsisk1: Optional("CAM#2"), name: Optional("Campaign 2"), description: Optional("campaign desc 2"), imageURL: Optional("https://images.unsplash.com/photo-1513558161293-cdaf765ed2fd?q=80&w=1374&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"), ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-11 10:46:00 AM +0000, timeZone: Optional(GMT (fixed)))), expirationDate: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-10 10:46:00 AM +0000, timeZone: Optional(GMT (fixed)))), eligibleZipCodes: Optional([]), numberOfCampaigns: Optional(20), numberOfOffers: Optional(25), remainingNumberOfCampaigns: Optional(50), productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: Optional("New"), rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:47:06 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:06:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#2\"#\"CAM#2\"", deleted: false, lastChangedAt: 1707314806438, version: 3)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#2\"#\"DRI#2\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#2", sk: "DRI#2", gsi1: Optional("campaignDrink"), gsisk1: Optional("CAM#2"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:57:25 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:57:25 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#2\"#\"DRI#2\"", deleted: false, lastChangedAt: 1707303445114, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#2\"#\"PRO#2\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#2", sk: "PRO#2", gsi1: Optional("campaignProduct"), gsisk1: Optional("CAM#2"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: Optional(10), primaryProduct: Optional(true), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:52:03 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:52:03 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#2\"#\"PRO#2\"", deleted: false, lastChangedAt: 1707303123365, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"CAM#2\"#\"RET#1\"", instance: ImbybeTestDemo.Imbybe(pk: "CAM#2", sk: "RET#1", gsi1: Optional("campaignParticipation"), gsisk1: Optional("CAM#2"), name: nil, description: nil, imageURL: nil, ordersEmail: nil, type: nil, street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: nil, publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: Optional(30), remainingNumberOfOffers: Optional(30), campaignStatus: Optional("LIVE"), rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:49:31 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:49:31 AM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"CAM#2\"#\"RET#1\"", deleted: false, lastChangedAt: 1707302971698, version: 1)), AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#2\"#\"DRI#2\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#2", sk: "DRI#2", gsi1: Optional("master"), gsisk1: Optional("DRI#2"), name: Optional("Drink 698"), description: Optional("drink desc 2"), imageURL: Optional("https://images.unsplash.com/photo-1513558161293-cdaf765ed2fd?q=80&w=1374&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D"), ordersEmail: nil, type: Optional("COCKTAIL"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(60), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 10:41:15 AM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:04:03 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#2\"#\"DRI#2\"", deleted: false, lastChangedAt: 1707314643458, version: 20))]), reconciled) -> finished

jaymeen-unadkat-differenz commented 8 months ago

onUpdateValueListener: data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 8"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(202), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cog receive(_:): data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 8"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(202), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:39:35 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707316775541, version: 42)))) dispose(of subscriptionEvent): data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 8"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(202), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 2:39:35 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707316775541, version: 42))))

lawmicha commented 8 months ago

That doesn't look like an error log, it looks like the model Imbybe received on the subscription. Are you experiencing any specific issues with the app?

  1. For real-time updates, try Amplify.DataStore.observe to see updates from the local database. When you send updates from Amplify Studio, the DataStore client will receive the corresponding subscription event and save it to the local database. The save to the local database will emit an event to the observe API (similar to the observeQuery API as well). The log you posted appears to be the decoded data from the subscription event. Can confirm if that data is updated locally?

  2. The logs correspond to the data received with identifiers:

    "model": {
      "id": "RET#1#RET#1",
      "instance": {
        "pk": "RET#1",
        "sk": "RET#1",

You can also view the SQLite database directly using something like https://sqlitebrowser.org/ . The DB path can be seen in the logs as

Initializing database connection: /Users/xxxx/Library/Developer/CoreSimulator/Devices/3C444803-AED8-4D45-9222-278A3F6FD089/data/Containers/Data/Application/E2DF561C-6992-46A9-A1D0-13FFFDEC7768/Documents/xxxx.db

if you have verbose logging enabled: Amplify.Logging.logLevel = .verbose (set this before adding the plugin and Amplify.configure()

jaymeen-unadkat-differenz commented 8 months ago

Hi @lawmicha I can see that, any updated data that is updated from studio which is being updating in local database "ImbybeTestDemo.db" but it is not updating in my ios application

lawmicha commented 8 months ago

Can you try this?

For real-time updates, try Amplify.DataStore.observe to see updates from the local database. When you send updates from Amplify Studio, the DataStore client will receive the corresponding subscription event and save it to the local database. The save to the local database will emit an event to the observe API (similar to the observeQuery API as well). The log you posted appears to be the decoded data from the subscription event. Can confirm if that data is updated locally?

Amplify.DataStore.observeQuery actually uses Amplify.DataStore.observe under the hood, so if observe is not working, then observeQuery won't work as well.

Amplify.DataStore.observe documentation https://docs.amplify.aws/swift/build-a-backend/more-features/datastore/real-time/

jaymeen-unadkat-differenz commented 8 months ago

I have used both none of them are working

lawmicha commented 8 months ago

Can you provide us with the verbose logs (Amplify.Logging.logLevel = .verbose enabled) for the iOS app when it receives the subscription event?

  1. Launch app, start DataStore, I usually code a button to kick off Amplify.DataStore.start()
  2. Ensure the ready event can be seen in the logs [Lifecycle event 6]: ready
  3. Clear the logs
  4. On Amplify Studio, perform the mutation
  5. See the logs in the iOS app's console related to just the event from Amplify Studio. This will include the subscription event decoded to the model, reconciliing it to the local store, and emitting it. If something's not working there, we may be able to find the error in this set of logs
jaymeen-unadkat-differenz commented 8 months ago

After Performing mutation this are the logs that I'm getting

Logs

onUpdateValueListener: data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47)))) receive(_:): data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47)))) dispose(of subscriptionEvent): data(Swift.Result<AWSPluginsCore.MutationSync, Amplify.GraphQLResponseError<AWSPluginsCore.MutationSync>>.success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47)))) dispose(of graphQLResponse): success(AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))) New state: waiting respond(to:): waiting main() Notifying: started([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))]) resolve(waiting, started([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))])) -> reconciling([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))]) New state: reconciling([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))]) respond(to:): reconciling([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional(""), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))]) BEGIN DEFERRED TRANSACTION select "root"."id" as "id", "root"."deleted" as "deleted", "root"."lastChangedAt" as "lastChangedAt", "root"."version" as "version" from "MutationSyncMetadata" as "root" where 1 = 1 and ( "root"."id" = 'Imbybe|"DRI#1"#"DRI#1"' ) select "root"."id" as "id", "root"."deleted" as "deleted", "root"."lastChangedAt" as "lastChangedAt", "root"."version" as "version" from "MutationSyncMetadata" as "root" where 1 = 1 and ( "root"."id" = 'Imbybe|"DRI#1"#"DRI#1"' ) COMMIT TRANSACTION select "root"."id" as "id", "root"."createdAt" as "createdAt", "root"."graphQLFilterJSON" as "graphQLFilterJSON", "root"."inProcess" as "inProcess", "root"."json" as "json", "root"."modelId" as "modelId", "root"."modelName" as "modelName", "root"."mutationType" as "mutationType", "root"."version" as "version" from "MutationEvent" as "root" where 1 = 1 and ( ( ( "root"."modelId" = '"DRI#1"#"DRI#1"' and "root"."modelName" = 'Imbybe' ) ) and ( "root"."inProcess" = 0 or "root"."inProcess" is null ) ) order by "root"."createdAt" asc select "root"."id" as "id", "root"."createdAt" as "createdAt", "root"."graphQLFilterJSON" as "graphQLFilterJSON", "root"."inProcess" as "inProcess", "root"."json" as "json", "root"."modelId" as "modelId", "root"."modelName" as "modelName", "root"."mutationType" as "mutationType", "root"."version" as "version" from "MutationEvent" as "root" where 1 = 1 and ( ( ( "root"."modelId" = '"DRI#1"#"DRI#1"' and "root"."modelName" = 'Imbybe' ) ) and ( "root"."inProcess" = 0 or "root"."inProcess" is null ) ) order by "root"."createdAt" asc select count("@@primaryKey") from "Imbybe" where "@@primaryKey" = '"DRI#1"#"DRI#1"' update "Imbybe" set "pk" = 'DRI#1', "sk" = 'DRI#1', "campaignStatus" = NULL, "city" = NULL, "cognitoID" = NULL, "comment" = NULL, "createdAt" = '2024-02-06T12:43:37.772Z', "description" = 'drink desc', "eligibleZipCodes" = '[]', "expirationDate" = NULL, "gsi1" = 'master', "gsisk1" = 'DRI#1', "imageURL" = '', "lat" = NULL, "lng" = NULL, "name" = 'Ginger Mint 10', "numberOfCampaigns" = NULL, "numberOfDrinks" = 201, "numberOfOffers" = NULL, "operatingHours" = NULL, "ordersEmail" = NULL, "primaryProduct" = 0, "productCategory" = NULL, "productCost" = NULL, "productQuantity" = NULL, "publishDate" = NULL, "rating" = NULL, "remainingNumberOfCampaigns" = NULL, "remainingNumberOfOffers" = NULL, "startingNumberOfOffers" = NULL, "state" = NULL, "street" = NULL, "type" = 'BEER', "updatedAt" = '2024-02-07T15:20:46.371Z', "zipCode" = NULL where "@@primaryKey" = '"DRI#1"#"DRI#1"' select "root"."@@primaryKey" as "@@primaryKey", "root"."pk" as "pk", "root"."sk" as "sk", "root"."campaignStatus" as "campaignStatus", "root"."city" as "city", "root"."cognitoID" as "cognitoID", "root"."comment" as "comment", "root"."createdAt" as "createdAt", "root"."description" as "description", "root"."eligibleZipCodes" as "eligibleZipCodes", "root"."expirationDate" as "expirationDate", "root"."gsi1" as "gsi1", "root"."gsisk1" as "gsisk1", "root"."imageURL" as "imageURL", "root"."lat" as "lat", "root"."lng" as "lng", "root"."name" as "name", "root"."numberOfCampaigns" as "numberOfCampaigns", "root"."numberOfDrinks" as "numberOfDrinks", "root"."numberOfOffers" as "numberOfOffers", "root"."operatingHours" as "operatingHours", "root"."ordersEmail" as "ordersEmail", "root"."primaryProduct" as "primaryProduct", "root"."productCategory" as "productCategory", "root"."productCost" as "productCost", "root"."productQuantity" as "productQuantity", "root"."publishDate" as "publishDate", "root"."rating" as "rating", "root"."remainingNumberOfCampaigns" as "remainingNumberOfCampaigns", "root"."remainingNumberOfOffers" as "remainingNumberOfOffers", "root"."startingNumberOfOffers" as "startingNumberOfOffers", "root"."state" as "state", "root"."street" as "street", "root"."type" as "type", "root"."updatedAt" as "updatedAt", "root"."zipCode" as "zipCode" from "Imbybe" as "root" where 1 = 1 and ( "root"."sk" = 'DRI#1' and "root"."pk" = 'DRI#1' ) select "root"."@@primaryKey" as "@@primaryKey", "root"."pk" as "pk", "root"."sk" as "sk", "root"."campaignStatus" as "campaignStatus", "root"."city" as "city", "root"."cognitoID" as "cognitoID", "root"."comment" as "comment", "root"."createdAt" as "createdAt", "root"."description" as "description", "root"."eligibleZipCodes" as "eligibleZipCodes", "root"."expirationDate" as "expirationDate", "root"."gsi1" as "gsi1", "root"."gsisk1" as "gsisk1", "root"."imageURL" as "imageURL", "root"."lat" as "lat", "root"."lng" as "lng", "root"."name" as "name", "root"."numberOfCampaigns" as "numberOfCampaigns", "root"."numberOfDrinks" as "numberOfDrinks", "root"."numberOfOffers" as "numberOfOffers", "root"."operatingHours" as "operatingHours", "root"."ordersEmail" as "ordersEmail", "root"."primaryProduct" as "primaryProduct", "root"."productCategory" as "productCategory", "root"."productCost" as "productCost", "root"."productQuantity" as "productQuantity", "root"."publishDate" as "publishDate", "root"."rating" as "rating", "root"."remainingNumberOfCampaigns" as "remainingNumberOfCampaigns", "root"."remainingNumberOfOffers" as "remainingNumberOfOffers", "root"."startingNumberOfOffers" as "startingNumberOfOffers", "root"."state" as "state", "root"."street" as "street", "root"."type" as "type", "root"."updatedAt" as "updatedAt", "root"."zipCode" as "zipCode" from "Imbybe" as "root" where 1 = 1 and ( "root"."sk" = 'DRI#1' and "root"."pk" = 'DRI#1' ) select count("id") from "MutationSyncMetadata" where "id" = 'Imbybe|"DRI#1"#"DRI#1"' update "MutationSyncMetadata" set "deleted" = 0, "lastChangedAt" = 1707319246415, "version" = 47 where "id" = 'Imbybe|"DRI#1"#"DRI#1"' select "root"."id" as "id", "root"."deleted" as "deleted", "root"."lastChangedAt" as "lastChangedAt", "root"."version" as "version" from "MutationSyncMetadata" as "root" where 1 = 1 and "root"."id" = 'Imbybe|"DRI#1"#"DRI#1"' select "root"."id" as "id", "root"."deleted" as "deleted", "root"."lastChangedAt" as "lastChangedAt", "root"."version" as "version" from "MutationSyncMetadata" as "root" where 1 = 1 and "root"."id" = 'Imbybe|"DRI#1"#"DRI#1"' Notifying: reconciled resolve(reconciling([AWSPluginsCore.MutationSync(model: AWSPluginsCore.AnyModel(id: "\"DRI#1\"#\"DRI#1\"", instance: ImbybeTestDemo.Imbybe(pk: "DRI#1", sk: "DRI#1", gsi1: Optional("master"), gsisk1: Optional("DRI#1"), name: Optional("Ginger Mint 10"), description: Optional("drink desc"), imageURL: Optional("https://images.pexels.com/photos/338713/pexels-photo-338713.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1"), ordersEmail: nil, type: Optional("BEER"), street: nil, city: nil, state: nil, zipCode: nil, productCost: nil, productCategory: nil, numberOfDrinks: Optional(201), publishDate: nil, expirationDate: nil, eligibleZipCodes: Optional([]), numberOfCampaigns: nil, numberOfOffers: nil, remainingNumberOfCampaigns: nil, productQuantity: nil, primaryProduct: Optional(false), lat: nil, lng: nil, operatingHours: nil, cognitoID: nil, startingNumberOfOffers: nil, remainingNumberOfOffers: nil, campaignStatus: nil, rating: nil, comment: nil, createdAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-06 12:43:37 PM +0000, timeZone: Optional(GMT (fixed)))), updatedAt: Optional(Amplify.Temporal.DateTime(foundationDate: 2024-02-07 3:20:46 PM +0000, timeZone: Optional(GMT (fixed))))), modelName: "Imbybe"), syncMetadata: AWSPluginsCore.MutationSyncMetadata(id: "Imbybe|\"DRI#1\"#\"DRI#1\"", deleted: false, lastChangedAt: 1707319246415, version: 47))]), reconciled) -> finished New state: finished respond(to:): finished

jaymeen-unadkat-differenz commented 8 months ago

@lawmicha have you checked?

lawmicha commented 8 months ago

The logs look good to me and the item appears to be reconciled.

  1. Amplify.DataStore.observeQuery performs a query to generate the first snapshot, if you perform an Amplify.Datastore.query(Imbybe.self), do you get a list of items back including the model that was reconciled? model identifier pk = DRI#1 and sk = DRI#1 ?
  2. Are you holding onto the subscription correctly? For example, if you have a view model object:
actor ViewModel {
   // You must hold a reference to your subscription.
    var imbybeSubscription: AmplifyAsyncThrowingSequence<DataStoreQuerySnapshot<Imbybe>>?

    func subscribeToImbybe() async throws  {
        let imbybeSubscription = Amplify.DataStore.observeQuery(
            for: Imbybe.self
        )

        // hold onto your subscription
        self.imbybeSubscription = imbybeSubscription
        // observe new snapshots
        for try await snapshot in imbybeSubscription {
            print("Snapshot: \(snapshot)")
        }
    }
}
  1. To narrow this down even further, instead of sourcing the mutation from Amplify Studio, can you create it from the iOS app? To fully test a mutation sourced from a different client, you can launch your app on one simulator and then launch the app again on a different simulator. When you have second simulator running, go back to the first and launch the app from the home screen. This way you can see the logs on the second simulator receive the subscription event. Doing this on separate clients is a better test than using one simulator since a locally sourced mutation will also emit an event on the observe/observeQuery APIs. Subscribe to the model from the second simulator before saving the model from the first simulator
jaymeen-unadkat-differenz commented 8 months ago

Now the real-time is working in Observe(Model.self) but not working on ObserveQuery

lawmicha commented 8 months ago

Great to hear Observe API is working as expected. Can you provide more details as to what's not working with ObserveQuery?

  1. Do you have any code snippets to share or can you confirm you are holding onto AmplifyAsyncThrowingSequence?
  2. Do you see the first snapshot?
  3. Locally sourced mutation vs other device. Do you see new snapshots due to locally sourced saves? Use one simulator and perform observeQuery then save. For other device see point (3) from https://github.com/aws-amplify/amplify-swift/issues/3495#issuecomment-1932535330 about using two simulators.
  4. Do you have any logs indicating that an error that occurred?
jaymeen-unadkat-differenz commented 8 months ago

I'm changing the approach actually, I'll keep you updated

lawmicha commented 8 months ago

thanks for letting us know, feel free to open a new issue once you have more details, refer back to this issue if relevant. You can also reach out to us on Discord https://discord.gg/jWVbPfC in swift-help topic

github-actions[bot] commented 8 months ago

⚠️COMMENT VISIBILITY WARNING⚠️

Comments on closed issues are hard for our team to see. If you need more assistance, please open a new issue that references this one. If you wish to keep having a conversation with other community members under this issue feel free to do so.