podbox_ash/lib/podbox/podcast/resources/feed.ex

77 lines
1.7 KiB
Elixir
Raw Normal View History

defmodule Podbox.Podcast.Feed do
@moduledoc """
A subscription to a feed.
"""
alias Podbox.{
Download.Asset,
Podcast,
Podcast.AssetFeed,
Podcast.FeedDownloadCompleteReactor,
Podcast.Show,
Podcast.SubscribeToFeedReactor,
Repo
}
use Ash.Resource,
data_layer: AshSqlite.DataLayer,
domain: Podcast,
notifiers: [Ash.Notifier.PubSub]
@type t :: Ash.Resource.record()
attributes do
uuid_primary_key :id
attribute :uri, :string, allow_nil?: false, public?: true
attribute :refreshed_at, :datetime, allow_nil?: true, public?: true
create_timestamp :inserted_at
update_timestamp :updated_at
end
relationships do
many_to_many :assets, Asset, through: AssetFeed, public?: true
has_many :asset_feeds, AssetFeed, public?: false
has_one :show, Show, public?: true
end
pub_sub do
module Podbox.PubSub
prefix "podcast:feed"
publish :create, "created"
end
actions do
defaults [:read, :destroy, update: :*, create: :*]
action :subscribe, :struct do
constraints instance_of: __MODULE__
argument :uri, :string, allow_nil?: false, public?: true
run SubscribeToFeedReactor
end
action :download_complete, :struct do
constraints instance_of: __MODULE__
argument :asset_id, :uuid, allow_nil?: false, public?: true
run FeedDownloadCompleteReactor
end
read :get_by_asset_id do
argument :asset_id, :uuid, allow_nil?: false, public?: true
get? true
filter expr(asset_feeds.asset_id == ^arg(:asset_id))
prepare build(limit: 1)
end
update :refreshed do
change set_attribute(:refreshed_at, &DateTime.utc_now/0)
end
end
sqlite do
table "podcast_feed"
repo Repo
end
end