projects_controller.rb 2.7 KB
Newer Older
1 2
# frozen_string_literal: true

3
class Explore::ProjectsController < Explore::ApplicationController
4
  include PageLimiter
5
  include ParamsBackwardCompatibility
6
  include RendersMemberAccess
7 8
  include SortingHelper
  include SortingPreference
9 10

  before_action :set_non_archived_param
11
  before_action :set_sorting
12

13 14 15 16 17 18 19
  # Limit taken from https://gitlab.com/gitlab-org/gitlab/issues/38357
  before_action only: [:index, :trending, :starred] do
    limit_pages(200)
  end

  rescue_from PageOutOfBoundsError, with: :page_out_of_bounds

Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
20
  def index
21
    @projects = load_projects
22 23 24 25 26

    respond_to do |format|
      format.html
      format.json do
        render json: {
27
          html: view_to_html_string("explore/projects/_projects", projects: @projects)
28 29 30
        }
      end
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
31 32 33
  end

  def trending
34
    params[:trending] = true
35
    @projects = load_projects
36 37 38 39 40

    respond_to do |format|
      format.html
      format.json do
        render json: {
41
          html: view_to_html_string("explore/projects/_projects", projects: @projects)
42 43 44
        }
      end
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
45
  end
46

47
  # rubocop: disable CodeReuse/ActiveRecord
48
  def starred
49
    @projects = load_projects.reorder('star_count DESC')
50 51 52 53 54

    respond_to do |format|
      format.html
      format.json do
        render json: {
55
          html: view_to_html_string("explore/projects/_projects", projects: @projects)
56 57 58
        }
      end
    end
59
  end
60
  # rubocop: enable CodeReuse/ActiveRecord
61

62
  private
63

64
  def load_project_counts
65 66
    @total_user_projects_count = ProjectsFinder.new(params: { non_public: true }, current_user: current_user).execute
    @total_starred_projects_count = ProjectsFinder.new(params: { starred: true }, current_user: current_user).execute
67 68 69 70 71
  end

  # rubocop: disable CodeReuse/ActiveRecord
  def load_projects
    load_project_counts
72

73 74
    projects = ProjectsFinder.new(current_user: current_user, params: params)
                 .execute
75
                 .includes(:route, :creator, :group, namespace: [:route, :owner])
76 77 78 79
                 .page(params[:page])
                 .without_count

    prepare_projects_for_rendering(projects)
80
  end
81
  # rubocop: enable CodeReuse/ActiveRecord
82 83 84 85 86 87 88 89 90 91 92 93 94

  def set_sorting
    params[:sort] = set_sort_order
    @sort = params[:sort]
  end

  def default_sort_order
    sort_value_latest_activity
  end

  def sorting_field
    Project::SORTING_PREFERENCE_FIELD
  end
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111

  def page_out_of_bounds(error)
    load_project_counts
    @max_page_number = error.message

    respond_to do |format|
      format.html do
        render "page_out_of_bounds", status: :bad_request
      end

      format.json do
        render json: {
          html: view_to_html_string("explore/projects/page_out_of_bounds")
        }, status: :bad_request
      end
    end
  end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
112
end