summaryrefslogtreecommitdiff
path: root/lib/api/nuget_packages.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/api/nuget_packages.rb')
-rw-r--r--lib/api/nuget_packages.rb247
1 files changed, 0 insertions, 247 deletions
diff --git a/lib/api/nuget_packages.rb b/lib/api/nuget_packages.rb
deleted file mode 100644
index 65a85f3c930..00000000000
--- a/lib/api/nuget_packages.rb
+++ /dev/null
@@ -1,247 +0,0 @@
-# frozen_string_literal: true
-
-# NuGet Package Manager Client API
-#
-# These API endpoints are not meant to be consumed directly by users. They are
-# called by the NuGet package manager client when users run commands
-# like `nuget install` or `nuget push`.
-module API
- class NugetPackages < ::API::Base
- helpers ::API::Helpers::PackagesManagerClientsHelpers
- helpers ::API::Helpers::Packages::BasicAuthHelpers
-
- feature_category :package_registry
-
- POSITIVE_INTEGER_REGEX = %r{\A[1-9]\d*\z}.freeze
- NON_NEGATIVE_INTEGER_REGEX = %r{\A0|[1-9]\d*\z}.freeze
-
- PACKAGE_FILENAME = 'package.nupkg'
-
- default_format :json
-
- rescue_from ArgumentError do |e|
- render_api_error!(e.message, 400)
- end
-
- helpers do
- def find_packages
- packages = package_finder.execute
-
- not_found!('Packages') unless packages.exists?
-
- packages
- end
-
- def find_package
- package = package_finder(package_version: params[:package_version]).execute
- .first
-
- not_found!('Package') unless package
-
- package
- end
-
- def package_finder(finder_params = {})
- ::Packages::Nuget::PackageFinder.new(
- authorized_user_project,
- **finder_params.merge(package_name: params[:package_name])
- )
- end
- end
-
- before do
- require_packages_enabled!
- end
-
- params do
- requires :id, type: String, desc: 'The ID of a project', regexp: POSITIVE_INTEGER_REGEX
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
- before do
- authorized_user_project
- end
-
- namespace ':id/packages/nuget' do
- # https://docs.microsoft.com/en-us/nuget/api/service-index
- desc 'The NuGet Service Index' do
- detail 'This feature was introduced in GitLab 12.6'
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get 'index', format: :json do
- authorize_read_package!(authorized_user_project)
-
- track_package_event('cli_metadata', :nuget)
-
- present ::Packages::Nuget::ServiceIndexPresenter.new(authorized_user_project),
- with: ::API::Entities::Nuget::ServiceIndex
- end
-
- # https://docs.microsoft.com/en-us/nuget/api/package-publish-resource
- desc 'The NuGet Package Publish endpoint' do
- detail 'This feature was introduced in GitLab 12.6'
- end
-
- params do
- requires :package, type: ::API::Validations::Types::WorkhorseFile, desc: 'The package file to be published (generated by Multipart middleware)'
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- put do
- authorize_upload!(authorized_user_project)
- bad_request!('File is too large') if authorized_user_project.actual_limits.exceeded?(:nuget_max_file_size, params[:package].size)
-
- file_params = params.merge(
- file: params[:package],
- file_name: PACKAGE_FILENAME
- )
-
- package = ::Packages::Nuget::CreatePackageService.new(authorized_user_project, current_user)
- .execute
-
- package_file = ::Packages::CreatePackageFileService.new(package, file_params)
- .execute
-
- track_package_event('push_package', :nuget)
-
- ::Packages::Nuget::ExtractionWorker.perform_async(package_file.id) # rubocop:disable CodeReuse/Worker
-
- created!
- rescue ObjectStorage::RemoteStoreError => e
- Gitlab::ErrorTracking.track_exception(e, extra: { file_name: params[:file_name], project_id: authorized_user_project.id })
-
- forbidden!
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- put 'authorize' do
- authorize_workhorse!(
- subject: authorized_user_project,
- has_length: false,
- maximum_size: authorized_user_project.actual_limits.nuget_max_file_size
- )
- end
-
- params do
- requires :package_name, type: String, desc: 'The NuGet package name', regexp: API::NO_SLASH_URL_PART_REGEX
- end
- namespace '/metadata/*package_name' do
- before do
- authorize_read_package!(authorized_user_project)
- end
-
- # https://docs.microsoft.com/en-us/nuget/api/registration-base-url-resource
- desc 'The NuGet Metadata Service - Package name level' do
- detail 'This feature was introduced in GitLab 12.8'
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get 'index', format: :json do
- present ::Packages::Nuget::PackagesMetadataPresenter.new(find_packages),
- with: ::API::Entities::Nuget::PackagesMetadata
- end
-
- desc 'The NuGet Metadata Service - Package name and version level' do
- detail 'This feature was introduced in GitLab 12.8'
- end
- params do
- requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get '*package_version', format: :json do
- present ::Packages::Nuget::PackageMetadataPresenter.new(find_package),
- with: ::API::Entities::Nuget::PackageMetadata
- end
- end
-
- # https://docs.microsoft.com/en-us/nuget/api/package-base-address-resource
- params do
- requires :package_name, type: String, desc: 'The NuGet package name', regexp: API::NO_SLASH_URL_PART_REGEX
- end
- namespace '/download/*package_name' do
- before do
- authorize_read_package!(authorized_user_project)
- end
-
- desc 'The NuGet Content Service - index request' do
- detail 'This feature was introduced in GitLab 12.8'
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get 'index', format: :json do
- present ::Packages::Nuget::PackagesVersionsPresenter.new(find_packages),
- with: ::API::Entities::Nuget::PackagesVersions
- end
-
- desc 'The NuGet Content Service - content request' do
- detail 'This feature was introduced in GitLab 12.8'
- end
- params do
- requires :package_version, type: String, desc: 'The NuGet package version', regexp: API::NO_SLASH_URL_PART_REGEX
- requires :package_filename, type: String, desc: 'The NuGet package filename', regexp: API::NO_SLASH_URL_PART_REGEX
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get '*package_version/*package_filename', format: :nupkg do
- filename = "#{params[:package_filename]}.#{params[:format]}"
- package_file = ::Packages::PackageFileFinder.new(find_package, filename, with_file_name_like: true)
- .execute
-
- not_found!('Package') unless package_file
-
- track_package_event('pull_package', :nuget)
-
- # nuget and dotnet don't support 302 Moved status codes, supports_direct_download has to be set to false
- present_carrierwave_file!(package_file.file, supports_direct_download: false)
- end
- end
-
- params do
- requires :q, type: String, desc: 'The search term'
- optional :skip, type: Integer, desc: 'The number of results to skip', default: 0, regexp: NON_NEGATIVE_INTEGER_REGEX
- optional :take, type: Integer, desc: 'The number of results to return', default: Kaminari.config.default_per_page, regexp: POSITIVE_INTEGER_REGEX
- optional :prerelease, type: Boolean, desc: 'Include prerelease versions', default: true
- end
- namespace '/query' do
- before do
- authorize_read_package!(authorized_user_project)
- end
-
- # https://docs.microsoft.com/en-us/nuget/api/search-query-service-resource
- desc 'The NuGet Search Service' do
- detail 'This feature was introduced in GitLab 12.8'
- end
-
- route_setting :authentication, deploy_token_allowed: true, job_token_allowed: :basic_auth, basic_auth_personal_access_token: true
-
- get format: :json do
- search_options = {
- include_prerelease_versions: params[:prerelease],
- per_page: params[:take],
- padding: params[:skip]
- }
- search = Packages::Nuget::SearchService
- .new(authorized_user_project, params[:q], search_options)
- .execute
-
- track_package_event('search_package', :nuget)
-
- present ::Packages::Nuget::SearchResultsPresenter.new(search),
- with: ::API::Entities::Nuget::SearchResults
- end
- end
- end
- end
- end
-end