AWS Amplify Graphql запрос на @connection - PullRequest
1 голос
/ 17 апреля 2019

Я использую AWS Amplify (с Cli и Angular 7 для внешнего интерфейса) для Graphql / AppSync и задаюсь вопросом, как получить все подключенные элементы, когда он превышает 10 элементов?

Допустим, я создал схему.GraphQL, как это:

type User @model {
  id: ID!
  firstname: String
  lastname: String
  project: Project @connection(name: "ProjectUsers")
}

type Project @model {
  id: ID!
  title: String
  task: String
  members: [User] @connection(name: "ProjectUsers")
}

При запуске амплификации push он генерирует запросы и мутации.При выполнении запроса GetProject с идентификатором проекта (из сгенерированного файла API.service.ts) он возвращает элемент Project с подключенными пользователями.Но если в проекте более 10 пользователей, он дает мне только 10 первых пользователей и следующий токен:

{
  id: "67b1fc0a-fd1f-4e8b-9bd7-b82b2aea5d3b",
  title: "Test",
  task: "test",
  members: {
    items: {
      0: {__typename: "User", id: "f245809a...}
      1: ...
      (2-8: ...)
      9: ...
      nextToken: "qwerj23r2kj....3223oop32kjo",
       __typename: "ModelUserConnection";
    }
  }
  __typename: "Project"
}

Я вижу несколько решений для этого, но не как их сделать:

  1. Можно ли изменить schema.grapql, чтобы изменить кодоген, чтобы он мог генерировать возможность изменять предел, напр.100 вместо стандартного 10?

  2. Использовать nextToken для разбивки результатов из сгенерированного файла API.service.ts?

  3. Изменитьфайл schema.graphql, чтобы сгенерированный ModelUserFilterInput имел поле userProjectId (для использования в сгенерированном запросе ListUsers)?

Или есть какие-либо другие решения для получения всех пользователей проектас запросами в автоматически сгенерированном файле (API.service.ts)?

На данный момент единственное решение, которое я вижу, это сначала выполнить запрос ListUsers (без каких-либо фильтров), а затем выполнить цикл по всемих проверить, если он имеет правильный идентификатор проекта.Но если база данных пользователей велика, это может вырасти до большого количества данных и быть очень медленным, а преимуществ использования @connection на самом деле нет.

Извините за длинный пост, и я надеюсь, что я объяснилпроблема достаточно.

1 Ответ

1 голос
/ 17 апреля 2019

А) Измените ваш запрос

query {
  getProjet(id: "123") {
    id
    members(limit: 50) {
      items {
        firstname
      }
    }
 }

B) Прикрепите резольвер

В консоли AWS AppSync в правой части раздела Схема. Чтобы отфильтровать по UserConnection или подобному, найдите UserConnection.items и нажмите Attach.

1) Источник данных: UserTable0

2) Запрос шаблона сопоставления: ListItems

{
    "version" : "2017-02-28",
    "operation" : "Scan",
    "limit": $util.defaultIfNull(${ctx.args.limit}, 50),
    "nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
}

Использовать лимит, приходящий в качестве аргумента ctx.args.limit или, если его значение пусто, 50.

3) Шаблон отображения ответов

$util.toJson($ctx.result.items)

Делая это, вы можете изменить способ сканирования / извлечения базовой таблицы.

C) Пагинат

Другим решением будет разбиение на страницы на уровне приложения и ограничение в 10 пунктов.

Примечание. Возможно, мне не хватает других решений.

Обновление: использовать это решение вместе с Amplify Console.

Теперь вы можете обновлять свои средства распознавания локально и использовать CLI Amplify, чтобы загружать обновления в свою учетную запись. Вот как это работает.

После создания вашего AWS AppSync API у вас будет новая пустая папка с именем resolvers, созданная в вашем проекте Amplify в папке API. Чтобы создать собственный распознаватель, создайте файл (т.е. Query.getTodo.req.vtl ) в каталоге resolvers вашего проекта API. В следующий раз, когда вы запустите ampify push или ampify api gql-compile, вместо автоматически созданного шаблона будет использоваться ваш шаблон резолвера. Вы также можете создать файл Query.getTodo.res.vtl , чтобы изменить поведение шаблона сопоставления ответов распознавателя.

<amplify-app>
    |_ amplify
      |_ .config
      |_ #current-cloud-backend
      |_ backend
        |_ api
          |_ resolvers
             Query.getProject.req.vtl
             Query.getProject.res.vtl
      team-provider-info.json

Подробнее, 11 февраля 2019

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...