Files
redux-scraper/app/models/domain/post/sofurry_post.rb
2025-07-01 21:02:23 +00:00

116 lines
2.8 KiB
Ruby

# typed: strict
class Domain::Post::SofurryPost < Domain::Post
include AttrJsonRecordAliases
include HasAttrJsonEnum
has_single_creator! Domain::User::SofurryUser
has_single_file!
belongs_to_groups! :folders,
Domain::PostGroup::SofurryFolder,
Domain::PostGroupJoin::SofurryFolderJoin
validates :sofurry_id, presence: true, uniqueness: true
attr_json :state, :string
attr_json :sofurry_id, :integer
attr_json :title, :string
attr_json :tags_array, :string, array: true
attr_json :description, :string
attr_json :file_name, :string
attr_json :scanned_at, ActiveModelUtcTimeValue.new
attr_json :last_scan_log_entry_id, :integer
belongs_to :last_scan_log_entry, class_name: "::HttpLogEntry", optional: true
attr_json :last_gallery_log_entry_id, :integer
belongs_to :last_gallery_log_entry,
class_name: "::HttpLogEntry",
optional: true
scope :for_media_type, ->(media_type) { where(media_type:) }
attr_json_enum(
:media_type,
:integer,
{ stories: 0, art: 1, music: 2, journals: 3, photos: 4 },
prefix: true,
)
attr_json_enum(
:content_level,
:integer,
{ clean: 0, adult: 1, extreme: 2 },
prefix: true,
)
enum :state,
{
pending: "pending",
ok: "ok",
removed: "removed",
retryable_error: "retryable_error",
terminal_error: "terminal_error",
},
prefix: true
validates :state, presence: true
after_initialize { self.state ||= "pending" }
sig { override.returns(String) }
def description_html_base_domain
"sofurry.com"
end
sig { override.returns(T.nilable(String)) }
def description_html_for_view
description
end
sig { override.returns(T.nilable(T.any(String, Integer))) }
def domain_id_for_view
self.sofurry_id
end
sig { override.returns(T.nilable(Addressable::URI)) }
def external_url_for_view
if sfid = self.sofurry_id
Addressable::URI.parse("https://www.sofurry.com/view/#{sfid}")
end
end
sig { override.returns(T.nilable(Domain::PostFile)) }
def primary_file_for_view
self.file
end
sig { override.returns(T.nilable(Domain::User)) }
def primary_creator_for_view
self.creator
end
sig { override.returns(Domain::DomainType) }
def self.domain_type
Domain::DomainType::Sofurry
end
sig { override.returns([String, Symbol]) }
def self.param_prefix_and_attribute
["sf", :sofurry_id]
end
sig { override.returns(String) }
def self.view_prefix
"sf"
end
sig { override.returns(T.nilable(T::Array[TagForView])) }
def tags_for_view
tags_array.map { |value| TagForView.new(category: :general, value:) }
end
sig { override.returns(T.nilable(HttpLogEntry)) }
def scanned_post_log_entry_for_view
last_scan_log_entry
end
end