70 lines
1.5 KiB
Ruby
70 lines
1.5 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class ResourceMilestoneEventFinder
|
||
|
include FinderMethods
|
||
|
|
||
|
MAX_PER_PAGE = 100
|
||
|
|
||
|
attr_reader :params, :current_user, :eventable
|
||
|
|
||
|
def initialize(current_user, eventable, params = {})
|
||
|
@current_user = current_user
|
||
|
@eventable = eventable
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
Kaminari.paginate_array(visible_events)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def visible_events
|
||
|
@visible_events ||= visible_to_user(events)
|
||
|
end
|
||
|
|
||
|
def events
|
||
|
@events ||= eventable.resource_milestone_events.include_relations.page(page).per(per_page)
|
||
|
end
|
||
|
|
||
|
def visible_to_user(events)
|
||
|
events.select { |event| visible_for_user?(event) }
|
||
|
end
|
||
|
|
||
|
def visible_for_user?(event)
|
||
|
milestone = event_milestones[event.milestone_id]
|
||
|
return if milestone.blank?
|
||
|
|
||
|
parent = milestone.parent
|
||
|
parent_availabilities[key_for_parent(parent)]
|
||
|
end
|
||
|
|
||
|
def parent_availabilities
|
||
|
@parent_availabilities ||= relevant_parents.to_h do |parent|
|
||
|
[key_for_parent(parent), Ability.allowed?(current_user, :read_milestone, parent)]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def key_for_parent(parent)
|
||
|
"#{parent.class.name}_#{parent.id}"
|
||
|
end
|
||
|
|
||
|
def event_milestones
|
||
|
@milestones ||= events.map(&:milestone).uniq.to_h do |milestone|
|
||
|
[milestone.id, milestone]
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def relevant_parents
|
||
|
@relevant_parents ||= event_milestones.map { |_id, milestone| milestone.parent }
|
||
|
end
|
||
|
|
||
|
def per_page
|
||
|
[params[:per_page], MAX_PER_PAGE].compact.min
|
||
|
end
|
||
|
|
||
|
def page
|
||
|
params[:page] || 1
|
||
|
end
|
||
|
end
|