From f67710a7c7573443f8e5a75c172f47dfa65b7dce Mon Sep 17 00:00:00 2001
From: Sheldon Led <sheldonled@gitlab.com>
Date: Wed, 7 Feb 2024 17:59:10 +0000
Subject: [PATCH] Move to CE the Namespace Project Sort Enums related to
 storage size

---
 app/finders/namespaces/projects_finder.rb          |  2 ++
 .../types/projects/namespace_project_sort_enum.rb  |  2 ++
 app/models/project.rb                              |  9 +++++++++
 doc/api/graphql/reference/index.md                 |  3 ++-
 .../components/namespace_storage_app.stories.js    |  4 ++--
 .../usage_quotas/storage/init_namespace_storage.js |  2 +-
 ee/app/finders/ee/namespaces/projects_finder.rb    |  3 ---
 .../types/projects/namespace_project_sort_enum.rb  | 11 ++++++-----
 ee/app/models/ee/project.rb                        | 10 ----------
 .../components/namespace_storage_app_spec.js       |  4 ++--
 ee/spec/models/ee/project_spec.rb                  | 14 --------------
 .../api/graphql/namespace/projects_spec.rb         |  4 ++--
 spec/models/project_spec.rb                        | 14 ++++++++++++++
 13 files changed, 42 insertions(+), 40 deletions(-)

diff --git a/app/finders/namespaces/projects_finder.rb b/app/finders/namespaces/projects_finder.rb
index 6547d41dcdddd..5ef26ca90759c 100644
--- a/app/finders/namespaces/projects_finder.rb
+++ b/app/finders/namespaces/projects_finder.rb
@@ -80,6 +80,8 @@ def by_feature_availability(items)
 
     def sort(items)
       return items.projects_order_id_desc unless params[:sort]
+      return items.order_by_storage_size(:asc) if params[:sort] == :storage_size_asc
+      return items.order_by_storage_size(:desc) if params[:sort] == :storage_size_desc
 
       if params[:sort] == :similarity && params[:search].present?
         return items.sorted_by_similarity_desc(params[:search], include_in_select: true)
diff --git a/app/graphql/types/projects/namespace_project_sort_enum.rb b/app/graphql/types/projects/namespace_project_sort_enum.rb
index 14a315781efab..29a5c86b084b3 100644
--- a/app/graphql/types/projects/namespace_project_sort_enum.rb
+++ b/app/graphql/types/projects/namespace_project_sort_enum.rb
@@ -8,6 +8,8 @@ class NamespaceProjectSortEnum < BaseEnum
 
       value 'SIMILARITY', 'Most similar to the search query.', value: :similarity
       value 'ACTIVITY_DESC', 'Sort by latest activity, descending order.', value: :latest_activity_desc
+      value 'STORAGE_SIZE_ASC',  'Sort by total storage size, ascending order.', value: :storage_size_asc
+      value 'STORAGE_SIZE_DESC', 'Sort by total storage size, descending order.', value: :storage_size_desc
     end
   end
 end
diff --git a/app/models/project.rb b/app/models/project.rb
index 7f1c3cd475c2f..c52562ff8f680 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -639,6 +639,15 @@ def self.integration_association_name(name)
   # Sometimes queries (e.g. using CTEs) require explicit disambiguation with table name
   scope :projects_order_id_asc, -> { reorder(self.arel_table['id'].asc) }
   scope :projects_order_id_desc, -> { reorder(self.arel_table['id'].desc) }
+  scope :order_by_storage_size, -> (direction) do
+    build_keyset_order_on_joined_column(
+      scope: joins(:statistics),
+      attribute_name: 'project_statistics_storage_size',
+      column: ::ProjectStatistics.arel_table[:storage_size],
+      direction: direction,
+      nullable: :nulls_first
+    )
+  end
 
   scope :sorted_by_similarity_desc, -> (search, include_in_select: false) do
     order_expression = Gitlab::Database::SimilarityScore.build_expression(
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 88f8a3f2fc2f1..9eea2bef404d5 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -31352,8 +31352,9 @@ Values for sorting projects.
 | Value | Description |
 | ----- | ----------- |
 | <a id="namespaceprojectsortactivity_desc"></a>`ACTIVITY_DESC` | Sort by latest activity, descending order. |
+| <a id="namespaceprojectsortexcess_repo_storage_size_desc"></a>`EXCESS_REPO_STORAGE_SIZE_DESC` | Sort by excess repository storage size, descending order. |
 | <a id="namespaceprojectsortsimilarity"></a>`SIMILARITY` | Most similar to the search query. |
-| <a id="namespaceprojectsortstorage"></a>`STORAGE` | Sort by excess repository storage size, descending order. |
+| <a id="namespaceprojectsortstorage"></a>`STORAGE` **{warning-solid}** | **Deprecated** in 16.9. Please use EXCESS_REPO_STORAGE_SIZE_DESC. |
 | <a id="namespaceprojectsortstorage_size_asc"></a>`STORAGE_SIZE_ASC` | Sort by total storage size, ascending order. |
 | <a id="namespaceprojectsortstorage_size_desc"></a>`STORAGE_SIZE_DESC` | Sort by total storage size, descending order. |
 
diff --git a/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js b/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js
index 4309457aa1ec3..340ca7d79200a 100644
--- a/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js
+++ b/ee/app/assets/javascripts/usage_quotas/storage/components/namespace_storage_app.stories.js
@@ -68,7 +68,7 @@ export const SaasWithProjectLimits = {
       isUsingProjectEnforcementWithLimits: true,
       isUsingProjectEnforcementWithNoLimits: false,
       totalRepositorySizeExcess: 3 * GIBIBYTE,
-      customSortKey: 'STORAGE',
+      customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC',
     },
   }),
 };
@@ -112,7 +112,7 @@ export const SaasWithProjectLimitsLoading = {
         isUsingProjectEnforcementWithLimits: true,
         isUsingProjectEnforcementWithNoLimits: false,
         totalRepositorySizeExcess: 3 * GIBIBYTE,
-        customSortKey: 'STORAGE',
+        customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC',
       },
     })(...args);
   },
diff --git a/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js b/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js
index ed19e9efe10c9..d5a7c0ec32f7b 100644
--- a/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js
+++ b/ee/app/assets/javascripts/usage_quotas/storage/init_namespace_storage.js
@@ -60,7 +60,7 @@ export default () => {
       isUsingNamespaceEnforcement,
       isUsingProjectEnforcementWithLimits,
       isUsingProjectEnforcementWithNoLimits,
-      customSortKey: isUsingProjectEnforcementWithLimits ? 'STORAGE' : null,
+      customSortKey: isUsingProjectEnforcementWithLimits ? 'EXCESS_REPO_STORAGE_SIZE_DESC' : null,
       helpLinks,
     },
     render(createElement) {
diff --git a/ee/app/finders/ee/namespaces/projects_finder.rb b/ee/app/finders/ee/namespaces/projects_finder.rb
index 858eab411adb4..2501edd72ce99 100644
--- a/ee/app/finders/ee/namespaces/projects_finder.rb
+++ b/ee/app/finders/ee/namespaces/projects_finder.rb
@@ -64,9 +64,6 @@ def sort(items)
           return items.order_by_excess_repo_storage_size_desc(namespace.actual_size_limit)
         end
 
-        return items.order_by_storage_size(:asc) if params[:sort] == :storage_size_asc
-        return items.order_by_storage_size(:desc) if params[:sort] == :storage_size_desc
-
         super(items)
       end
 
diff --git a/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb b/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb
index 2dd6a9dd7ef04..ed1123fa4a786 100644
--- a/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb
+++ b/ee/app/graphql/ee/types/projects/namespace_project_sort_enum.rb
@@ -7,13 +7,14 @@ module NamespaceProjectSortEnum
         extend ActiveSupport::Concern
 
         prepended do
-          # Storage size
           value 'STORAGE', 'Sort by excess repository storage size, descending order.',
+            value: :excess_repo_storage_size_desc,
+            deprecated: {
+              reason: 'Please use EXCESS_REPO_STORAGE_SIZE_DESC',
+              milestone: '16.9'
+            }
+          value 'EXCESS_REPO_STORAGE_SIZE_DESC', 'Sort by excess repository storage size, descending order.',
             value: :excess_repo_storage_size_desc
-
-          # project_statistics columns
-          value 'STORAGE_SIZE_ASC',  'Sort by total storage size, ascending order.', value: :storage_size_asc
-          value 'STORAGE_SIZE_DESC', 'Sort by total storage size, descending order.', value: :storage_size_desc
         end
       end
     end
diff --git a/ee/app/models/ee/project.rb b/ee/app/models/ee/project.rb
index c2d92369ad7ab..a4476abb16a01 100644
--- a/ee/app/models/ee/project.rb
+++ b/ee/app/models/ee/project.rb
@@ -285,16 +285,6 @@ def lock_for_confirmation!(id)
         order.apply_cursor_conditions(joins(:statistics)).order(order)
       end
 
-      scope :order_by_storage_size, -> (direction) do
-        build_keyset_order_on_joined_column(
-          scope: joins(:statistics),
-          attribute_name: 'project_statistics_storage_size',
-          column: ::ProjectStatistics.arel_table[:storage_size],
-          direction: direction,
-          nullable: :nulls_first
-        )
-      end
-
       scope :with_project_setting, -> { includes(:project_setting) }
 
       scope :compliance_framework_id_in, -> (ids) do
diff --git a/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js b/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js
index af266e5c69710..ad22a6d0f5d22 100644
--- a/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js
+++ b/ee/spec/frontend/usage_quotas/storage/components/namespace_storage_app_spec.js
@@ -135,13 +135,13 @@ describe('NamespaceStorageApp', () => {
         provide: {
           isUsingNamespaceEnforcement: false,
           isUsingProjectEnforcementWithLimits: true,
-          customSortKey: 'STORAGE',
+          customSortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC',
         },
       });
 
       expect(getProjectListStorageHandler).toHaveBeenCalledWith(
         expect.objectContaining({
-          sortKey: 'STORAGE',
+          sortKey: 'EXCESS_REPO_STORAGE_SIZE_DESC',
         }),
       );
 
diff --git a/ee/spec/models/ee/project_spec.rb b/ee/spec/models/ee/project_spec.rb
index 0de2b4001d7ff..b444540b51add 100644
--- a/ee/spec/models/ee/project_spec.rb
+++ b/ee/spec/models/ee/project_spec.rb
@@ -453,20 +453,6 @@
       it { is_expected.to eq([project_2, project_3, project_1]) }
     end
 
-    describe '.order_by_storage_size' do
-      let_it_be(:project_1) { create(:project_statistics, repository_size: 1).project }
-      let_it_be(:project_2) { create(:project_statistics, repository_size: 3).project }
-      let_it_be(:project_3) { create(:project_statistics, repository_size: 2).project }
-
-      context 'ascending' do
-        it { expect(described_class.order_by_storage_size(:asc)).to eq([project_1, project_3, project_2]) }
-      end
-
-      context 'descending' do
-        it { expect(described_class.order_by_storage_size(:desc)).to eq([project_2, project_3, project_1]) }
-      end
-    end
-
     describe '.with_coverage_feature_usage' do
       let_it_be(:project_1) { create(:project) }
       let_it_be(:project_2) { create(:project) }
diff --git a/ee/spec/requests/api/graphql/namespace/projects_spec.rb b/ee/spec/requests/api/graphql/namespace/projects_spec.rb
index 8c4101298cbb3..808489ad8567f 100644
--- a/ee/spec/requests/api/graphql/namespace/projects_spec.rb
+++ b/ee/spec/requests/api/graphql/namespace/projects_spec.rb
@@ -28,7 +28,7 @@ def pagination_query(params)
         query_nodes(:projects, :name, include_pagination_info: true, args: params + project_args))
     end
 
-    context 'when sorting by STORAGE' do
+    context 'when sorting by STORAGE_SIZE_DESC' do
       before do
         project_4.statistics.update!(lfs_objects_size: 1, repository_size: 4.gigabytes)
         project_2.statistics.update!(lfs_objects_size: 1, repository_size: 2.gigabytes)
@@ -37,7 +37,7 @@ def pagination_query(params)
 
       it_behaves_like 'sorted paginated query' do
         let(:node_path) { %w[name] }
-        let(:sort_param) { :STORAGE }
+        let(:sort_param) { :STORAGE_SIZE_DESC }
         let(:first_param) { 2 }
         let(:all_records) { [project_4, project_2, project_3].map(&:name) }
       end
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 3d5ccbc6feb17..d9d4018a7e427 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -2126,6 +2126,20 @@ def has_external_wiki
     end
   end
 
+  describe '.order_by_storage_size' do
+    let_it_be(:project_1) { create(:project_statistics, repository_size: 1).project }
+    let_it_be(:project_2) { create(:project_statistics, repository_size: 3).project }
+    let_it_be(:project_3) { create(:project_statistics, repository_size: 2).project }
+
+    context 'ascending' do
+      it { expect(described_class.order_by_storage_size(:asc)).to eq([project_1, project_3, project_2]) }
+    end
+
+    context 'descending' do
+      it { expect(described_class.order_by_storage_size(:desc)).to eq([project_2, project_3, project_1]) }
+    end
+  end
+
   describe '.with_shared_runners_enabled' do
     subject { described_class.with_shared_runners_enabled }
 
-- 
GitLab