2017-08-17 22:00:37 +05:30
|
|
|
# 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.
|
2017-09-10 17:25:29 +05:30
|
|
|
projects_with_reporter_access = user
|
|
|
|
.projects_with_reporter_access_limited_to(project_ids)
|
|
|
|
.pluck(:id)
|
2017-08-17 22:00:37 +05:30
|
|
|
|
|
|
|
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
|