diff options
Diffstat (limited to 'lib/api/concerns/packages')
-rw-r--r-- | lib/api/concerns/packages/conan_endpoints.rb | 2 | ||||
-rw-r--r-- | lib/api/concerns/packages/debian_distribution_endpoints.rb | 152 | ||||
-rw-r--r-- | lib/api/concerns/packages/debian_package_endpoints.rb (renamed from lib/api/concerns/packages/debian_endpoints.rb) | 34 | ||||
-rw-r--r-- | lib/api/concerns/packages/nuget_endpoints.rb | 5 |
4 files changed, 170 insertions, 23 deletions
diff --git a/lib/api/concerns/packages/conan_endpoints.rb b/lib/api/concerns/packages/conan_endpoints.rb index eb762be8285..3194cdebde8 100644 --- a/lib/api/concerns/packages/conan_endpoints.rb +++ b/lib/api/concerns/packages/conan_endpoints.rb @@ -255,7 +255,7 @@ module API delete do authorize!(:destroy_package, project) - track_package_event('delete_package', :conan, category: 'API::ConanPackages') + track_package_event('delete_package', :conan, category: 'API::ConanPackages', user: current_user, project: project, namespace: project.namespace) package.destroy end diff --git a/lib/api/concerns/packages/debian_distribution_endpoints.rb b/lib/api/concerns/packages/debian_distribution_endpoints.rb new file mode 100644 index 00000000000..4670c3e3521 --- /dev/null +++ b/lib/api/concerns/packages/debian_distribution_endpoints.rb @@ -0,0 +1,152 @@ +# frozen_string_literal: true + +module API + module Concerns + module Packages + module DebianDistributionEndpoints + extend ActiveSupport::Concern + + included do + include PaginationParams + + feature_category :package_registry + + helpers ::API::Helpers::PackagesHelpers + helpers ::API::Helpers::Packages::BasicAuthHelpers + include ::API::Helpers::Authentication + + namespace 'debian_distributions' do + helpers do + params :optional_distribution_params do + optional :suite, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Suite' + optional :origin, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Origin' + optional :label, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Label' + optional :version, type: String, regexp: Gitlab::Regex.debian_version_regex, desc: 'The Debian Version' + optional :description, type: String, desc: 'The Debian Description' + optional :valid_time_duration_seconds, type: Integer, desc: 'The duration before the Release file should be considered expired by the client' + + optional :components, type: Array[String], + coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, + regexp: Gitlab::Regex.debian_component_regex, + desc: 'The list of Components' + optional :architectures, type: Array[String], + coerce_with: ::API::Validations::Types::CommaSeparatedToArray.coerce, + regexp: Gitlab::Regex.debian_architecture_regex, + desc: 'The list of Architectures' + end + end + + authenticate_with do |accept| + accept.token_types(:personal_access_token, :deploy_token, :job_token) + .sent_through(:http_basic_auth) + end + + content_type :json, 'application/json' + format :json + + # POST {projects|groups}/:id/debian_distributions + desc 'Create a Debian Distribution' do + detail 'This feature was introduced in 14.0' + success ::API::Entities::Packages::Debian::Distribution + end + + params do + requires :codename, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Codename' + use :optional_distribution_params + end + post '/' do + authorize_create_package!(project_or_group) + + distribution_params = declared_params(include_missing: false) + result = ::Packages::Debian::CreateDistributionService.new(project_or_group, current_user, distribution_params).execute + distribution = result.payload[:distribution] + + if result.success? + present distribution, with: ::API::Entities::Packages::Debian::Distribution + else + render_validation_error!(distribution) + end + end + + # GET {projects|groups}/:id/debian_distributions + desc 'Get a list of Debian Distributions' do + detail 'This feature was introduced in 14.0' + success ::API::Entities::Packages::Debian::Distribution + end + + params do + use :pagination + optional :codename, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Codename' + use :optional_distribution_params + end + get '/' do + distribution_params = declared_params(include_missing: false) + distributions = ::Packages::Debian::DistributionsFinder.new(project_or_group, distribution_params).execute + + present paginate(distributions), with: ::API::Entities::Packages::Debian::Distribution + end + + # GET {projects|groups}/:id/debian_distributions/:codename + desc 'Get a Debian Distribution' do + detail 'This feature was introduced in 14.0' + success ::API::Entities::Packages::Debian::Distribution + end + + params do + requires :codename, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Codename' + end + get '/:codename' do + distribution = ::Packages::Debian::DistributionsFinder.new(project_or_group, codename: params[:codename]).execute.last! + + present distribution, with: ::API::Entities::Packages::Debian::Distribution + end + + # PUT {projects|groups}/:id/debian_distributions/:codename + desc 'Update a Debian Distribution' do + detail 'This feature was introduced in 14.0' + success ::API::Entities::Packages::Debian::Distribution + end + + params do + requires :codename, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Codename' + use :optional_distribution_params + end + put '/:codename' do + authorize_create_package!(project_or_group) + + distribution = ::Packages::Debian::DistributionsFinder.new(project_or_group, codename: params[:codename]).execute.last! + distribution_params = declared_params(include_missing: false).except(:codename) + result = ::Packages::Debian::UpdateDistributionService.new(distribution, distribution_params).execute + distribution = result.payload[:distribution] + + if result.success? + present distribution, with: ::API::Entities::Packages::Debian::Distribution + else + render_validation_error!(distribution) + end + end + + # DELETE {projects|groups}/:id/debian_distributions/:codename + desc 'Delete a Debian Distribution' do + detail 'This feature was introduced in 14.0' + end + + params do + requires :codename, type: String, regexp: Gitlab::Regex.debian_distribution_regex, desc: 'The Debian Codename' + use :optional_distribution_params + end + delete '/:codename' do + authorize_destroy_package!(project_or_group) + + distribution = ::Packages::Debian::DistributionsFinder.new(project_or_group, codename: params[:codename]).execute.last! + + accepted! if distribution.destroy + + render_api_error!('Failed to delete distribution', 400) + end + end + end + end + end + end +end diff --git a/lib/api/concerns/packages/debian_endpoints.rb b/lib/api/concerns/packages/debian_package_endpoints.rb index 6fc7c439464..c79ae3068b4 100644 --- a/lib/api/concerns/packages/debian_endpoints.rb +++ b/lib/api/concerns/packages/debian_package_endpoints.rb @@ -3,7 +3,7 @@ module API module Concerns module Packages - module DebianEndpoints + module DebianPackageEndpoints extend ActiveSupport::Concern DISTRIBUTION_REGEX = %r{[a-zA-Z0-9][a-zA-Z0-9.-]*}.freeze @@ -32,23 +32,17 @@ module API helpers ::API::Helpers::PackagesHelpers helpers ::API::Helpers::Packages::BasicAuthHelpers + include ::API::Helpers::Authentication - format :txt - content_type :txt, 'text/plain' - - rescue_from ArgumentError do |e| - render_api_error!(e.message, 400) - end - - rescue_from ActiveRecord::RecordInvalid do |e| - render_api_error!(e.message, 400) - end + namespace 'packages/debian' do + authenticate_with do |accept| + accept.token_types(:personal_access_token, :deploy_token, :job_token) + .sent_through(:http_basic_auth) + end - before do - require_packages_enabled! - end + format :txt + content_type :txt, 'text/plain' - namespace 'packages/debian' do params do requires :distribution, type: String, desc: 'The Debian Codename', regexp: Gitlab::Regex.debian_distribution_regex end @@ -59,7 +53,7 @@ module API detail 'This feature was introduced in GitLab 13.5' end - route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth, authenticate_non_public: true + route_setting :authentication, authenticate_non_public: true get 'Release.gpg' do not_found! end @@ -69,7 +63,7 @@ module API detail 'This feature was introduced in GitLab 13.5' end - route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth, authenticate_non_public: true + route_setting :authentication, authenticate_non_public: true get 'Release' do # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286 'TODO Release' @@ -80,7 +74,7 @@ module API detail 'This feature was introduced in GitLab 13.5' end - route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth, authenticate_non_public: true + route_setting :authentication, authenticate_non_public: true get 'InRelease' do not_found! end @@ -96,7 +90,7 @@ module API detail 'This feature was introduced in GitLab 13.5' end - route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth, authenticate_non_public: true + route_setting :authentication, authenticate_non_public: true get 'Packages' do # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286 'TODO Packages' @@ -119,7 +113,7 @@ module API detail 'This feature was introduced in GitLab 13.5' end - route_setting :authentication, deploy_token_allowed: true, basic_auth_personal_access_token: true, job_token_allowed: :basic_auth, authenticate_non_public: true + route_setting :authentication, authenticate_non_public: true get ':file_name', requirements: FILE_NAME_REQUIREMENTS do # https://gitlab.com/gitlab-org/gitlab/-/issues/5835#note_414103286 'TODO File' diff --git a/lib/api/concerns/packages/nuget_endpoints.rb b/lib/api/concerns/packages/nuget_endpoints.rb index 5364eeb1880..208daeb3037 100644 --- a/lib/api/concerns/packages/nuget_endpoints.rb +++ b/lib/api/concerns/packages/nuget_endpoints.rb @@ -58,7 +58,8 @@ module API end get 'index', format: :json do authorize_read_package!(project_or_group) - track_package_event('cli_metadata', :nuget, category: 'API::NugetPackages') + + track_package_event('cli_metadata', :nuget, **snowplow_gitlab_standard_context.merge(category: 'API::NugetPackages')) present ::Packages::Nuget::ServiceIndexPresenter.new(project_or_group), with: ::API::Entities::Nuget::ServiceIndex @@ -117,7 +118,7 @@ module API results = search_packages(params[:q], search_options) - track_package_event('search_package', :nuget, category: 'API::NugetPackages') + track_package_event('search_package', :nuget, **snowplow_gitlab_standard_context.merge(category: 'API::NugetPackages')) present ::Packages::Nuget::SearchResultsPresenter.new(results), with: ::API::Entities::Nuget::SearchResults |