diff options
Diffstat (limited to 'lib/api/releases.rb')
-rw-r--r-- | lib/api/releases.rb | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/lib/api/releases.rb b/lib/api/releases.rb index c20e618efd1..c65a23e334f 100644 --- a/lib/api/releases.rb +++ b/lib/api/releases.rb @@ -6,9 +6,12 @@ module API RELEASE_ENDPOINT_REQUIREMENTS = API::NAMESPACE_OR_PROJECT_REQUIREMENTS .merge(tag_name: API::NO_SLASH_URL_PART_REGEX) + RELEASE_CLI_USER_AGENT = 'GitLab-release-cli' before { authorize_read_releases! } + after { track_release_event } + feature_category :release_orchestration params do @@ -17,6 +20,7 @@ module API resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do desc 'Get a project releases' do detail 'This feature was introduced in GitLab 11.7.' + named 'get_releases' success Entities::Release end params do @@ -29,11 +33,22 @@ module API get ':id/releases' do releases = ::ReleasesFinder.new(user_project, current_user, declared_params.slice(:order_by, :sort)).execute - present paginate(releases), with: Entities::Release, current_user: current_user + # We cache the serialized payload per user in order to avoid repeated renderings. + # Since the cached result could contain sensitive information, + # it will expire in a short interval. + present_cached paginate(releases), + with: Entities::Release, + # `current_user` could be absent if the releases are publicly accesible. + # We should not use `cache_key` for the user because the version/updated_at + # context is unnecessary here. + cache_context: -> (_) { "user:{#{current_user&.id}}" }, + expires_in: 5.minutes, + current_user: current_user end desc 'Get a single project release' do detail 'This feature was introduced in GitLab 11.7.' + named 'get_release' success Entities::Release end params do @@ -47,6 +62,7 @@ module API desc 'Create a new release' do detail 'This feature was introduced in GitLab 11.7.' + named 'create_release' success Entities::Release end params do @@ -84,6 +100,7 @@ module API desc 'Update a release' do detail 'This feature was introduced in GitLab 11.7.' + named 'update_release' success Entities::Release end params do @@ -112,6 +129,7 @@ module API desc 'Delete a release' do detail 'This feature was introduced in GitLab 11.7.' + named 'delete_release' success Entities::Release end params do @@ -176,8 +194,23 @@ module API def log_release_milestones_updated_audit_event # extended in EE end + + def release_cli? + request.env['HTTP_USER_AGENT']&.include?(RELEASE_CLI_USER_AGENT) == true + end + + def event_context + { + release_cli: release_cli? + } + end + + def track_release_event + Gitlab::Tracking.event(options[:for].name, options[:route_options][:named], + project: user_project, user: current_user, **event_context) + end end end end -API::Releases.prepend_if_ee('EE::API::Releases') +API::Releases.prepend_mod_with('API::Releases') |