55 lines
2 KiB
Ruby
55 lines
2 KiB
Ruby
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
|