collect_service.rb 1.62 KB
# Projects::CollectService class
#
# Used to collect projects user has access to
#
module Projects
  class CollectService
    def execute(current_user, options)
      group = options[:group]

      if group
        group_projects(current_user, group)
      else
        all_projects(current_user)
      end
    end

    private

    def group_projects(current_user, group)
      if current_user
        if group.users.include?(current_user)
          # User is group member
          #
          # Return ALL group projects
          group.projects
        else
          projects_members = UsersProject.where(
            project_id: group.projects,
            user_id: current_user
          )

          if projects_members.any?
            # User is a project member
            #
            # Return only:
            #   public projects
            #   internal projects
            #   joined projects
            #
            group.projects.where(
              "projects.id IN (?) OR projects.visibility_level IN (?)",
              projects_members.pluck(:project_id),
              Project.public_and_internal_levels
            )
          else
            # User has no access to group or group projects
            #
            # Return only:
            #   public projects
            #   internal projects
            #
            group.projects.public_and_internal_only
          end
        end
      else
        # Not authenticated
        #
        # Return only:
        #   public projects
        group.projects.public_only
      end
    end
  end

  def all_projects
    # TODO: implement
    raise 'Not implemented yet'
  end
end