forked from openSUSE/open-build-service
/
files_controller.rb
85 lines (69 loc) · 2.62 KB
/
files_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
module Webui
module Packages
class FilesController < Packages::MainController
before_action :set_project
before_action :set_package
before_action :set_filename, only: :update
after_action :verify_authorized
def new
authorize @package, :update?
end
def create
authorize @package, :update?
files = params[:files] || []
filename = params[:filename]
files << ActionDispatch::Http::UploadedFile.new(tempfile: Tempfile.new(''), filename: filename) if filename.present?
file_url = params[:file_url]
errors = []
if file_url.present?
# we have a remote file URI, so we have to download and save it
services = @package.services
# detects automatically git://, src.rpm formats
services.add_download_url(file_url, filename)
added_files = filename || '_service'
errors << "Failed to add file from URL '#{file_url}'" unless services.save
elsif files.present?
# we get files to upload to the backend
upload_service = FileService::Uploader.new(@package, files, params[:comment])
upload_service.call
errors << upload_service.errors
added_files = upload_service.added_files
else
errors << 'No file or URI given'
end
if errors.compact_blank.empty?
redirect_to(package_show_path(project: @project, package: @package),
success: "#{added_files} have been successfully saved.")
else
redirect_back(fallback_location: root_path,
error: "Error while creating #{added_files} files: #{errors.compact_blank.join("\n")}.")
end
end
def update
return unless request.xhr?
authorize @package, :update?
errors = []
begin
@package.save_file(file: params[:file], filename: @filename,
comment: params[:comment])
rescue APIError, StandardError => e
errors << e.message
rescue Backend::Error => e
errors << Xmlhash::XMLHash.new(error: e.summary)[:error]
end
if errors.blank?
flash.now[:success] = "'#{@filename}' has been successfully saved."
else
flash.now[:error] = "Error while adding '#{@filename}': #{errors.compact.join("\n")}."
status = 400
end
status ||= 200
render layout: false, status: status, partial: 'layouts/webui/flash', object: flash
end
private
def set_filename
@filename = params[:filename]
end
end
end
end