@@ -5,30 +5,22 @@ class UploadFilesController < ApplicationController
55 include DateTimeCommon
66 include EventLogger
77
8+ before_action :find_upload_file , only : [ :destroy , :cancel , :retry ]
9+ before_action :find_bundle , only : [ :index , :create ]
10+
811 def index
9- project_id = params [ :project_id ]
10- upload_bundle_id = params [ :upload_bundle_id ]
11- upload_bundle = UploadBundle . find ( project_id , upload_bundle_id )
12- render partial : '/projects/show/upload_files' , layout : false , locals : { bundle : upload_bundle }
12+ render partial : '/projects/show/upload_files' , layout : false , locals : { bundle : @upload_bundle }
1313 end
1414
1515 # JSON based create method to add a local filepath to an upload bundle
1616 def create
17- project_id = params [ :project_id ]
18- upload_bundle_id = params [ :upload_bundle_id ]
19- upload_bundle = UploadBundle . find ( project_id , upload_bundle_id )
20- if upload_bundle . nil?
21- head :not_found
22- return
23- end
24-
2517 path = params [ :path ]
2618 files = list_files ( path )
2719 upload_files = files . map do |file |
2820 UploadFile . new . tap do |f |
2921 f . id = UploadFile . generate_id
30- f . project_id = project_id
31- f . upload_bundle_id = upload_bundle_id
22+ f . project_id = @upload_bundle . project_id
23+ f . upload_bundle_id = @upload_bundle . id
3224 f . creation_date = now
3325 f . file_location = file . fullpath
3426 f . filename = file . filename
@@ -40,69 +32,94 @@ def create
4032 upload_files . each do |file |
4133 unless file . valid?
4234 errors = file . errors . full_messages . join ( ", " )
43- log_error ( 'UploadFile validation error' , { error : errors , project_id : project_id , upload_bundle_id : upload_bundle_id , file : file . to_s } )
35+ log_error ( 'UploadFile validation error' , { error : errors , project_id : @upload_bundle . project_id , upload_bundle_id : @upload_bundle . id , file : file . to_s } )
4436 render json : { message : t ( ".invalid_file" , filename : file . filename , errors : errors ) } , status : :bad_request
4537 return
4638 end
4739 end
4840
4941 upload_files . each do |file |
5042 file . save
51- log_info ( 'Added file to upload bundle' , { project_id : project_id , upload_bundle_id : upload_bundle_id , file : file . filename } )
43+ log_info ( 'Added file to upload bundle' , { project_id : @upload_bundle . project_id , upload_bundle_id : @upload_bundle . id , file : file . filename } )
5244 end
5345
5446 message = upload_files . size > 1 ? t ( ".files_added" , count : upload_files . size , path_folder : path ) : t ( ".file_added" , filename : upload_files . first . filename )
5547 render json : { message : message } , status : :ok
5648 end
5749
5850 def destroy
59- project_id = params [ :project_id ]
60- upload_bundle_id = params [ :upload_bundle_id ]
61- file_id = params [ :id ]
62- upload_file = UploadFile . find ( project_id , upload_bundle_id , file_id )
51+ if @upload_file . status . uploading?
52+ return redirect_back fallback_location : root_path , alert : t ( ".file_in_progress" , filename : @upload_file . filename )
53+ end
6354
64- if upload_file . nil?
65- redirect_back fallback_location : root_path , alert : t ( ".file_not_found" , file_id : file_id , project_id : project_id )
66- return
55+ @upload_file . destroy
56+ log_upload_file_event ( @upload_file , message : 'events.upload_file.deleted' )
57+ log_info ( 'Upload file deleted' , { id : @upload_file . id , filename : @upload_file . filename } )
58+ redirect_back fallback_location : root_path , notice : t ( ".upload_file_removed" , filename : @upload_file . filename )
59+ end
60+
61+ def cancel
62+ previous_status = @upload_file . status . to_s
63+ if @upload_file . status . uploading?
64+ command_client = Command ::CommandClient . new ( socket_path : ::Configuration . command_server_socket_file )
65+ request = Command ::Request . new ( command : 'upload.cancel' , body : { project_id : @upload_file . project_id , upload_bundle_id : @upload_file . upload_bundle_id , file_id : @upload_file . id } )
66+ response = command_client . request ( request )
67+ return redirect_back fallback_location : root_path , alert : t ( '.file_cancellation_error' , filename : @upload_file . filename ) if response . status != 200
6768 end
6869
69- if upload_file . status . uploading?
70- redirect_back fallback_location : root_path , alert : t ( ".file_in_progress" , filename : upload_file . filename )
71- return
70+ if @upload_file . update ( status : FileStatus ::CANCELLED )
71+ log_upload_file_event ( @upload_file , message : 'events.upload_file.cancel_completed' , metadata : { previous_status : previous_status } )
72+ log_info ( 'Upload file cancelled' , { id : @upload_file . id , filename : @upload_file . filename } )
73+ redirect_back fallback_location : root_path , notice : t ( '.file_cancellation_success' , filename : @upload_file . filename )
74+ else
75+ redirect_back fallback_location : root_path , notice : t ( '.file_cancellation_update_error' , filename : @upload_file . filename )
7276 end
77+ end
7378
74- upload_file . destroy
75- redirect_back fallback_location : root_path , notice : t ( ".upload_file_removed" , filename : upload_file . filename )
79+ def retry
80+ status = @upload_file . status
81+ unless FileStatus . retryable_statuses . include? ( status )
82+ return redirect_back fallback_location : root_path , alert : t ( '.file_retry_invalid' , status : status )
83+ end
84+ if @upload_file . update ( status : FileStatus ::PENDING )
85+ log_upload_file_event ( @upload_file , message : 'events.upload_file.retry_request' , metadata : { previous_status : status } )
86+ log_info ( 'Upload file retry requested' , { id : @upload_file . id , filename : @upload_file . filename } )
87+ redirect_back fallback_location : root_path , notice : t ( '.file_retry_success' , filename : @upload_file . filename )
88+ else
89+ redirect_back fallback_location : root_path , alert : t ( '.file_retry_error' , filename : @upload_file . filename )
90+ end
7691 end
7792
78- def cancel
93+ private
94+
95+ def find_upload_file
7996 project_id = params [ :project_id ]
8097 upload_bundle_id = params [ :upload_bundle_id ]
8198 file_id = params [ :id ]
82- file = UploadFile . find ( project_id , upload_bundle_id , file_id )
99+ @upload_file = UploadFile . find ( project_id , upload_bundle_id , file_id )
83100
84- if file . nil?
85- return redirect_back fallback_location : root_path , alert : t ( ".file_not_found" , project_id : project_id , upload_bundle_id : upload_bundle_id , file_id : file_id )
86- end
87-
88- previous_status = file . status . to_s
89- if file . status . uploading?
90- command_client = Command ::CommandClient . new ( socket_path : ::Configuration . command_server_socket_file )
91- request = Command ::Request . new ( command : 'upload.cancel' , body : { project_id : project_id , upload_bundle_id : upload_bundle_id , file_id : file_id } )
92- response = command_client . request ( request )
93- return redirect_back fallback_location : root_path , alert : t ( '.file_cancellation_error' , filename : file . filename ) if response . status != 200
101+ if @upload_file . nil?
102+ redirect_back fallback_location : root_path , alert : t ( "upload_files.file_not_found" , project_id : project_id , upload_bundle_id : upload_bundle_id , file_id : file_id )
103+ return
94104 end
105+ end
95106
96- if file . update ( status : FileStatus ::CANCELLED )
97- log_upload_file_event ( file , message : 'events.upload_file.cancel_completed' , metadata : { filename : file . filename , previous_status : previous_status } )
98- redirect_back fallback_location : root_path , notice : t ( '.file_cancellation_success' , filename : file . filename )
99- else
100- redirect_back fallback_location : root_path , notice : t ( '.file_cancellation_update_error' , filename : file . filename )
107+ def find_bundle
108+ project_id = params [ :project_id ]
109+ upload_bundle_id = params [ :upload_bundle_id ]
110+ @upload_bundle = UploadBundle . find ( project_id , upload_bundle_id )
111+
112+ if @upload_bundle . nil?
113+ message = t ( "upload_files.bundle_not_found" , project_id : project_id , upload_bundle_id : upload_bundle_id )
114+ if ajax_request?
115+ render json : { message : message } , status : :not_found
116+ else
117+ redirect_back fallback_location : root_path , alert : message
118+ end
119+ return
101120 end
102121 end
103122
104- private
105-
106123 def list_files ( path , limit : 100 )
107124 return [ ] unless File . exist? ( path )
108125
0 commit comments