cli/api/query_builder.go
2021-04-14 17:28:27 +02:00

188 lines
3.2 KiB
Go

package api
import (
"strings"
)
func squeeze(r rune) rune {
switch r {
case '\n', '\t':
return -1
default:
return r
}
}
func shortenQuery(q string) string {
return strings.Map(squeeze, q)
}
var issueComments = shortenQuery(`
comments(last: 100) {
nodes {
author{login},
authorAssociation,
body,
createdAt,
includesCreatedEdit,
isMinimized,
minimizedReason,
reactionGroups{content,users{totalCount}}
},
totalCount
}
`)
var prReviewRequests = shortenQuery(`
reviewRequests(last: 100) {
nodes {
requestedReviewer {
__typename,
...on User{login},
...on Team{name}
}
},
totalCount
}
`)
var prReviews = shortenQuery(`
reviews(last: 100) {
nodes {
author{login},
authorAssociation,
submittedAt,
body,
state,
reactionGroups{content,users{totalCount}}
}
}
`)
var prFiles = shortenQuery(`
files(first: 100) {
nodes {
additions,
deletions,
path
}
}
`)
var prStatusCheckRollup = shortenQuery(`
commits(last: 1) {
totalCount,
nodes {
commit {
oid,
statusCheckRollup {
contexts(last: 100) {
nodes {
__typename
...on StatusContext {
context,
state,
targetUrl
},
...on CheckRun {
name,
status,
conclusion,
startedAt,
completedAt,
detailsUrl
}
}
}
}
}
}
}
`)
var IssueFields = []string{
"assignees",
"author",
"body",
"closed",
"comments",
"createdAt",
"closedAt",
"id",
"labels",
"milestone",
"number",
"projectCards",
"reactionGroups",
"state",
"title",
"updatedAt",
"url",
}
var PullRequestFields = append(IssueFields,
"additions",
"baseRefName",
"changedFiles",
"deletions",
"files",
"headRefName",
"headRepository",
"headRepositoryOwner",
"isCrossRepository",
"isDraft",
"maintainerCanModify",
"mergeable",
"mergeCommit",
"mergedAt",
"mergedBy",
"mergeStateStatus",
"potentialMergeCommit",
"reviewDecision",
"reviewRequests",
"reviews",
"statusCheckRollup",
)
func PullRequestGraphQL(fields []string) string {
var q []string
for _, field := range fields {
switch field {
case "author":
q = append(q, `author{login}`)
case "mergedBy":
q = append(q, `mergedBy{login}`)
case "headRepositoryOwner":
q = append(q, `headRepositoryOwner{login}`)
case "headRepository":
q = append(q, `headRepository{name}`)
case "assignees":
q = append(q, `assignees(first:100){nodes{login},totalCount}`)
case "labels":
q = append(q, `labels(first:100){nodes{name},totalCount}`)
case "projectCards":
q = append(q, `projectCards(first:100){nodes{project{name}column{name}},totalCount}`)
case "milestone":
q = append(q, `milestone{title}`)
case "reactionGroups":
q = append(q, `reactionGroups{content,users{totalCount}}`)
case "mergeCommit":
q = append(q, `mergeCommit{oid}`)
case "potentialMergeCommit":
q = append(q, `potentialMergeCommit{oid}`)
case "comments":
q = append(q, issueComments)
case "reviewRequests":
q = append(q, prReviewRequests)
case "reviews":
q = append(q, prReviews)
case "files":
q = append(q, prFiles)
case "statusCheckRollup":
q = append(q, prStatusCheckRollup)
default:
q = append(q, field)
}
}
return strings.Join(q, ",")
}