Запрос GraphQl, основанный на определенном значении поля

Я хочу иметь возможность получить последний выпуск из 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 ответа

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

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

Я хочу иметь возможность получить последнюю версию [без черновика, без предварительной версии] из 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 значение переменной.

  {
  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.

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

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

Директивы GraphQL

Другие вопросы по тегам