Module: PlanMyStuff::GraphQL::Queries

Defined in:
lib/plan_my_stuff/graphql/queries.rb

Overview

Consolidated GitHub GraphQL queries and mutations used by the gem. Strings are static (no runtime parameterization) so they live as frozen String constants rather than methods.

Callers pass the constant straight to PlanMyStuff.client.graphql:

PlanMyStuff.client.graphql(
  PMS::GraphQL::Queries::DELETE_PROJECT_ITEM,
  variables: { projectId: ..., itemId: ... },
)

Constant Summary collapse

ORG_ID =

— Organization / project lookup ———————————

<<~GRAPHQL
  query($org: String!) {
    organization(login: $org) {
      id
    }
  }
GRAPHQL
PROJECT_ID =
<<~GRAPHQL
  query($org: String!, $number: Int!) {
    organization(login: $org) {
      projectV2(number: $number) {
        id
      }
    }
  }
GRAPHQL
USER_NODE_ID =
<<~GRAPHQL
  query($login: String!) {
    user(login: $login) {
      id
    }
  }
GRAPHQL
LIST_PROJECTS =

— Project list / find ——————————————-

<<~GRAPHQL
  query($org: String!) {
    organization(login: $org) {
      projectsV2(first: 100) {
        nodes {
          id
          number
          title
          shortDescription
          readme
          url
          closed
          updatedAt
        }
      }
    }
  }
GRAPHQL
FIND_PROJECT =
<<~GRAPHQL
  query($org: String!, $number: Int!, $cursor: String) {
    organization(login: $org) {
      projectV2(number: $number) {
        id
        number
        title
        shortDescription
        readme
        url
        closed
        updatedAt
        fields(first: 50) {
          nodes {
            ... on ProjectV2SingleSelectField {
              id
              name
              options {
                id
                name
              }
            }
            ... on ProjectV2Field {
              id
              name
            }
            ... on ProjectV2IterationField {
              id
              name
            }
          }
        }
        items(first: 100, after: $cursor) {
          pageInfo {
            hasNextPage
            endCursor
          }
          nodes {
            id
            type
            content {
              ... on Issue {
                id
                title
                number
                url
                state
                repository { nameWithOwner }
              }
              ... on PullRequest {
                id
                title
                number
                url
                state
                repository { nameWithOwner }
              }
              ... on DraftIssue {
                id
                title
                body
              }
            }
            fieldValues(first: 20) {
              nodes {
                ... on ProjectV2ItemFieldSingleSelectValue {
                  name
                  field {
                    ... on ProjectV2SingleSelectField {
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldTextValue {
                  text
                  field {
                    ... on ProjectV2Field {
                      name
                    }
                  }
                }
                ... on ProjectV2ItemFieldUserValue {
                  users(first: 10) {
                    nodes {
                      login
                    }
                  }
                  field {
                    ... on ProjectV2Field {
                      name
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
GRAPHQL
CREATE_PROJECT =

— Project mutations ———————————————

<<~GRAPHQL
  mutation($input: CreateProjectV2Input!) {
    createProjectV2(input: $input) {
      projectV2 {
        id
        number
      }
    }
  }
GRAPHQL
COPY_PROJECT_V2 =
<<~GRAPHQL
  mutation($input: CopyProjectV2Input!) {
    copyProjectV2(input: $input) {
      projectV2 {
        id
        number
      }
    }
  }
GRAPHQL
UPDATE_PROJECT =
<<~GRAPHQL
  mutation($input: UpdateProjectV2Input!) {
    updateProjectV2(input: $input) {
      projectV2 {
        id
        number
      }
    }
  }
GRAPHQL
ADD_ITEM =

— Project item mutations —————————————-

<<~GRAPHQL
  mutation($projectId: ID!, $contentId: ID!) {
    addProjectV2ItemById(input: {
      projectId: $projectId,
      contentId: $contentId
    }) {
      item {
        id
      }
    }
  }
GRAPHQL
ADD_DRAFT_ITEM =
<<~GRAPHQL
  mutation($projectId: ID!, $title: String!, $body: String) {
    addProjectV2DraftIssue(input: {
      projectId: $projectId,
      title: $title,
      body: $body
    }) {
      projectItem {
        id
        content { ... on DraftIssue { id body } }
      }
    }
  }
GRAPHQL
UPDATE_SINGLE_SELECT_FIELD =
<<~GRAPHQL
  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $optionId: String!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId,
      itemId: $itemId,
      fieldId: $fieldId,
      value: { singleSelectOptionId: $optionId }
    }) {
      projectV2Item {
        id
      }
    }
  }
GRAPHQL
UPDATE_TEXT_FIELD =
<<~GRAPHQL
  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $value: String!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId,
      itemId: $itemId,
      fieldId: $fieldId,
      value: { text: $value }
    }) {
      projectV2Item {
        id
      }
    }
  }
GRAPHQL
CREATE_PROJECT_V2_FIELD =
<<~GRAPHQL
  mutation($input: CreateProjectV2FieldInput!) {
    createProjectV2Field(input: $input) {
      projectV2Field {
        ... on ProjectV2Field {
          id
          name
        }
        ... on ProjectV2SingleSelectField {
          id
          name
        }
      }
    }
  }
GRAPHQL
DELETE_PROJECT_V2_FIELD =
<<~GRAPHQL
  mutation($input: DeleteProjectV2FieldInput!) {
    deleteProjectV2Field(input: $input) {
      projectV2Field {
        ... on ProjectV2Field {
          id
        }
        ... on ProjectV2SingleSelectField {
          id
        }
      }
    }
  }
GRAPHQL
UPDATE_DATE_FIELD =
<<~GRAPHQL
  mutation($projectId: ID!, $itemId: ID!, $fieldId: ID!, $date: Date!) {
    updateProjectV2ItemFieldValue(input: {
      projectId: $projectId,
      itemId: $itemId,
      fieldId: $fieldId,
      value: { date: $date }
    }) {
      projectV2Item {
        id
      }
    }
  }
GRAPHQL
DELETE_PROJECT_ITEM =
<<~GRAPHQL
  mutation($projectId: ID!, $itemId: ID!) {
    deleteProjectV2Item(input: {
      projectId: $projectId,
      itemId: $itemId
    }) {
      deletedItemId
    }
  }
GRAPHQL
ASSIGN_DRAFT =
<<~GRAPHQL
  mutation($draftIssueId: ID!, $assigneeIds: [ID!]) {
    updateProjectV2DraftIssue(input: {
      draftIssueId: $draftIssueId,
      assigneeIds: $assigneeIds
    }) {
      draftIssue { id }
    }
  }
GRAPHQL
FETCH_DUPLICATE_OF =

— Issue relationships ——————————————-

Sub-issues (parent / sub_tickets) and issue dependencies (blocking / blocked_by) are both handled via REST in Issue:

  • /repos/{owner}/{repo}/issues/{number}/parent

  • /repos/{owner}/{repo}/issues/{number}/sub_issues

  • /repos/{owner}/{repo}/issues/{number}/sub_issue (DELETE)

  • /repos/{owner}/{repo}/issues/{number}/dependencies/{side}

Only duplicate_of still uses GraphQL.

<<~GRAPHQL
  query($owner: String!, $repo: String!, $number: Int!) {
    repository(owner: $owner, name: $repo) {
      issue(number: $number) {
        stateReason
        duplicateOf {
          number
          repository {
            nameWithOwner
          }
        }
      }
    }
  }
GRAPHQL
CLOSE_AS_DUPLICATE =
<<~GRAPHQL
  mutation($issueId: ID!, $duplicateIssueId: ID!) {
    closeIssue(input: {
      issueId: $issueId,
      stateReason: DUPLICATE,
      duplicateIssueId: $duplicateIssueId
    }) {
      issue {
        number
        stateReason
      }
    }
  }
GRAPHQL
LIST_ISSUE_PROJECT_ITEMS =

— Archive support ———————————————–

<<~GRAPHQL
  query($owner: String!, $repo: String!, $number: Int!, $cursor: String) {
    repository(owner: $owner, name: $repo) {
      issue(number: $number) {
        projectItems(first: 50, after: $cursor) {
          pageInfo { hasNextPage endCursor }
          nodes {
            id
            project { id number }
          }
        }
      }
    }
  }
GRAPHQL