From 042d11edfe85ffe2f5a05f95f05d3184d4d5da5b Mon Sep 17 00:00:00 2001
From: "Adie (she/her)" <avpfestin@gitlab.com>
Date: Tue, 7 May 2024 16:06:18 +0000
Subject: [PATCH] Allow additional parameter: published_at for sorting

There is a new sorting option `published_at` and
`-published_at` in the container repository details
API so we are allowing that as an option.

Changelog: added
---
 .../container_repository_tags_resolver.rb     | 10 ++---
 .../container_repository_tags_sort_enum.rb    |  4 ++
 doc/api/graphql/reference/index.md            |  2 +
 ...container_repository_tags_resolver_spec.rb | 42 ++++++++++++-------
 ...ntainer_respository_tags_sort_enum_spec.rb |  2 +-
 5 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/app/graphql/resolvers/container_repository_tags_resolver.rb b/app/graphql/resolvers/container_repository_tags_resolver.rb
index abfd30bcc4c53..46547a0d0b433 100644
--- a/app/graphql/resolvers/container_repository_tags_resolver.rb
+++ b/app/graphql/resolvers/container_repository_tags_resolver.rb
@@ -72,13 +72,13 @@ def parse_pagination_cursor(result, direction)
       query_params[key]&.first
     end
 
-    def map_sort_field(sort)
-      return unless sort
+    def map_sort_field(sort_value)
+      return if sort_value.blank?
 
-      sort_field, direction = sort.to_s.split('_')
-      return sort_field if direction == 'asc'
+      sort = sort_value.to_s.gsub(/_(desc|asc)$/, '')
+      sort = "-#{sort}" if sort_value.end_with?('_desc')
 
-      "-#{sort_field}"
+      sort
     end
 
     def sort_tags(to_be_sorted, sort)
diff --git a/app/graphql/types/container_repository_tags_sort_enum.rb b/app/graphql/types/container_repository_tags_sort_enum.rb
index 253cffd9a8c4b..5128ceb737210 100644
--- a/app/graphql/types/container_repository_tags_sort_enum.rb
+++ b/app/graphql/types/container_repository_tags_sort_enum.rb
@@ -7,5 +7,9 @@ class ContainerRepositoryTagsSortEnum < BaseEnum
 
     value 'NAME_ASC', 'Ordered by name in ascending order.', value: :name_asc
     value 'NAME_DESC', 'Ordered by name in descending order.', value: :name_desc
+    value 'PUBLISHED_AT_ASC',
+      'Ordered by published_at in ascending order. Only available for GitLab.com.', value: :published_at_asc
+    value 'PUBLISHED_AT_DESC',
+      'Ordered by published_at in descending order. Only available for GitLab.com.', value: :published_at_desc
   end
 end
diff --git a/doc/api/graphql/reference/index.md b/doc/api/graphql/reference/index.md
index 77573a3c1642d..ce7df3ec64255 100644
--- a/doc/api/graphql/reference/index.md
+++ b/doc/api/graphql/reference/index.md
@@ -32728,6 +32728,8 @@ Values for sorting tags.
 | ----- | ----------- |
 | <a id="containerrepositorytagsortname_asc"></a>`NAME_ASC` | Ordered by name in ascending order. |
 | <a id="containerrepositorytagsortname_desc"></a>`NAME_DESC` | Ordered by name in descending order. |
+| <a id="containerrepositorytagsortpublished_at_asc"></a>`PUBLISHED_AT_ASC` | Ordered by published_at in ascending order. Only available for GitLab.com. |
+| <a id="containerrepositorytagsortpublished_at_desc"></a>`PUBLISHED_AT_DESC` | Ordered by published_at in descending order. Only available for GitLab.com. |
 
 ### `CustomerRelationsContactState`
 
diff --git a/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb
index 6490cf53aec63..aaa858498804c 100644
--- a/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb
+++ b/spec/graphql/resolvers/container_repository_tags_resolver_spec.rb
@@ -83,27 +83,39 @@
       context 'with parameters' do
         using RSpec::Parameterized::TableSyntax
 
-        where(:before, :after, :sort, :name, :first, :last, :sort_value, :referrers, :referrer_type) do
-          nil  | nil  | 'NAME_DESC' | ''  | 10  | nil | '-name' | nil   | nil
-          'bb' | nil  | 'NAME_ASC'  | 'a' | nil | 5   | 'name'  | false | nil
-          nil  | 'aa' | 'NAME_DESC' | 'a' | 10  | nil | '-name' | true  | 'application/example'
+        where(:referrers, :sort_string, :sort_value) do
+          nil   | nil                 | nil
+          true  | nil                 | nil
+          false | nil                 | nil
+          nil   | 'NAME_ASC'          | 'name'
+          nil   | 'NAME_DESC'         | '-name'
+          nil   | 'PUBLISHED_AT_ASC'  | 'published_at'
+          nil   | 'PUBLISHED_AT_DESC' | '-published_at'
         end
 
-        with_them do
-          let(:args) do
-            { before: before, after: after, sort: sort, name: name, first: first,
-              last: last, referrers: referrers, referrer_type: referrer_type }.compact
-          end
+        let(:args) do
+          {
+            before: 'abc',
+            after: 'xyz',
+            sort: sort_string,
+            name: 'tag1',
+            first: 5,
+            last: 0,
+            referrers: referrers,
+            referrer_type: 'application/example'
+          }
+        end
 
-          it 'calls ContainerRepository#tags_page with correct parameters' do
+        with_them do
+          it 'calls ContainerRepository#tags_page with the correct parameters' do
             expect(repository).to receive(:tags_page).with(
-              before: before,
-              last: after,
+              before: 'abc',
+              last: 'xyz',
               sort: sort_value,
-              name: name,
-              page_size: [first, last].map(&:to_i).max,
+              name: 'tag1',
+              page_size: 5,
               referrers: referrers,
-              referrer_type: referrer_type
+              referrer_type: 'application/example'
             )
 
             resolver(args)
diff --git a/spec/graphql/types/container_respository_tags_sort_enum_spec.rb b/spec/graphql/types/container_respository_tags_sort_enum_spec.rb
index b464037d8d96b..cfc44f6e99269 100644
--- a/spec/graphql/types/container_respository_tags_sort_enum_spec.rb
+++ b/spec/graphql/types/container_respository_tags_sort_enum_spec.rb
@@ -7,7 +7,7 @@
 
   it 'exposes all the existing issue sort values' do
     expect(described_class.values.keys).to include(
-      *%w[NAME_ASC NAME_DESC]
+      *%w[NAME_ASC NAME_DESC PUBLISHED_AT_ASC PUBLISHED_AT_DESC]
     )
   end
 end
-- 
GitLab