otwarchive-symphonyarchive/app/models/subscription.rb

56 lines
2 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
class Subscription < ApplicationRecord
VALID_SUBSCRIBABLES = %w(Work User Series).freeze
belongs_to :user
belongs_to :subscribable, polymorphic: true
validates_presence_of :user
validates :subscribable_type, inclusion: { in: VALID_SUBSCRIBABLES }
# Without the condition, you get a 500 error instead of a validation error
# if there's an invalid subscribable type
validates :subscribable, presence: true,
if: proc { |s| VALID_SUBSCRIBABLES.include?(s.subscribable_type) }
# Get the subscriptions associated with this work
# currently: users subscribed to work, users subscribed to creator of work
scope :for_work, lambda {|work|
where(["(subscribable_id = ? AND subscribable_type = 'Work')
OR (subscribable_id IN (?) AND subscribable_type = 'User')
OR (subscribable_id IN (?) AND subscribable_type = 'Series')",
work.id,
work.pseuds.pluck(:user_id),
work.serial_works.pluck(:series_id)]).
group(:user_id)
}
# The name of the object to which the user is subscribed
def name
if subscribable.respond_to?(:login)
subscribable.login
elsif subscribable.respond_to?(:name)
subscribable.name
elsif subscribable.respond_to?(:title)
subscribable.title
else
I18n.t("subscriptions.deleted")
end
end
def subject_text(creation)
authors = if self.class.anonymous_creation?(creation)
"Anonymous"
else
creation.pseuds.map(&:byline).to_sentence
end
chapter_text = creation.is_a?(Chapter) ? "#{creation.chapter_header} of " : ""
work_title = creation.is_a?(Chapter) ? creation.work.title : creation.title
text = "#{authors} posted #{chapter_text}#{work_title}"
text += subscribable_type == "Series" ? " in the #{self.name} series" : ""
end
def self.anonymous_creation?(creation)
(creation.is_a?(Work) && creation.anonymous?) || (creation.is_a?(Chapter) && creation.work.anonymous?)
end
end