Module: ActiveProject::Adapters::Jira::Transitions

Included in:
ActiveProject::Adapters::JiraAdapter
Defined in:
lib/active_project/adapters/jira/transitions.rb

Instance Method Summary collapse

Instance Method Details

#transition_issue(issue_id_or_key, target_status_name_or_id, options = {}) ⇒ Boolean

Transitions a Jira issue to a new status by finding and executing the appropriate workflow transition.

Parameters:

  • issue_id_or_key (String, Integer)

    The ID or key of the issue.

  • target_status_name_or_id (String, Integer)

    The name or ID of the target status.

  • options (Hash) (defaults to: {})

    Optional parameters for the transition (e.g., :resolution, :comment).

    • :resolution [Hash] e.g., ‘{ name: ’Done’ }‘

    • :comment [String] Comment body to add during transition.

Returns:

  • (Boolean)

    true if successful.

Raises:

  • (NotFoundError)

    if the issue or target transition is not found.

  • (ApiError)

    for other API errors.



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/active_project/adapters/jira/transitions.rb', line 16

def transition_issue(issue_id_or_key, target_status_name_or_id, options = {})
  transitions_path = "/rest/api/3/issue/#{issue_id_or_key}/transitions"
  begin
    response_data = make_request(:get, transitions_path)
  rescue NotFoundError
    raise NotFoundError, "Jira issue '#{issue_id_or_key}' not found."
  end
  available_transitions = response_data["transitions"] || []

  target_transition = available_transitions.find do |t|
    t["id"] == target_status_name_or_id.to_s ||
      t.dig("to", "name")&.casecmp?(target_status_name_or_id.to_s) ||
      t.dig("to", "id") == target_status_name_or_id.to_s
  end

  unless target_transition
    available_names = available_transitions.map { |t| t.dig("to", "name") }.compact.join(", ")
    raise NotFoundError,
          "Target transition '#{target_status_name_or_id}' not found for issue " \
          "'#{issue_id_or_key}'. Available: [#{available_names}]"
  end

  payload = {
    transition: { id: target_transition["id"] }
  }

  if options[:resolution]
    payload[:fields] ||= {}
    payload[:fields][:resolution] = options[:resolution]
  end

  if options[:comment] && !options[:comment].empty?
    payload[:update] ||= {}
    payload[:update][:comment] ||= []
    payload[:update][:comment] << {
      add: {
        body: {
          type: "doc", version: 1,
          content: [ { type: "paragraph", content: [ { type: "text", text: options[:comment] } ] } ]
        }
      }
    }
  end

  make_request(:post, transitions_path, payload.to_json)
  true
rescue Faraday::Error => e
  handle_faraday_error(e)
  raise ApiError.new("Failed to transition Jira issue '#{issue_id_or_key}'", original_error: e)
end