123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- # frozen_string_literal: true
- # == Schema Information
- #
- # Table name: site_uploads
- #
- # id :bigint(8) not null, primary key
- # var :string default(""), not null
- # file_file_name :string
- # file_content_type :string
- # file_file_size :integer
- # file_updated_at :datetime
- # meta :json
- # created_at :datetime not null
- # updated_at :datetime not null
- # blurhash :string
- #
- class SiteUpload < ApplicationRecord
- include Attachmentable
- FAVICON_SIZES = [16, 32, 48].freeze
- APPLE_ICON_SIZES = [57, 60, 72, 76, 114, 120, 144, 152, 167, 180, 1024].freeze
- ANDROID_ICON_SIZES = [36, 48, 72, 96, 144, 192, 256, 384, 512].freeze
- APP_ICON_SIZES = (APPLE_ICON_SIZES + ANDROID_ICON_SIZES).uniq.freeze
- STYLES = {
- app_icon:
- APP_ICON_SIZES.to_h do |size|
- [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
- end.freeze,
- favicon:
- FAVICON_SIZES.to_h do |size|
- [:"#{size}", { format: 'png', geometry: "#{size}x#{size}#", file_geometry_parser: FastGeometryParser }]
- end.freeze,
- thumbnail: {
- '@1x': {
- format: 'png',
- geometry: '1200x630#',
- file_geometry_parser: FastGeometryParser,
- blurhash: {
- x_comp: 4,
- y_comp: 4,
- }.freeze,
- },
- '@2x': {
- format: 'png',
- geometry: '2400x1260#',
- file_geometry_parser: FastGeometryParser,
- }.freeze,
- }.freeze,
- mascot: {}.freeze,
- }.freeze
- has_attached_file :file, styles: ->(file) { STYLES[file.instance.var.to_sym] }, convert_options: { all: '-coalesce +profile "!icc,*" +set date:modify +set date:create +set date:timestamp' }, processors: [:lazy_thumbnail, :blurhash_transcoder, :type_corrector]
- validates_attachment_content_type :file, content_type: %r{\Aimage/.*\z}
- validates :file, presence: true
- validates :var, presence: true, uniqueness: true
- before_save :set_meta
- after_commit :clear_cache
- def cache_key
- "site_uploads/#{var}"
- end
- private
- def set_meta
- tempfile = file.queued_for_write[:original]
- return if tempfile.nil?
- width, height = FastImage.size(tempfile.path)
- self.meta = { width: width, height: height }
- end
- def clear_cache
- Rails.cache.delete(cache_key)
- end
- end
|