Как передать результат (ответ) запроса GraphQL на мутацию в качестве аргумента (ввода)? - PullRequest
0 голосов
/ 28 мая 2020

Я создаю приложение cli, используя GitHub API V4. Мне нужно удалить все метки, которые есть в репозитории.

URL: https://api.github.com/graphql

HEADERS:

  • Принять: application / vnd.github.bane-preview + json
  • Авторизация: предъявитель <GITHUB_TOKEN>

Мне нужно получить результат GetLabelID запрос и поместите его в id при DeleteLabels мутации.

query GetLabelID {
  repository(owner: "erdaltsksn", name: "playground") {
    labels(first:100) {
      nodes {
        id
      }
    }
  }
}

mutation DeleteLabels {
  deleteLabel(input: {
    id: "<ID_SHOULD_BE_HERE>"
  }) {
    clientMutationId
  }
}

ВЫХОД:

{
  "data": {
    "repository": {
      "labels": {
        "nodes": [
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDgy"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDg0"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDg2"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDg4"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDkw"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDkz"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDk1"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDk3"
          },
          {
            "id": "MDU6TGFiZWwyMDg5MzQ0MDk5"
          }
        ]
      }
    }
  }
}

Результат мутации DeleteLabels когда я набираю ID вручную.

{
  "data": {
    "deleteLabel": {
      "clientMutationId": null
    }
  }
}

На стороне клиента я использую Golang с machinebox / graphql. Одним из возможных решений может быть решение этой проблемы путем отправки двух разных запросов на стороне клиента и получения результатов. Я не уверен, что это лучшее решение или нет.

Мой GO Код:

package main

import (
    "context"
    "fmt"
    "os"
    "strings"

    "github.com/gookit/color"
    "github.com/machinebox/graphql"
)

func main() {
    RemoveLabels("erdaltsksn/playground")
}

func RemoveLabels(repository string) {
    repo := strings.Split(repository, "/")

    data := graphqlQuery(fmt.Sprintf(`
        query {
            repository(owner: "%s", name: "%s") {
                labels(first:100) {
                    totalCount
                    nodes {
                        id
                    }
                }
            }
        }
    `, repo[0], repo[1]))

    fmt.Println(data)
}

type graphqlQueryResponse struct {
    Repository struct {
        ID     string `json:"id,omitempty"`
        Labels struct {
            TotalCount int `json:"totalCount,omitempty"`
            Nodes      []struct {
                ID          string `json:"id,omitempty"`
                Name        string `json:"name,omitempty"`
                Color       string `json:"color,omitempty"`
                Description string `json:"description,omitempty"`
            } `json:"nodes,omitempty"`
        } `json:"labels,omitempty"`
    } `json:"repository,omitempty"`
}

var graphqlClient = graphql.NewClient("https://api.github.com/graphql")

func graphqlQuery(q string) graphqlQueryResponse {
    graphqlRequest := graphql.NewRequest(q)
    graphqlRequest.Header.Set("Authorization", "bearer MY_GITHUB_API")
    graphqlRequest.Header.Set("Accept", "application/vnd.github.bane-preview+json")

    var data graphqlQueryResponse
    if err := graphqlClient.Run(context.Background(), graphqlRequest, &data); err != nil {
        color.Danger.Println("There is a problem while querying GitHub API v4")
        color.Warn.Prompt(err.Error())
        os.Exit(1)
    }

    return data
}

GO вывод:

{
    {
        {
            8
            [
                {
                    MDU6TGFiZWwyMDg5MzQ0MDgy
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDg0
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDg2
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDg4
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDkw
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDkz
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDk1
                }
                {
                    MDU6TGFiZWwyMDg5MzQ0MDk3
                }
            ]
        }
    }
}

Я мог бы создать два разных запроса и использовать их для удаления каждого тега один за другим. Но я думаю, что это плохая идея. Я ищу альтернативу или лучший способ сделать это.

Заранее благодарим за любую помощь.

Ссылки:

...