zooniverse/Talk-Api

View on GitHub
app/policies/moderation_policy.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class ModerationPolicy < ApplicationPolicy
  def index?
    logged_in?
  end

  def show?
    moderator? || admin?
  end

  def create?
    logged_in?
  end

  def update?
    moderator? || admin?
  end

  def destroy?
    moderator? || admin?
  end

  def can_action?(action)
    available_actions.include? action.to_sym
  end

  def available_actions
    return [] unless logged_in?
    @available_actions ||= target.class.moderatable.select do |action, roles|
      roles[:all] ||
      (roles[:moderator] && moderator?) ||
      (roles[:admin] && admin?) ||
      (roles[:team] && team?)
    end.keys
  end

  def target
    Array.wrap(record).first.target || (raise ActiveRecord::RecordNotFound.new("Couldn't find target"))
  end

  class Scope < Scope
    def resolve
      if user.roles.where(section: 'zooniverse', name: ['moderator', 'admin']).any?
        scope
      elsif privileged_sections('moderator', 'admin').any?
        scope.where 'section = any(array[:sections])', sections: privileged_sections('moderator', 'admin')
      else
        scope.none
      end
    end
  end
end