59 lines
1.1 KiB
Ruby
59 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class ImageValidator < ApplicationEachValidator
|
|
class Validation < Validation
|
|
MAX_SIZE = 1.megabyte
|
|
|
|
CONTENT_TYPES = %w[
|
|
image/png
|
|
image/jpeg
|
|
image/gif
|
|
].freeze
|
|
|
|
EXTENSIONS = %w[
|
|
png
|
|
jpg
|
|
jpeg
|
|
gif
|
|
].freeze
|
|
|
|
def perform
|
|
return unless value.attached?
|
|
|
|
case value
|
|
when ActiveStorage::Attached::One
|
|
check value
|
|
when ActiveStorage::Attached::Many
|
|
value.attachments.each(&method(:check))
|
|
else
|
|
raise TypeError
|
|
end
|
|
end
|
|
|
|
def check(item)
|
|
check_format item
|
|
check_ext item
|
|
check_size item
|
|
end
|
|
|
|
def check_format(item)
|
|
return if item.blob.content_type.in? CONTENT_TYPES
|
|
|
|
error :image_format, content_type: item.blob.content_type
|
|
end
|
|
|
|
def check_ext(item)
|
|
return if item.blob.filename.extension.in? EXTENSIONS
|
|
|
|
error :image_ext, ext: item.blob.filename.extension
|
|
end
|
|
|
|
def check_size(item)
|
|
error :image_size unless item.blob.byte_size <= max_size
|
|
end
|
|
|
|
def max_size
|
|
MAX_SIZE
|
|
end
|
|
end
|
|
end
|