preview_card.rb 2.13 KB
Newer Older
1
# frozen_string_literal: true
yhirano's avatar
yhirano committed
2 3 4 5
# == Schema Information
#
# Table name: preview_cards
#
Eugen Rochko's avatar
Eugen Rochko committed
6
#  id                 :integer          not null, primary key
yhirano's avatar
yhirano committed
7
#  url                :string           default(""), not null
8 9
#  title              :string           default(""), not null
#  description        :string           default(""), not null
yhirano's avatar
yhirano committed
10 11 12 13 14 15 16 17 18 19 20 21
#  image_file_name    :string
#  image_content_type :string
#  image_file_size    :integer
#  image_updated_at   :datetime
#  type               :integer          default("link"), not null
#  html               :text             default(""), not null
#  author_name        :string           default(""), not null
#  author_url         :string           default(""), not null
#  provider_name      :string           default(""), not null
#  provider_url       :string           default(""), not null
#  width              :integer          default(0), not null
#  height             :integer          default(0), not null
22 23
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
24
#  embed_url          :string           default(""), not null
yhirano's avatar
yhirano committed
25
#
26 27 28

class PreviewCard < ApplicationRecord
  IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze
29
  LIMIT = 1.megabytes
30

31 32 33 34
  self.inheritance_column = false

  enum type: [:link, :photo, :video, :rich]

35
  has_and_belongs_to_many :statuses
36

37
  has_attached_file :image, styles: { original: { geometry: '400x400>', file_geometry_parser: FastGeometryParser } }, convert_options: { all: '-quality 80 -strip' }
38

39 40
  include Attachmentable

41
  validates :url, presence: true, uniqueness: true
42
  validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES
43 44
  validates_attachment_size :image, less_than: LIMIT
  remotable_attachment :image, LIMIT
45

46 47
  before_save :extract_dimensions, if: :link?

48 49 50 51 52 53
  def save_with_optional_image!
    save!
  rescue ActiveRecord::RecordInvalid
    self.image = nil
    save!
  end
54 55 56 57 58 59 60 61

  private

  def extract_dimensions
    file = image.queued_for_write[:original]

    return if file.nil?

62 63 64 65 66 67
    width, height = FastImage.size(file.path)

    return nil if width.nil?

    self.width  = width
    self.height = height
68
  end
69
end