diff --git a/.rubocop_todo/layout/argument_alignment.yml b/.rubocop_todo/layout/argument_alignment.yml index 98633709bee8e2c71227950d2596400a0637a56b..1e862c88b3ce053b6232fa251790df3294764033 100644 --- a/.rubocop_todo/layout/argument_alignment.yml +++ b/.rubocop_todo/layout/argument_alignment.yml @@ -1096,7 +1096,6 @@ Layout/ArgumentAlignment: - 'spec/controllers/projects/clusters_controller_spec.rb' - 'spec/controllers/projects/commit_controller_spec.rb' - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb' - - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb' - 'spec/controllers/projects/environments_controller_spec.rb' - 'spec/controllers/projects/feature_flags_clients_controller_spec.rb' - 'spec/controllers/projects/forks_controller_spec.rb' diff --git a/.rubocop_todo/layout/first_hash_element_indentation.yml b/.rubocop_todo/layout/first_hash_element_indentation.yml index a4b520add75ebb83997afd0c06a08450f8812fcc..facc7a58f1a2c6215b26ebf1cebb7748702a3ada 100644 --- a/.rubocop_todo/layout/first_hash_element_indentation.yml +++ b/.rubocop_todo/layout/first_hash_element_indentation.yml @@ -176,7 +176,6 @@ Layout/FirstHashElementIndentation: - 'spec/controllers/projects/commit_controller_spec.rb' - 'spec/controllers/projects/commits_controller_spec.rb' - 'spec/controllers/projects/design_management/designs/raw_images_controller_spec.rb' - - 'spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb' - 'spec/controllers/projects/environments_controller_spec.rb' - 'spec/controllers/projects/issues_controller_spec.rb' - 'spec/controllers/projects/jobs_controller_spec.rb' diff --git a/app/controllers/projects/design_management/designs/resized_image_controller.rb b/app/controllers/projects/design_management/designs/resized_image_controller.rb index 50a997f32dbb41740a2718553871e0fddae5dba4..6bf304419e1d8cfb277938c6e680bdb4ad4961c5 100644 --- a/app/controllers/projects/design_management/designs/resized_image_controller.rb +++ b/app/controllers/projects/design_management/designs/resized_image_controller.rb @@ -8,12 +8,13 @@ class ResizedImageController < Projects::DesignManagement::DesignsController include SendFileUpload before_action :validate_size! + before_action :validate_sha! skip_before_action :default_cache_headers, only: :show def show relation = design.actions - relation = relation.up_to_version(sha) if sha + relation = relation.up_to_version(version) if version action = relation.most_recent.first return render_404 unless action @@ -37,9 +38,19 @@ def validate_size! render_404 unless ::DesignManagement::DESIGN_IMAGE_SIZES.include?(size) end + def validate_sha! + render_404 if sha && version.blank? + end + def size params[:id] end + + def version + return if sha.blank? + + @version ||= design.versions.find_by_sha(sha) + end end end end diff --git a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb index cc0f4a426f421eb4952f294b49fccf8a1dd88cb9..5cc6e1b1bb49954a43cfb68f8a2c230681fa2f87 100644 --- a/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb +++ b/spec/controllers/projects/design_management/designs/resized_image_controller_spec.rb @@ -2,7 +2,7 @@ require 'spec_helper' -RSpec.describe Projects::DesignManagement::Designs::ResizedImageController do +RSpec.describe Projects::DesignManagement::Designs::ResizedImageController, feature_category: :design_management do include DesignManagementTestHelpers let_it_be(:project) { create(:project, :private) } @@ -19,7 +19,7 @@ end describe 'GET #show' do - subject do + subject(:response) do get(:show, params: { namespace_id: project.namespace, @@ -27,12 +27,12 @@ design_id: design_id, sha: sha, id: size - }) + } + ) end before do sign_in(viewer) - subject end context 'when the user does not have permission' do @@ -68,8 +68,6 @@ let(:design_id) { 'foo' } specify do - subject - expect(response).to have_gitlab_http_status(:not_found) end end @@ -136,6 +134,24 @@ def etag(action) expect(response).to have_gitlab_http_status(:not_found) end end + + context 'when multiple design versions have the same sha hash' do + let(:sha) { newest_version.sha } + + before do + create(:design, :with_smaller_image_versions, + issue: create(:issue, project: project), + versions_count: 1, + versions_sha: sha) + end + + it 'serves the newest image' do + action = newest_version.actions.first + + expect(response.header['ETag']).to eq(etag(action)) + expect(response).to have_gitlab_http_status(:ok) + end + end end context 'when design does not have a smaller image size available' do diff --git a/spec/factories/design_management/designs.rb b/spec/factories/design_management/designs.rb index 3d95c754a96c16380c8ff2b4767e55f185536ea2..d16fd0c297b58f305da22dea360a85e037e444e7 100644 --- a/spec/factories/design_management/designs.rb +++ b/spec/factories/design_management/designs.rb @@ -100,8 +100,9 @@ trait :with_file do transient do deleted { false } - versions_count { 1 } file { File.join(Rails.root, 'spec/fixtures/dk.png') } + versions_count { 1 } + versions_sha { nil } end after :create do |design, evaluator| @@ -109,6 +110,8 @@ repository = project.design_repository commit_version = ->(action) do + return evaluator.versions_sha if evaluator.versions_sha + repository.commit_files( evaluator.author, branch_name: 'master',