157 lines
5.6 KiB
Python
157 lines
5.6 KiB
Python
|
# Copyright (c) 2023 Peace-Maker
|
||
|
from gql import gql, Client
|
||
|
from gql.transport.aiohttp import AIOHTTPTransport
|
||
|
|
||
|
|
||
|
class GithubGQL:
|
||
|
|
||
|
def __init__(self, token):
|
||
|
transport = AIOHTTPTransport(
|
||
|
url="https://api.github.com/graphql",
|
||
|
headers={"Authorization": f"Bearer {token}"})
|
||
|
self.client = Client(transport=transport)
|
||
|
|
||
|
def get_project(self, orga, project_number):
|
||
|
query = gql("""
|
||
|
query getProjectId($login: String!, $projectNumber: Int!){
|
||
|
organization(login: $login) {
|
||
|
projectV2(number: $projectNumber) {
|
||
|
id
|
||
|
fields(first: 100) {
|
||
|
nodes {
|
||
|
... on ProjectV2Field {
|
||
|
id
|
||
|
name
|
||
|
}
|
||
|
... on ProjectV2SingleSelectField {
|
||
|
id
|
||
|
name
|
||
|
options {
|
||
|
id
|
||
|
name
|
||
|
}
|
||
|
}
|
||
|
... on ProjectV2SingleSelectField {
|
||
|
id
|
||
|
name
|
||
|
options {
|
||
|
id
|
||
|
name
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
items(first: 100) {
|
||
|
nodes {
|
||
|
id
|
||
|
fieldValues(first: 100) {
|
||
|
nodes {
|
||
|
... on ProjectV2ItemFieldTextValue {
|
||
|
text
|
||
|
field {
|
||
|
... on ProjectV2FieldCommon {
|
||
|
name
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
... on ProjectV2ItemFieldSingleSelectValue {
|
||
|
name
|
||
|
field {
|
||
|
... on ProjectV2FieldCommon {
|
||
|
name
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
content {
|
||
|
... on DraftIssue {
|
||
|
id
|
||
|
title
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
""")
|
||
|
variables = {"login": orga, "projectNumber": project_number}
|
||
|
result = self.client.execute(query, variable_values=variables)
|
||
|
# TODO: Handle pagination
|
||
|
return result["organization"]["projectV2"]
|
||
|
|
||
|
def add_draft_issue(self, project_id, title, body):
|
||
|
query = gql("""
|
||
|
mutation addDraftIssue($projectId: ID!, $title: String!, $body: String!){
|
||
|
addProjectV2DraftIssue(
|
||
|
input: {
|
||
|
projectId: $projectId,
|
||
|
title: $title,
|
||
|
body: $body
|
||
|
}
|
||
|
) {
|
||
|
projectItem {
|
||
|
id
|
||
|
content {
|
||
|
... on DraftIssue {
|
||
|
id
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
""")
|
||
|
variables = {"projectId": project_id, "title": title, "body": body}
|
||
|
result = self.client.execute(query, variable_values=variables)
|
||
|
return result["addProjectV2DraftIssue"]["projectItem"]
|
||
|
|
||
|
def update_draft_issue(self, issue_id, title, body):
|
||
|
query = gql("""
|
||
|
mutation updateDraftIssue($issueId: ID!, $title: String!, $body: String!){
|
||
|
updateProjectV2DraftIssue(
|
||
|
input: {
|
||
|
draftIssueId: $issueId,
|
||
|
title: $title,
|
||
|
body: $body
|
||
|
}
|
||
|
) {
|
||
|
draftIssue {
|
||
|
id
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
""")
|
||
|
variables = {"issueId": issue_id, "title": title, "body": body}
|
||
|
result = self.client.execute(query, variable_values=variables)
|
||
|
return result["updateProjectV2DraftIssue"]["draftIssue"]["id"]
|
||
|
|
||
|
def update_item_field_value_option(self, project_id, item_id, field_id,
|
||
|
option_id):
|
||
|
query = gql("""
|
||
|
mutation updateDraftIssueStatus($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!){
|
||
|
updateProjectV2ItemFieldValue(
|
||
|
input: {
|
||
|
projectId: $projectId,
|
||
|
itemId: $itemId,
|
||
|
fieldId: $fieldId,
|
||
|
value: {
|
||
|
singleSelectOptionId: $optionId
|
||
|
}
|
||
|
}
|
||
|
) {
|
||
|
projectV2Item {
|
||
|
id
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
""")
|
||
|
variables = {
|
||
|
"projectId": project_id,
|
||
|
"itemId": item_id,
|
||
|
"fieldId": field_id,
|
||
|
"optionId": option_id
|
||
|
}
|
||
|
result = self.client.execute(query, variable_values=variables)
|
||
|
return result["updateProjectV2ItemFieldValue"]["projectV2Item"]["id"]
|