Для чего нужен входной параметр $ condition в мутации GraphQL, созданной с помощью интерфейса командной строки AWS Amplify?

Я создал простой GraphQL API на AWS AppSync (используя CLI) из этой модели:

type WalletProperty @model {
    id: ID!
    title: String!
}

Это сгенерировало мутации CreateWalletProperty, UpdateWalletProperty и DeleteWalletProperty, похожие на следующие:

  mutation CreateWalletProperty(
    $input: CreateWalletPropertyInput!
    $condition: ModelWalletPropertyConditionInput    <<<<<<<<<<<<  what is this for?
  ) {
    createWalletProperty(input: $input, condition: $condition) {
      id
      title
      createdAt
      updatedAt
    }
  }

а схема условия:

input ModelWalletPropertyConditionInput {
  title: ModelStringInput
  and: [ModelWalletPropertyConditionInput]
  or: [ModelWalletPropertyConditionInput]
  not: ModelWalletPropertyConditionInput
}

Учитывая, что я всегда должен указывать обязательный $ input, для чего нужен параметр $ condition?


person Lukas Rossa    schedule 02.09.2020    source источник
comment
не отмечен остроумием !, то не является обязательным / необязательным ... необязательный параметр для фильтрации затронутых строк / элементов   -  person xadm    schedule 02.09.2020
comment
@xadm, спасибо. Я только что протестировал его, и, похоже, он применяется вместе с входным параметром. Учитывая, что $ input уже является обязательным, я не могу придумать варианта использования, где это действительно имеет смысл или может быть применено?   -  person Lukas Rossa    schedule 02.09.2020
comment
не для создания, а для обновления ...   -  person xadm    schedule 02.09.2020


Ответы (1)


В моем случае выше GraphQL поддерживается таблицей DynamoDB;

За кулисами операции GraphQL преобразуются в операции PutItem, UpdateItem и DeleteItem DynamoDB.

Для этих операций манипулирования данными DynamoDB API позволяет указать выражение условия, чтобы определить, какие элементы следует изменить. Если выражение условия истинно, операция завершается успешно; в противном случае операция завершится неудачно.

Дополнительные сведения о вариантах использования для каждого из этих условий можно найти на AWS Выражения условий DynamoDB, руководство для разработчиков

На уровне мутации GraphQL, только если запись соответствует условию, мутация будет продолжена. В противном случае мутация не допускается и возвращается исключение ConditionalCheckFailedException:

"errors": [
    {
      "path": [
        "deleteWalletProperty"
      ],
      "data": null,
      "errorType": "DynamoDB:ConditionalCheckFailedException",
      "errorInfo": null,
      "locations": [
        {
          "line": 12,
          "column": 3,
          "sourceName": null
        }
      ],
      "message": "The conditional request failed (Service: DynamoDb, Status Code: 400, Request ID: E3PR9OM6M5J1QBHKNT8E4SM1DJVV4KQNSO5AEMVJF66Q9ASUAAJG, Extended Request ID: null)"
    }
  ]
person Lukas Rossa    schedule 03.09.2020