Class: LinearApi::Issue

Inherits:
Object
  • Object
show all
Defined in:
lib/linear_api/issue.rb

Overview

Represents a Linear issue

Constant Summary collapse

CREATE_MUTATION =

==========================================================================

GraphQL Mutations

<<~GRAPHQL
  mutation CreateIssue($input: IssueCreateInput!) {
    issueCreate(input: $input) {
      success
      issue {
        id
        identifier
        title
        url
        priority
        dueDate
        estimate
        state {
          id
          name
        }
      }
    }
  }
GRAPHQL
UPDATE_MUTATION =
<<~GRAPHQL
  mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
    issueUpdate(id: $id, input: $input) {
      success
      issue {
        id
        identifier
        title
        priority
        dueDate
        estimate
        state {
          id
          name
        }
        labels {
          nodes {
            id
            name
          }
        }
      }
    }
  }
GRAPHQL
ADD_COMMENT_MUTATION =
<<~GRAPHQL
  mutation AddComment($issueId: String!, $body: String!) {
    commentCreate(input: { issueId: $issueId, body: $body }) {
      success
      comment {
        id
        body
        createdAt
      }
    }
  }
GRAPHQL
ARCHIVE_MUTATION =
<<~GRAPHQL
  mutation ArchiveIssue($id: String!) {
    issueArchive(id: $id) {
      success
    }
  }
GRAPHQL
UNARCHIVE_MUTATION =
<<~GRAPHQL
  mutation UnarchiveIssue($id: String!) {
    issueUnarchive(id: $id) {
      success
    }
  }
GRAPHQL
<<~GRAPHQL
  mutation LinkPR($issueId: String!, $url: String!) {
    attachmentLinkURL(issueId: $issueId, url: $url) {
      success
      attachment {
        id
        url
      }
    }
  }
GRAPHQL
GET_BY_IDENTIFIER_QUERY =

Direct lookup by identifier (exact match, replaces search-based lookup)

<<~GRAPHQL
  query GetIssueByIdentifier($filter: IssueFilter!) {
    issues(filter: $filter, first: 1) {
      nodes {
        id
        identifier
        title
        description
        url
        priority
        dueDate
        estimate
        state {
          id
          name
          type
        }
        labels {
          nodes {
            id
            name
          }
        }
        assignee {
          id
          name
        }
        project {
          id
          name
        }
        comments {
          nodes {
            id
            body
            createdAt
            user {
              name
            }
          }
        }
      }
    }
  }
GRAPHQL
SEARCH_QUERY =

Full-text search (use search_issues for fuzzy matching)

<<~GRAPHQL
  query SearchIssues($term: String!, $first: Int!) {
    searchIssues(term: $term, first: $first) {
      nodes {
        id
        identifier
        title
        description
        url
        priority
        dueDate
        estimate
        state {
          id
          name
          type
        }
        labels {
          nodes {
            id
            name
          }
        }
        assignee {
          id
          name
        }
        project {
          id
          name
        }
      }
    }
  }
GRAPHQL
LIST_QUERY =
<<~GRAPHQL
  query ListIssues($teamId: String!, $first: Int!) {
    team(id: $teamId) {
      issues(first: $first, orderBy: updatedAt) {
        nodes {
          id
          identifier
          title
          priority
          dueDate
          estimate
          state {
            id
            name
            type
          }
          labels {
            nodes {
              id
              name
            }
          }
        }
      }
    }
  }
GRAPHQL
LIST_PAGINATED_QUERY =
<<~GRAPHQL
  query ListIssuesPaginated($teamId: String!, $first: Int!, $after: String) {
    team(id: $teamId) {
      issues(first: $first, after: $after, orderBy: updatedAt) {
        nodes {
          id
          identifier
          title
          priority
          dueDate
          estimate
          state {
            id
            name
            type
          }
          labels {
            nodes {
              id
              name
            }
          }
        }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
GRAPHQL
GET_BY_ID_QUERY =
<<~GRAPHQL
  query GetIssueById($id: String!) {
    issue(id: $id) {
      id
      identifier
      title
      description
      url
      priority
      dueDate
      estimate
      state {
        id
        name
        type
      }
      labels {
        nodes {
          id
          name
        }
      }
      assignee {
        id
        name
      }
      project {
        id
        name
      }
    }
  }
GRAPHQL
BATCH_GET_QUERY =
<<~GRAPHQL
  query BatchGetIssues($filter: IssueFilter!) {
    issues(filter: $filter) {
      nodes {
        id
        identifier
        title
        priority
        dueDate
        estimate
        state {
          id
          name
          type
        }
        labels {
          nodes {
            id
            name
          }
        }
        assignee {
          id
          name
        }
      }
    }
  }
GRAPHQL
SUB_ISSUES_QUERY =
<<~GRAPHQL
  query GetSubIssues($id: String!) {
    issue(id: $id) {
      children {
        nodes {
          id
          identifier
          title
          state {
            id
            name
          }
          priority
        }
      }
    }
  }
GRAPHQL

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data) ⇒ Issue

Returns a new instance of Issue.



337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
# File 'lib/linear_api/issue.rb', line 337

def initialize(data)
  @raw = data
  @id = data['id']
  @identifier = data['identifier']
  @title = data['title']
  @description = data['description']
  @url = data['url']
  @priority = data['priority']
  @due_date = data['dueDate']
  @estimate = data['estimate']
  @state = data['state']
  @labels = (data.dig('labels', 'nodes') || [])
  @assignee = data['assignee']
  @project = data['project']
  @comments = (data.dig('comments', 'nodes') || [])
end

Instance Attribute Details

#assigneeObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def assignee
  @assignee
end

#commentsObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def comments
  @comments
end

#descriptionObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def description
  @description
end

#due_dateObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def due_date
  @due_date
end

#estimateObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def estimate
  @estimate
end

#idObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def id
  @id
end

#identifierObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def identifier
  @identifier
end

#labelsObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def labels
  @labels
end

#priorityObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def priority
  @priority
end

#projectObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def project
  @project
end

#rawObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def raw
  @raw
end

#stateObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def state
  @state
end

#titleObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def title
  @title
end

#urlObject (readonly)

==========================================================================

Model



333
334
335
# File 'lib/linear_api/issue.rb', line 333

def url
  @url
end

Instance Method Details

#label_namesObject



358
359
360
# File 'lib/linear_api/issue.rb', line 358

def label_names
  labels.map { |l| l['name'] }
end

#state_nameObject



354
355
356
# File 'lib/linear_api/issue.rb', line 354

def state_name
  state&.dig('name')
end

#to_hObject



362
363
364
365
366
367
368
369
370
371
372
373
374
375
# File 'lib/linear_api/issue.rb', line 362

def to_h
  {
    id: id,
    identifier: identifier,
    title: title,
    description: description,
    url: url,
    priority: priority,
    due_date: due_date,
    estimate: estimate,
    state: state_name,
    labels: label_names
  }
end