Remove Repo fetch from Channel module

This commit is contained in:
Liam 2024-07-14 14:48:11 -04:00
parent 68352bcf9a
commit cd2efb0d39
3 changed files with 45 additions and 8 deletions

View file

@ -8,6 +8,7 @@ defmodule Philomena.Channels do
alias Philomena.Channels.AutomaticUpdater alias Philomena.Channels.AutomaticUpdater
alias Philomena.Channels.Channel alias Philomena.Channels.Channel
alias Philomena.Tags
use Philomena.Subscriptions, use Philomena.Subscriptions,
actor_types: ~w(Channel LivestreamChannel), actor_types: ~w(Channel LivestreamChannel),
@ -50,6 +51,7 @@ defmodule Philomena.Channels do
""" """
def create_channel(attrs \\ %{}) do def create_channel(attrs \\ %{}) do
%Channel{} %Channel{}
|> update_artist_tag(attrs)
|> Channel.changeset(attrs) |> Channel.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
@ -68,10 +70,29 @@ defmodule Philomena.Channels do
""" """
def update_channel(%Channel{} = channel, attrs) do def update_channel(%Channel{} = channel, attrs) do
channel channel
|> update_artist_tag(attrs)
|> Channel.changeset(attrs) |> Channel.changeset(attrs)
|> Repo.update() |> Repo.update()
end end
@doc """
Adds the artist tag from the `"artist_tag"` tag name attribute.
## Examples
iex> update_artist_tag(%Channel{}, %{"artist_tag" => "artist:nighty"})
%Ecto.Changeset{}
"""
def update_artist_tag(%Channel{} = channel, attrs) do
tag =
attrs
|> Map.get("artist_tag", "")
|> Tags.get_tag_by_name()
Channel.artist_tag_changeset(channel, tag)
end
@doc """ @doc """
Updates a channel's state when it goes live. Updates a channel's state when it goes live.

View file

@ -3,7 +3,6 @@ defmodule Philomena.Channels.Channel do
import Ecto.Changeset import Ecto.Changeset
alias Philomena.Tags.Tag alias Philomena.Tags.Tag
alias Philomena.Repo
schema "channels" do schema "channels" do
belongs_to :associated_artist_tag, Tag belongs_to :associated_artist_tag, Tag
@ -36,19 +35,13 @@ defmodule Philomena.Channels.Channel do
@doc false @doc false
def changeset(channel, attrs) do def changeset(channel, attrs) do
tag_id =
case Repo.get_by(Tag, name: attrs["artist_tag"] || "") do
%{id: id} -> id
_ -> nil
end
channel channel
|> cast(attrs, [:type, :short_name]) |> cast(attrs, [:type, :short_name])
|> validate_required([:type, :short_name]) |> validate_required([:type, :short_name])
|> validate_inclusion(:type, ["PicartoChannel", "PiczelChannel"]) |> validate_inclusion(:type, ["PicartoChannel", "PiczelChannel"])
|> put_change(:associated_artist_tag_id, tag_id)
end end
@doc false
def update_changeset(channel, attrs) do def update_changeset(channel, attrs) do
cast(channel, attrs, [ cast(channel, attrs, [
:title, :title,
@ -60,4 +53,11 @@ defmodule Philomena.Channels.Channel do
:last_live_at :last_live_at
]) ])
end end
@doc false
def artist_tag_changeset(channel, tag) do
tag_id = Map.get(tag || %{}, :id)
change(channel, associated_artist_tag_id: tag_id)
end
end end

View file

@ -81,6 +81,22 @@ defmodule Philomena.Tags do
""" """
def get_tag!(id), do: Repo.get!(Tag, id) def get_tag!(id), do: Repo.get!(Tag, id)
@doc """
Gets a single tag.
Returns nil if the Tag does not exist.
## Examples
iex> get_tag_by_name("safe")
%Tag{}
iex> get_tag_by_name("nonexistent")
nil
"""
def get_tag_by_name(name), do: Repo.get_by(Tag, name: name)
@doc """ @doc """
Gets a single tag by its name, or the tag it is aliased to, if it is aliased. Gets a single tag by its name, or the tag it is aliased to, if it is aliased.