docbrown/app/controllers/image_uploads_controller.rb
yheuhtozr c4778d832e
app/controllers & decorators i18n (#16126)
* app/controllers (& decorators) i18n etc

* tidy key names

* update keys

* delete ja.yml

* delete an involved ja.yml

* fix for PR review

* fix for spec

* delete ja.yml
2022-02-03 13:35:56 -05:00

75 lines
1.9 KiB
Ruby

class ImageUploadsController < ApplicationController
before_action :authenticate_user!
before_action :limit_uploads, only: [:create]
after_action :verify_authorized
def create
authorize :image_upload
begin
raise CarrierWave::IntegrityError if params[:image].blank?
invalid_image_error_message = validate_image
unless invalid_image_error_message.nil?
respond_to do |format|
format.json { render json: { error: invalid_image_error_message }, status: :unprocessable_entity }
end
return
end
uploaders = upload_images(params[:image])
rescue CarrierWave::IntegrityError => e # client error
respond_to do |format|
format.json do
render json: { error: e.message }, status: :unprocessable_entity
end
end
return
rescue CarrierWave::ProcessingError # server error
respond_to do |format|
format.json do
render json: { error: I18n.t("image_uploads_controller.server_error") },
status: :unprocessable_entity
end
end
return
end
links = uploaders.map(&:url)
respond_to do |format|
format.json { render json: { links: links }, status: :ok }
end
end
private
def limit_uploads
rate_limit!(:image_upload)
end
def validate_image
images = Array.wrap(params["image"])
return if images.blank?
return is_not_file_message unless valid_image_files?(images)
return filename_too_long_message unless valid_filenames?(images)
nil
end
def valid_image_files?(images)
images.none? { |image| !file?(image) }
end
def valid_filenames?(images)
images.none? { |image| long_filename?(image) }
end
def upload_images(images)
Array.wrap(images).map do |image|
ArticleImageUploader.new.tap do |uploader|
uploader.store!(image)
rate_limiter.track_limit_by_action(:image_upload)
end
end
end
end