Как отфильтровать нескалярный тип в AppSync / Amplify - PullRequest
4 голосов
/ 05 марта 2019

Я использую aws-ampify для определения моей схемы appsync.

У меня есть следующая упрощенная схема:

type Country @model {
  id: ID!
  name: String!
  code: String!
  tracks: [Track] @connection(name: "CountryTrack")
}

type Track @model
  id: ID!
  name: String!
  country: Country! @connection(name: "CountryTrack")
  lng: Float
  lat: Float
  length: Float
  curves: Int
  website: String
  trackImage: String
  information: String
}

Amplify генерирует FilterInput для моделей. Однако он не включает типы подключения.

Я хочу отфильтровать дорожку по стране.

У таблиц динамодабов есть trackCountryId, и в операции сканирования я могу просто фильтровать на основе идентификатора.

Однако это не работает в схеме graphql. Потому что trackCountryId не входит в FiterInput.

Кто-нибудь знает, как обойти это?

1 Ответ

1 голос
/ 12 марта 2019

Amplify CLI создает из коробки listTracks запрос + распознаватель и tracks распознаватель для типа Country.Если вы хотите отфильтровать все дорожки на основе идентификатора страны, вам нужно будет добавить это вручную, выполнив следующие шаги, которые по сути представляют собой сочетание сгенерированных выше обработчиков запросов +:

-> В вашей схеме : добавьте это в type Query, а затем нажмите «Сохранить схему»:

listTracksByCountry(countryId: ID!, limit: Int, nextToken: String, sortDirection: ModelSortDirection): ModelTrackConnection

-> Присоедините Resolver кэто поле запроса, которое вы только что добавили, и нажмите «Сохранить решатель»:

  • Выберите TrackTable в качестве имени источника данных

  • Шаблон RequestMapping :

#set( $limit = $util.defaultIfNull($context.args.limit, 10) )
{
  "version": "2017-02-28",
  "operation": "Query",
  "query": {
      "expression": "#connectionAttribute = :connectionAttribute",
      "expressionNames": {
          "#connectionAttribute": "trackCountryId"
    },
      "expressionValues": {
          ":connectionAttribute": {
              "S": "$context.args.countryId"
      }
    }
  },
  "scanIndexForward":   #if( $context.args.sortDirection )
    #if( $context.args.sortDirection == "ASC" )
true
    #else
false
    #end
  #else
true
  #end,
  "filter":   #if( $context.args.filter )
$util.transform.toDynamoDBFilterExpression($ctx.args.filter)
  #else
null
  #end,
  "limit": $limit,
  "nextToken":   #if( $context.args.nextToken )
"$context.args.nextToken"
  #else
null
  #end,
  "index": "gsi-CountryTrack"
}
  • Шаблон ResponseMapping :
#if( !$result )
  #set( $result = $ctx.result )
#end
$util.toJson($result)

-> Перейдите в раздел Запросы на консоли и выполните следующий запрос:

query {
  listTracksByCountry(countryId: "countryId1") {
    items {
      id
      name
      length
    }
  }
}

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

{
  "data": {
    "listTracksByCountry": {
      "items": [
        {
          "id": "trackId1",
          "name": "track name 1",
          "length": 1.1
        },
        {
          "id": "trackId2",
          "name": "track name 2",
          "length": 1.2
        }
      ]
    }
  }
}

Это очень распространенный вариант использования, поэтому не стесняйтесь создавать проблему здесь , если это не так.еще не существует, и мы можем использовать Amplify CLI (amplify add api), автоматически генерировать эти средства распознавания.

...