* 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
75 lines
1.9 KiB
Ruby
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
|