43 lines
1.2 KiB
Ruby
43 lines
1.2 KiB
Ruby
|
# IssueCollection can be used to reduce a list of issues down to a subset.
|
||
|
#
|
||
|
# IssueCollection is not meant to be some sort of Enumerable, instead it's meant
|
||
|
# to take a list of issues and return a new list of issues based on some
|
||
|
# criteria. For example, given a list of issues you may want to return a list of
|
||
|
# issues that can be read or updated by a given user.
|
||
|
class IssueCollection
|
||
|
attr_reader :collection
|
||
|
|
||
|
def initialize(collection)
|
||
|
@collection = collection
|
||
|
end
|
||
|
|
||
|
# Returns all the issues that can be updated by the user.
|
||
|
def updatable_by_user(user)
|
||
|
return collection if user.admin?
|
||
|
|
||
|
# Given all the issue projects we get a list of projects that the current
|
||
|
# user has at least reporter access to.
|
||
|
projects_with_reporter_access = user.
|
||
|
projects_with_reporter_access_limited_to(project_ids).
|
||
|
pluck(:id)
|
||
|
|
||
|
collection.select do |issue|
|
||
|
if projects_with_reporter_access.include?(issue.project_id)
|
||
|
true
|
||
|
elsif issue.is_a?(Issue)
|
||
|
issue.assignee_or_author?(user)
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
alias_method :visible_to, :updatable_by_user
|
||
|
|
||
|
private
|
||
|
|
||
|
def project_ids
|
||
|
@project_ids ||= collection.map(&:project_id).uniq
|
||
|
end
|
||
|
end
|