| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | # frozen_string_literal: true | 
					
						
							| 
									
										
										
										
											2017-05-02 00:14:47 +00:00
										 |  |  | # == Schema Information | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Table name: preview_cards | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2018-04-23 09:29:17 +00:00
										 |  |  | #  id                 :bigint(8)        not null, primary key | 
					
						
							| 
									
										
										
										
											2017-05-02 00:14:47 +00:00
										 |  |  | #  url                :string           default(""), not null | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  | #  title              :string           default(""), not null | 
					
						
							|  |  |  | #  description        :string           default(""), not null | 
					
						
							| 
									
										
										
										
											2017-05-02 00:14:47 +00:00
										 |  |  | #  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 | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  | #  created_at         :datetime         not null | 
					
						
							|  |  |  | #  updated_at         :datetime         not null | 
					
						
							| 
									
										
										
										
											2017-12-07 02:37:43 +00:00
										 |  |  | #  embed_url          :string           default(""), not null | 
					
						
							| 
									
										
										
										
											2017-05-02 00:14:47 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class PreviewCard < ApplicationRecord | 
					
						
							| 
									
										
										
										
											2019-08-17 20:04:15 +00:00
										 |  |  |   IMAGE_MIME_TYPES = ['image/jpeg', 'image/png', 'image/gif'].freeze | 
					
						
							| 
									
										
										
										
											2018-03-26 12:02:10 +00:00
										 |  |  |   LIMIT = 1.megabytes | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-27 12:42:22 +00:00
										 |  |  |   self.inheritance_column = false | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   enum type: [:link, :photo, :video, :rich] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  |   has_and_belongs_to_many :statuses | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 19:34:36 +00:00
										 |  |  |   has_attached_file :image, styles: ->(f) { image_styles(f) }, convert_options: { all: '-quality 80 -strip' } | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-01 14:20:57 +00:00
										 |  |  |   include Attachmentable | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  |   validates :url, presence: true, uniqueness: true | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  |   validates_attachment_content_type :image, content_type: IMAGE_MIME_TYPES | 
					
						
							| 
									
										
										
										
											2018-03-26 12:02:10 +00:00
										 |  |  |   validates_attachment_size :image, less_than: LIMIT | 
					
						
							|  |  |  |   remotable_attachment :image, LIMIT | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-10 11:48:48 +00:00
										 |  |  |   scope :cached, -> { where.not(image_file_name: [nil, '']) } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  |   before_save :extract_dimensions, if: :link? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-27 23:33:16 +00:00
										 |  |  |   def missing_image? | 
					
						
							|  |  |  |     width.present? && height.present? && image_file_name.blank? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  |   def save_with_optional_image! | 
					
						
							|  |  |  |     save! | 
					
						
							|  |  |  |   rescue ActiveRecord::RecordInvalid | 
					
						
							|  |  |  |     self.image = nil | 
					
						
							|  |  |  |     save! | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-21 19:34:36 +00:00
										 |  |  |   class << self | 
					
						
							|  |  |  |     private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def image_styles(f) | 
					
						
							|  |  |  |       styles = { | 
					
						
							|  |  |  |         original: { | 
					
						
							|  |  |  |           geometry: '400x400>', | 
					
						
							|  |  |  |           file_geometry_parser: FastGeometryParser, | 
					
						
							|  |  |  |           convert_options: '-coalesce -strip', | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       styles[:original][:format] = 'jpg' if f.instance.image_content_type == 'image/gif' | 
					
						
							|  |  |  |       styles | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def extract_dimensions | 
					
						
							|  |  |  |     file = image.queued_for_write[:original] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return if file.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-21 02:40:12 +00:00
										 |  |  |     width, height = FastImage.size(file.path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return nil if width.nil? | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     self.width  = width | 
					
						
							|  |  |  |     self.height = height | 
					
						
							| 
									
										
										
										
											2017-09-01 14:20:16 +00:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-01-20 00:00:14 +00:00
										 |  |  | end |