issue.rb 1.13 KB
class Issue
  include ActiveModel::Model
  attr_accessor :problem, :user, :body

  def issue_tracker
    @issue_tracker ||= problem.app.issue_tracker
  end

  def tracker
    @tracker ||= issue_tracker && issue_tracker.tracker
  end

  def render_body_args
    if tracker.respond_to?(:render_body_args)
      tracker.render_body_args
    else
      [ 'issue_trackers/issue', formats: [:md] ]
    end
  end

  def title
    if tracker.respond_to?(:title)
      tracker.title
    else
      "[#{ problem.environment }][#{ problem.where }] #{problem.message.to_s.truncate(100)}"
    end
  end

  def save
    errors.add :base, "The issue has no body" unless body
    errors.add :base, "This app has no issue tracker" unless issue_tracker
    return false if errors.present?

    tracker.errors.each { |k, err| errors.add k, err }
    return false if errors.present?

    url = issue_tracker.create_issue(title, body, user: user.as_document)
    problem.update_attributes(issue_link: url, issue_type: tracker.class.label)

    errors.empty?
  rescue => ex
    errors.add :base, "There was an error during issue creation: #{ex.message}"
    false
  end
end