cdn/app/controllers/uploads_controller.rb
End Nightshade cec596e620
batchy yay
2026-02-10 13:44:05 -07:00

114 lines
3.1 KiB
Ruby

# frozen_string_literal: true
class UploadsController < ApplicationController
before_action :set_upload, only: [ :update, :destroy ]
def index
@uploads = current_user.uploads.includes(:blob).recent
if params[:query].present?
@uploads = @uploads.search_by_filename(params[:query])
end
@uploads = @uploads.page(params[:page]).per(50)
end
def create
uploaded_files = extract_uploaded_files
if uploaded_files.empty?
redirect_to uploads_path, alert: "Please select at least one file to upload."
return
end
if uploaded_files.size > BatchUploadService::MAX_FILES_PER_BATCH
redirect_to uploads_path, alert: "Too many files selected. Max #{BatchUploadService::MAX_FILES_PER_BATCH} files allowed per upload."
return
end
service = BatchUploadService.new(user: current_user, provenance: :web)
result = service.process_files(uploaded_files)
flash_message = build_flash_message(result)
if result.uploads.any?
redirect_to uploads_path, notice: flash_message
else
redirect_to uploads_path, alert: flash_message
end
rescue StandardError => e
event = Sentry.capture_exception(e)
redirect_to uploads_path, alert: "Upload failed: #{e.message} (Error ID: #{event&.event_id})"
end
def update
authorize @upload
new_filename = params[:filename].to_s.strip
if new_filename.blank?
redirect_to uploads_path, alert: "Filename can't be blank."
return
end
@upload.rename!(new_filename)
redirect_to uploads_path, notice: "Renamed to #{@upload.filename}"
rescue Pundit::NotAuthorizedError
redirect_to uploads_path, alert: "You are not authorized to rename this upload."
end
def destroy
authorize @upload
@upload.destroy!
redirect_back fallback_location: uploads_path, notice: "Upload deleted successfully."
rescue Pundit::NotAuthorizedError
redirect_back fallback_location: uploads_path, alert: "You are not authorized to delete this upload."
end
def destroy_batch
ids = Array(params[:ids]).reject(&:blank?)
if ids.empty?
redirect_to uploads_path, alert: "No files selected."
return
end
uploads = current_user.uploads.where(id: ids)
count = uploads.size
filenames = uploads.includes(:blob).map { |u| u.filename.to_s }
uploads.destroy_all
redirect_to uploads_path, notice: "Deleted #{count} #{'file'.pluralize(count)}: #{filenames.join(', ')}"
end
private
def extract_uploaded_files
files = []
files.concat(Array(params[:files])) if params[:files].present?
files << params[:file] if params[:file].present?
files.reject(&:blank?)
end
def build_flash_message(result)
parts = []
if result.uploads.any?
count = result.uploads.size
filenames = result.uploads.map { |u| u.filename.to_s }.join(", ")
parts << "Uploaded #{count} #{'file'.pluralize(count)}: #{filenames}"
end
if result.failed.any?
failures = result.failed.map { |f| "#{f.filename} (#{f.reason})" }.join("; ")
parts << "Failed: #{failures}"
end
parts.join(". ")
end
def set_upload
@upload = Upload.find(params[:id])
end
end