Class: Ticket::Replicator::TicketStatusTransitioner

Inherits:
Object
  • Object
show all
Defined in:
lib/ticket/replicator/ticket_status_transitioner.rb

Overview

Assumption: The ticket workflow allows for transitioning to any other status.

Constant Summary collapse

StatusTransitionerError =
Class.new(StandardError)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(ticket) ⇒ TicketStatusTransitioner

Returns a new instance of TicketStatusTransitioner.



11
12
13
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 11

def initialize(ticket)
  @ticket = ticket
end

Instance Attribute Details

#ticketObject (readonly)

Returns the value of attribute ticket.



9
10
11
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 9

def ticket
  @ticket
end

Instance Method Details

#available_transitionsObject



48
49
50
51
52
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 48

def available_transitions
  response = tool.jira_client.get(tool.jira_url("/rest/api/2/issue/#{ticket.key}?expand=transitions"))

  JSON.parse(response.body).fetch("transitions")
end

#build_error_message(message) ⇒ Object



44
45
46
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 44

def build_error_message(message)
  message + " in #{available_transitions.collect { |t| "#{t["name"]} => #{t["to"]["name"]}" }.inspect}."
end

#http_headersObject



54
55
56
57
58
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 54

def http_headers
  {
    "Content-Type" => "application/json"
  }
end

#toolObject



15
16
17
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 15

def tool
  @tool ||= ticket.jira_auto_tool
end

#transition_payload_for(status) ⇒ Object



37
38
39
40
41
42
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 37

def transition_payload_for(status)
  transition = available_transitions.find { |transition| transition.fetch("to").fetch("name") == status } or
    raise StatusTransitionerError, build_error_message("No transition found for #{status.inspect}")

  { transition: { id: transition["id"] } }.to_json
end

#transition_to(status) ⇒ Object



19
20
21
22
23
24
25
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 19

def transition_to(status)
  return if status == ticket.status

  ticket.jira_client.post(ticket.jira_auto_tool.jira_url("/rest/api/2/issue/#{ticket.key}/transitions"),
                          transition_payload_for(status),
                          http_headers)
end

#transition_to_not_doneObject



27
28
29
30
31
32
33
34
35
# File 'lib/ticket/replicator/ticket_status_transitioner.rb', line 27

def transition_to_not_done
  not_done_status =
    available_transitions.find do |transition|
      transition.fetch("to").fetch("statusCategory").fetch("key") != "done"
    end or
    raise StatusTransitionerError, build_error_message("No non-done transition found")

  transition_to(not_done_status.fetch("to").fetch("name"))
end