200 lines
4.9 KiB
Ruby
200 lines
4.9 KiB
Ruby
# typed: strict
|
|
class Domain::User::FaUser < Domain::User
|
|
aux_table :fa
|
|
|
|
due_timestamp :scanned_gallery_at, 3.years
|
|
due_timestamp :scanned_page_at, 3.months
|
|
due_timestamp :scanned_follows_at, 3.months
|
|
due_timestamp :scanned_followed_by_at, 3.months
|
|
due_timestamp :scanned_incremental_at, 1.month
|
|
|
|
# todo - set this to be the right fav model type
|
|
has_many :user_post_favs,
|
|
-> { order(fa_fav_id: :desc) },
|
|
class_name: "Domain::UserPostFav::FaUserPostFav",
|
|
foreign_key: :user_id,
|
|
inverse_of: :user,
|
|
dependent: :destroy
|
|
|
|
belongs_to :last_user_page_log_entry,
|
|
foreign_key: :last_user_page_id,
|
|
class_name: "::HttpLogEntry",
|
|
optional: true
|
|
|
|
belongs_to :last_gallery_page_log_entry,
|
|
foreign_key: :last_gallery_page_id,
|
|
class_name: "::HttpLogEntry",
|
|
optional: true
|
|
|
|
has_followed_users! Domain::User::FaUser
|
|
has_followed_by_users! Domain::User::FaUser
|
|
has_created_posts! Domain::Post::FaPost
|
|
has_faved_posts! Domain::Post::FaPost,
|
|
Domain::UserPostFav::FaUserPostFav,
|
|
fav_model_order: {
|
|
fa_fav_id: :desc,
|
|
}
|
|
|
|
enum :state,
|
|
{ ok: "ok", account_disabled: "account_disabled", error: "error" },
|
|
prefix: :state
|
|
|
|
validates :name, presence: true
|
|
validates :url_name, presence: true, uniqueness: true
|
|
validates :state, presence: true
|
|
|
|
# validates :account_status,
|
|
# inclusion: {
|
|
# in: %w[active suspended banned deceased],
|
|
# allow_nil: true,
|
|
# }
|
|
|
|
after_initialize { self.state ||= "ok" if new_record? }
|
|
|
|
sig { override.returns(T.class_of(Domain::UserPostFav)) }
|
|
def self.fav_model_type
|
|
Domain::UserPostFav::FaUserPostFav
|
|
end
|
|
|
|
sig { override.returns([String, Symbol]) }
|
|
def self.param_prefix_and_attribute
|
|
["fa", :url_name]
|
|
end
|
|
|
|
sig { returns(String) }
|
|
def sigil_for_view
|
|
case account_status
|
|
when "active"
|
|
"~"
|
|
when "suspended"
|
|
"!"
|
|
when "banned"
|
|
"-"
|
|
when "deceased"
|
|
"∞"
|
|
when "admin"
|
|
"@"
|
|
else
|
|
"~"
|
|
end
|
|
end
|
|
|
|
sig { void }
|
|
def thing
|
|
Domain::User::FaUser.where(url_name: "test")
|
|
end
|
|
|
|
sig { override.returns(String) }
|
|
def self.view_prefix
|
|
"fa"
|
|
end
|
|
|
|
sig { override.returns(Domain::DomainType) }
|
|
def self.domain_type
|
|
Domain::DomainType::Fa
|
|
end
|
|
|
|
sig { override.returns(String) }
|
|
def description_html_base_domain
|
|
"furaffinity.net"
|
|
end
|
|
|
|
sig { override.returns(String) }
|
|
def site_name_for_view
|
|
"Furaffinity"
|
|
end
|
|
|
|
sig { override.returns(T.nilable(String)) }
|
|
def description_html_for_view
|
|
profile_html
|
|
end
|
|
|
|
sig { override.returns(T::Array[String]) }
|
|
def names_for_search
|
|
[name, url_name, full_name].compact
|
|
end
|
|
|
|
sig do
|
|
params(
|
|
submission_parser:
|
|
T.any(
|
|
Domain::Fa::Parser::ListedSubmissionParserHelper,
|
|
Domain::Fa::Parser::SubmissionParserHelper,
|
|
),
|
|
).returns(Domain::User::FaUser)
|
|
end
|
|
def self.find_or_build_from_submission_parser(submission_parser)
|
|
find_or_initialize_by(url_name: submission_parser.artist_url_name) do |user|
|
|
user.name = submission_parser.artist
|
|
end
|
|
end
|
|
|
|
sig do
|
|
params(
|
|
post_id: Integer,
|
|
fav_id: T.nilable(Integer),
|
|
explicit_time: T.nilable(Time),
|
|
).returns(Domain::UserPostFav)
|
|
end
|
|
def update_fav_model(post_id:, fav_id: nil, explicit_time: nil)
|
|
model = self.user_post_favs.find_or_initialize_by(post_id:)
|
|
model.fa_fav_id = fav_id if fav_id.present?
|
|
model.explicit_time = explicit_time.in_time_zone if explicit_time.present?
|
|
model.save!
|
|
model
|
|
end
|
|
|
|
# TODO - write a test for this
|
|
sig { override.returns(String) }
|
|
def account_status_for_view
|
|
as =
|
|
account_status ||
|
|
begin
|
|
if (hle = guess_last_user_page_log_entry)
|
|
parser =
|
|
Domain::Fa::Parser::Page.from_log_entry(
|
|
hle,
|
|
require_logged_in: false,
|
|
)
|
|
parser.user_page.account_status.to_s if parser.probably_user_page?
|
|
end
|
|
end || "unknown"
|
|
as.titlecase
|
|
end
|
|
|
|
sig { returns(String) }
|
|
def account_state_for_view
|
|
case state
|
|
when "ok"
|
|
"Ok"
|
|
when "account_disabled"
|
|
"Disabled"
|
|
when "error"
|
|
"Error"
|
|
else
|
|
"Unknown"
|
|
end
|
|
end
|
|
|
|
sig { returns(T.nilable(HttpLogEntry)) }
|
|
def guess_last_user_page_log_entry
|
|
last_user_page_log_entry ||
|
|
HttpLogEntry.find_by_uri_host_path(
|
|
"https://www.furaffinity.net/user/#{url_name}/",
|
|
) ||
|
|
HttpLogEntry.find_by_uri_host_path(
|
|
"https://www.furaffinity.net/user/#{url_name}",
|
|
)
|
|
end
|
|
|
|
sig { override.returns(T.nilable(String)) }
|
|
def external_url_for_view
|
|
"https://www.furaffinity.net/user/#{url_name}" if url_name.present?
|
|
end
|
|
|
|
sig { override.returns(T.nilable(String)) }
|
|
def name_for_view
|
|
name || url_name
|
|
end
|
|
end
|