docbrown/app/models/podcast.rb
Anna Buianova c3ed38f832 Moved creating a new podcast to a separate ActiveJob #2952 (#3373)
* Podcasts reachable status #2952

* Specs for podcasts statuses

* Moved podcast episode create to a separate ActiveJob

* Use RssItemData wrapper in GetEpisode for consistency

* Reorganize services/podcasts
2019-07-04 13:10:54 -04:00

47 lines
1.4 KiB
Ruby

class Podcast < ApplicationRecord
has_many :podcast_episodes
mount_uploader :image, ProfileImageUploader
mount_uploader :pattern_image, ProfileImageUploader
validates :main_color_hex, :title, :feed_url, :image, presence: true
validates :feed_url, uniqueness: true
validates :slug,
presence: true,
uniqueness: true,
format: { with: /\A[a-zA-Z0-9\-_]+\Z/ },
exclusion: { in: ReservedWords.all, message: "slug is reserved" }
validate :unique_slug_including_users_and_orgs, if: :slug_changed?
after_save :bust_cache
scope :reachable, -> { where(reachable: true) }
alias_attribute :path, :slug
alias_attribute :profile_image_url, :image_url
alias_attribute :name, :title
def existing_episode(item)
episode = PodcastEpisode.where(media_url: item.enclosure_url).
or(PodcastEpisode.where(title: item.title)).
or(PodcastEpisode.where(guid: item.guid.to_s)).presence
episode ||= PodcastEpisode.where(website_url: item.link).presence if unique_website_url?
episode.to_a.first
end
private
def unique_slug_including_users_and_orgs
errors.add(:slug, "is taken.") if User.find_by(username: slug) || Organization.find_by(slug: slug) || Page.find_by(slug: slug)
end
def bust_cache
return unless path
Podcasts::BustCacheJob.perform_later(path)
end
def pull_all_episodes
Podcasts::GetEpisodesJob.perform_later(id)
end
end