mirror of
https://github.com/gitlabhq/gitlabhq.git
synced 2025-07-23 02:54:40 +00:00
77 lines
2.2 KiB
Ruby
77 lines
2.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# Finds the projects "@user" contributed to, limited to either public projects
|
|
# or projects visible to the given user.
|
|
#
|
|
# Arguments:
|
|
# user: User to find contributed projects for
|
|
# current_user: The current user
|
|
# params:
|
|
# search: Return only projects that match search filter
|
|
# ignore_visibility: When true the list of projects will include all contributed
|
|
# projects, regardless of their visibility to the current_user.
|
|
# min_access_level: Return only projects where user has at least the access level.
|
|
# programming_language_name: Return only projects that use the provided programming language.
|
|
# sort: Order projects
|
|
#
|
|
# Returns an ActiveRecord::Relation.
|
|
class ContributedProjectsFinder
|
|
include Projects::SearchFilter
|
|
|
|
attr_reader :user, :current_user, :params
|
|
|
|
def initialize(user:, current_user: nil, params: {})
|
|
@user = user
|
|
@current_user = current_user
|
|
@params = params
|
|
end
|
|
|
|
def execute
|
|
# Do not show contributed projects if the user profile is private.
|
|
return Project.none unless can_read_profile?(current_user)
|
|
|
|
collection = init_collection
|
|
collection = filter_projects(collection)
|
|
|
|
collection.with_namespace.sort_by_attribute(params[:sort] || 'id_desc')
|
|
end
|
|
|
|
private
|
|
|
|
def can_read_profile?(current_user)
|
|
Ability.allowed?(current_user, :read_user_profile, user)
|
|
end
|
|
|
|
def init_collection
|
|
contributed_projects = user.contributed_projects
|
|
|
|
return contributed_projects if params[:ignore_visibility]
|
|
|
|
if current_user
|
|
if params[:min_access_level].present?
|
|
return contributed_projects.visible_to_user_and_access_level(current_user,
|
|
params[:min_access_level])
|
|
end
|
|
|
|
return contributed_projects.public_or_visible_to_user(current_user)
|
|
end
|
|
|
|
contributed_projects.public_to_user
|
|
end
|
|
|
|
def filter_projects(collection)
|
|
collection = by_search(collection)
|
|
by_programming_language(collection)
|
|
end
|
|
|
|
def by_programming_language(collection)
|
|
if params[:programming_language_name].present?
|
|
return collection.with_programming_language(params[:programming_language_name])
|
|
end
|
|
|
|
collection
|
|
end
|
|
end
|
|
|
|
ContributedProjectsFinder.prepend_mod
|