Commit f3ea22fc authored by Robert Speicher's avatar Robert Speicher

Merge branch '201897-group-packages-list-api-sorting-project-path' into 'master'

Adds project_path sorting to group package api

Closes #201897

See merge request gitlab-org/gitlab!24833
parents 8a5cc544 95b92ddc
......@@ -70,6 +70,8 @@ class Packages::Package < ApplicationRecord
scope :order_type_desc, -> { reorder('package_type DESC') }
scope :order_project_name, -> { joins(:project).reorder('projects.name ASC') }
scope :order_project_name_desc, -> { joins(:project).reorder('projects.name DESC') }
scope :order_project_path, -> { joins(:project).reorder('projects.path ASC, id ASC') }
scope :order_project_path_desc, -> { joins(:project).reorder('projects.path DESC, id DESC') }
def self.for_projects(projects)
return none unless projects.any?
......@@ -107,6 +109,8 @@ class Packages::Package < ApplicationRecord
when 'type_desc' then order_type_desc
when 'project_name_asc' then order_project_name
when 'project_name_desc' then order_project_name_desc
when 'project_path_asc' then order_project_path
when 'project_path_desc' then order_project_path_desc
else
order_created_desc
end
......
---
title: Adds project_path sorting to group package API
merge_request: 24833
author:
type: added
......@@ -21,7 +21,7 @@ module API
end
params do
use :pagination
optional :order_by, type: String, values: %w[created_at name version type], default: 'created_at',
optional :order_by, type: String, values: %w[created_at name version type project_path], default: 'created_at',
desc: 'Return packages ordered by `created_at`, `name`, `version` or `type` fields.'
optional :sort, type: String, values: %w[asc desc], default: 'asc',
desc: 'Return packages sorted in `asc` or `desc` order.'
......
......@@ -13,6 +13,61 @@ RSpec.describe Packages::Package, type: :model do
it { is_expected.to have_one(:maven_metadatum).inverse_of(:package) }
end
describe '.sort_by_attribute' do
let_it_be(:group) { create(:group, :public) }
let_it_be(:project) { create(:project, :public, namespace: group, name: 'project A') }
let!(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") }
let!(:package2) { create(:nuget_package, project: project, version: '2.0.4') }
let(:package3) { create(:maven_package, project: project, version: '1.1.1', name: 'zzz') }
before do
travel_to(1.day.ago) do
package3
end
end
RSpec.shared_examples 'package sorting by attribute' do |order_by|
subject { described_class.where(id: packages.map(&:id)).sort_by_attribute("#{order_by}_#{sort}").to_a }
context "sorting by #{order_by}" do
context 'ascending order' do
let(:sort) { 'asc' }
it { is_expected.to eq packages }
end
context 'descending order' do
let(:sort) { 'desc' }
it { is_expected.to eq packages.reverse }
end
end
end
it_behaves_like 'package sorting by attribute', 'name' do
let(:packages) { [package1, package2, package3] }
end
it_behaves_like 'package sorting by attribute', 'created_at' do
let(:packages) { [package3, package1, package2] }
end
it_behaves_like 'package sorting by attribute', 'version' do
let(:packages) { [package3, package2, package1] }
end
it_behaves_like 'package sorting by attribute', 'type' do
let(:packages) { [package3, package1, package2] }
end
it_behaves_like 'package sorting by attribute', 'project_path' do
let(:another_project) { create(:project, :public, namespace: group, name: 'project B') }
let!(:package4) { create(:npm_package, project: another_project, version: '3.1.0', name: "@#{project.root_namespace.path}/bar") }
let(:packages) { [package1, package2, package3, package4] }
end
end
describe 'validations' do
subject { create(:package) }
......
......@@ -4,7 +4,7 @@ require 'spec_helper'
describe API::GroupPackages do
let(:group) { create(:group, :public) }
let(:project) { create(:project, :public, namespace: group) }
let(:project) { create(:project, :public, namespace: group, name: 'project A') }
let!(:package1) { create(:npm_package, project: project, version: '3.1.0', name: "@#{project.root_namespace.path}/foo1") }
let!(:package2) { create(:nuget_package, project: project, version: '2.0.4') }
let(:user) { create(:user) }
......@@ -54,6 +54,13 @@ describe API::GroupPackages do
it_behaves_like 'package sorting', 'type' do
let(:packages) { [package3, package1, package2] }
end
it_behaves_like 'package sorting', 'project_path' do
let(:another_project) { create(:project, :public, namespace: group, name: 'project B') }
let!(:package4) { create(:npm_package, project: another_project, version: '3.1.0', name: "@#{project.root_namespace.path}/bar") }
let(:packages) { [package1, package2, package3, package4] }
end
end
context 'with private group' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment