rubygems/rubygems.org

View on GitHub
app/models/ownership_request.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class OwnershipRequest < ApplicationRecord
  belongs_to :rubygem
  belongs_to :user
  belongs_to :ownership_call, optional: true
  belongs_to :approver, class_name: "User", optional: true

  validates :rubygem_id, :user_id, :status, :note, presence: true
  validates :note, length: { maximum: Gemcutter::MAX_TEXT_FIELD_LENGTH }
  validates :user_id, uniqueness: { scope: :rubygem_id, conditions: -> { opened } }

  delegate :name, to: :user, prefix: true
  delegate :name, to: :rubygem, prefix: true

  enum status: { opened: 0, approved: 1, closed: 2 }

  def approve(approver)
    return false unless rubygem.owned_by?(approver)
    return false unless update(status: :approved, approver: approver)

    Ownership.create_confirmed(rubygem, user, approver)
  end

  def close(user)
    can_close?(user) && update(status: :closed)
  end

  def self.close_all
    closed_ids = ids
    return false unless update_all(status: :closed) == closed_ids.size
    closed_ids.each do |id|
      OwnersMailer.ownership_request_closed(id).deliver_later
    end
    true
  end

  private

  def can_close?(user)
    self.user == user || rubygem.owned_by?(user)
  end
end