Запрос GraphQl, основанный на определенном значении поля - PullRequest
0 голосов
/ 04 мая 2019

Я хочу иметь возможность получить последнюю версию из GitHub для определенного репо с помощью API GraphQl.Для этого мне нужно получить последний выпуск, где isDraft и isPrerelease имеют значение false.Мне удалось получить первую часть, но я не могу понять, как выполнить часть запроса «где».

Вот базовый запрос, который я получил (https://developer.github.com/v4/explorer/):

{
  repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
    releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes {
        name
        tagName
        resourcePath
        isDraft
        isPrerelease
      }
    }
  }
}

Что возвращает:

{
  "data": {
    "repository": {
      "releases": {
        "nodes": [
          {
            "name": "3.0.4",
            "tagName": "3.0.4",
            "resourcePath": "/paolosalvatori/ServiceBusExplorer/releases/tag/3.0.4",
            "isDraft": false,
            "isPrerelease": false
          }
        ]
      }
    }
  }
}

Кажется, я не могу найти способ сделать это. Одна из причин в том, что я новичок в GraphQl (впервые пытаюсь сделать запрос), и я не уверенкак сформулировать мой вопрос.

Можно ли «запрашивать» только те типы, которые поддерживают аргументы (например, репозиторий и выпуски ниже)? Похоже, должен быть способ указать фильтр для значений полей.

Репозиторий: https://developer.github.com/v4/object/repository/

Выпуски: https://developer.github.com/v4/object/releaseconnection/

Узел: https://developer.github.com/v4/object/release/

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Может ли один "запрос" только на основе тех типов, которые поддерживают аргументы

Да: GraphQL не определяет общий язык запросов таким же образом, скажем, как SQL.Вы не можете отсортировать или отфильтровать результат поля способами, которые не предоставлены сервером и схемой приложения.

Я хочу иметь возможность получать последние [не черновик, неprerelease] релиз GitHub для конкретного репо с использованием API GraphQl.

Как вы уже нашли, поле releases типа Repository не имеет возможности сортировать или фильтровать эти поля.Вместо этого вы можете перебирать выпуски по одному с несколькими вызовами GraphQL.По отдельности они выглядят так:

query NextRelease($owner: String!, $name: String!, $after: String) {
  repository(owner: $owner, name: $name) {
    releases(first: 1,
             orderBy: {field: CREATED_AT, direction: DESC},
             after: $after) {
      pageInfo { lastCursor }
      nodes { ... ReleaseData } # from the question
    }
  }
}

Запустите это так же, как вы запускаете его сейчас (я разделил информацию, идентифицирующую хранилище, на отдельные переменные GraphQL).Вы можете пропустить переменную after для первого вызова.Если (как в вашем примере) он возвращает "isDraft": false, "isPrerelease": false, то все готово.Если нет, вам нужно повторить попытку: возьмите значение из lastCursor в ответе и выполните тот же запрос, передавая это значение курсора как значение переменной after.

0 голосов
/ 04 мая 2019
  {
  repository(owner: "paolosalvatori", name: "ServiceBusExplorer") {
    releases(first: 1, orderBy: {field: CREATED_AT, direction: DESC}) {
      nodes(isDraft :false , isPrerelease :false ) {
        name
        tagName
        resourcePath
        isDraft
        isPrerelease
      }
    }
  }
}

В качестве альтернативы, пожалуйста, ознакомьтесь с директивами GrqaphQL, так как иногда требуется пропустить или включить в ответ поля на основе значений @skip или @ include

Директива пропуска при использовании вПоля или фрагменты, позволяет нам исключать поля на основе некоторого условия.

Директива include позволяет нам включать поля на основе некоторого условия

Директивы GraphQL

...