1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# frozen_string_literal: true
module API
class ProjectPackages < ::API::Base
include Gitlab::Utils::StrongMemoize
include PaginationParams
before do
authorize_packages_access!(user_project)
end
feature_category :package_registry
urgency :low
helpers ::API::Helpers::PackagesHelpers
helpers ::API::Helpers::Packages::Npm
helpers do
def package
strong_memoize(:package) do # rubocop:disable Gitlab/StrongMemoizeAttr
::Packages::PackageFinder.new(user_project, declared_params[:package_id]).execute
end
end
end
params do
requires :id, types: [String, Integer], desc: 'The ID or URL-encoded path of the project'
end
resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
desc 'Get a list of project packages' do
detail 'This feature was introduced in GitLab 11.8'
success code: 200, model: ::API::Entities::Package
failure [
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Project Not Found' }
]
is_array true
tags %w[project_packages]
end
params do
use :pagination
optional :order_by, type: String, values: %w[created_at name version type], 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.'
optional :package_type, type: String, values: Packages::Package.package_types.keys,
desc: 'Return packages of a certain type'
optional :package_name, type: String,
desc: 'Return packages with this name'
optional :include_versionless, type: Boolean,
desc: 'Returns packages without a version'
optional :status, type: String, values: Packages::Package.statuses.keys,
desc: 'Return packages with specified status'
end
route_setting :authentication, job_token_allowed: true
get ':id/packages' do
packages = ::Packages::PackagesFinder.new(
user_project,
declared_params.slice(:order_by, :sort, :package_type, :package_name, :include_versionless, :status)
).execute
present paginate(packages), with: ::API::Entities::Package, user: current_user, namespace: user_project.namespace
end
desc 'Get a single project package' do
detail 'This feature was introduced in GitLab 11.9'
success code: 200, model: ::API::Entities::Package
failure [
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not Found' }
]
tags %w[project_packages]
end
params do
requires :package_id, type: Integer, desc: 'The ID of a package'
end
route_setting :authentication, job_token_allowed: true
get ':id/packages/:package_id' do
render_api_error!('Package not found', 404) unless package.default?
present package, with: ::API::Entities::Package, user: current_user, namespace: user_project.namespace
end
desc 'Get the pipelines for a single project package' do
detail 'This feature was introduced in GitLab 16.1'
success code: 200, model: ::API::Entities::Package::Pipeline
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not Found' }
]
tags %w[project_packages]
end
params do
use :pagination
requires :package_id, type: Integer, desc: 'The ID of a package'
optional :cursor, type: String, desc: 'Cursor for obtaining the next set of records'
# Overrides the original definition to add the `values: 1..20` restriction
optional :per_page, type: Integer, default: 20,
desc: 'Number of items per page', documentation: { example: 20 },
values: 1..20
end
route_setting :authentication, job_token_allowed: true
get ':id/packages/:package_id/pipelines' do
not_found!('Package not found') unless package.default?
params[:pagination] = 'keyset' # keyset is the only available pagination
pipelines = paginate_with_strategies(
package.build_infos.without_empty_pipelines,
paginator_params: { per_page: declared_params[:per_page], cursor: declared_params[:cursor] }
) do |results|
::Packages::PipelinesFinder.new(results.map(&:pipeline_id)).execute
end
present pipelines, with: ::API::Entities::Package::Pipeline, user: current_user
end
desc 'Delete a project package' do
detail 'This feature was introduced in GitLab 11.9'
success code: 204
failure [
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not Found' }
]
tags %w[project_packages]
end
params do
requires :package_id, type: Integer, desc: 'The ID of a package'
end
route_setting :authentication, job_token_allowed: true
delete ':id/packages/:package_id' do
authorize_destroy_package!(user_project)
destroy_conditionally!(package) do |package|
::Packages::MarkPackageForDestructionService.new(container: package, current_user: current_user).execute
enqueue_sync_metadata_cache_worker(user_project, package.name) if package.npm?
end
end
end
end
end
|