Normalize default object types to file in the file upload service

parent 3910b4f4
module Geo module Geo
class FileUploadService class FileUploadService
DEFAULT_OBJECT_TYPES = [:attachment, :avatar, :file].freeze
IAT_LEEWAY = 60.seconds.to_i IAT_LEEWAY = 60.seconds.to_i
attr_reader :object_type, :object_db_id, :auth_header attr_reader :object_type, :object_db_id, :auth_header
...@@ -15,15 +16,31 @@ module Geo ...@@ -15,15 +16,31 @@ module Geo
data = ::Gitlab::Geo::JwtRequestDecoder.new(auth_header).decode data = ::Gitlab::Geo::JwtRequestDecoder.new(auth_header).decode
return unless data.present? return unless data.present?
uploader_class.new(object_db_id, data).execute uploader_klass.new(object_db_id, data).execute
end end
private private
def uploader_class def uploader_klass
"Gitlab::Geo::#{object_type.to_s.camelize}Uploader".constantize uploader_klass_name.constantize
rescue NameError rescue NameError
Gitlab::Geo::FileUploader log("Unknown file type: #{object_type}")
raise
end
def uploader_klass_name
klass_name =
if DEFAULT_OBJECT_TYPES.include?(object_type.to_sym)
:file
else
object_type
end
"Gitlab::Geo::#{klass_name.to_s.camelize}Uploader"
end
def log(message)
Rails.logger.info "#{self.class.name}: #{message}"
end end
end end
end end
...@@ -76,6 +76,59 @@ describe Geo::FileUploadService, services: true do ...@@ -76,6 +76,59 @@ describe Geo::FileUploadService, services: true do
end end
end end
context 'attachment' do
let(:note) { create(:note, :with_attachment) }
let(:upload) { Upload.find_by(model: note, uploader: 'AttachmentUploader') }
let(:params) { { id: upload.id, type: 'attachment' } }
let(:file_transfer) { Gitlab::Geo::FileTransfer.new(:attachment, upload) }
let(:transfer_request) { Gitlab::Geo::TransferRequest.new(file_transfer.request_data) }
let(:req_header) { transfer_request.headers['Authorization'] }
it 'sends attachment file' do
service = described_class.new(params, req_header)
response = service.execute
expect(response[:code]).to eq(:ok)
expect(response[:file].path).to eq(note.attachment.path)
end
it 'returns nil if no authorization' do
service = described_class.new(params, nil)
expect(service.execute).to be_nil
end
end
context 'file upload' do
let(:project) { create(:empty_project) }
let(:upload) { Upload.find_by(model: project, uploader: 'FileUploader') }
let(:params) { { id: upload.id, type: 'file' } }
let(:file_transfer) { Gitlab::Geo::FileTransfer.new(:file, upload) }
let(:transfer_request) { Gitlab::Geo::TransferRequest.new(file_transfer.request_data) }
let(:req_header) { transfer_request.headers['Authorization'] }
let(:file) { fixture_file_upload(Rails.root + 'spec/fixtures/dk.png', 'image/png') }
before do
FileUploader.new(project).store!(file)
end
it 'sends the file' do
service = described_class.new(params, req_header)
response = service.execute
expect(response[:code]).to eq(:ok)
expect(response[:file].path).to end_with('dk.png')
end
it 'returns nil if no authorization' do
service = described_class.new(params, nil)
expect(service.execute).to be_nil
end
end
context 'LFS Object' do context 'LFS Object' do
let(:lfs_object) { create(:lfs_object, :with_file) } let(:lfs_object) { create(:lfs_object, :with_file) }
let(:params) { { id: lfs_object.id, type: 'lfs' } } let(:params) { { id: lfs_object.id, type: 'lfs' } }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment