mumuki/mumuki-domain

View on GitHub
app/models/concerns/with_responsible_moderator.rb

Summary

Maintainability
A
0 mins
Test Coverage
module WithResponsibleModerator
  extend ActiveSupport::Concern

  MODERATOR_MAX_RESPONSIBLE_TIME = 45.minutes

  def toggle_responsible!(moderator)
    if responsible?(moderator)
      no_responsible!
    elsif no_current_responsible?
      responsible! moderator
    end
  end

  def any_responsible?
    responsible_moderator_at.present? && (responsible_moderator_at + MODERATOR_MAX_RESPONSIBLE_TIME).future?
  end

  def no_current_responsible?
    !any_responsible?
  end

  def responsible?(moderator)
    any_responsible? && responsible_moderator_by == moderator
  end

  def current_responsible_visible_for?(user)
    user&.moderator_here? && any_responsible?
  end

  def can_toggle_responsible?(user)
    can_have_responsible? && user_can_be_responsible?(user)
  end

  private

  def responsible!(moderator)
    update! responsible_moderator_at: Time.current, responsible_moderator_by: moderator
  end

  def no_responsible!
    update! responsible_moderator_at: nil, responsible_moderator_by: nil
  end

  def user_can_be_responsible?(user)
    user&.moderator_here? && (no_current_responsible? || responsible?(user))
  end

  def can_have_responsible?
    opened? || pending_review?
  end
end