Improved the way playlist_indexes are rejected on update

This commit is contained in:
Kieran Eglin 2024-07-15 15:28:15 -07:00
parent 48b4699b63
commit 481ad650a4
No known key found for this signature in database
GPG key ID: 193984967FCF432D
3 changed files with 26 additions and 5 deletions

View file

@ -142,12 +142,17 @@ defmodule Pinchflat.Media do
""" """
def create_media_item_from_backend_attrs(source, media_attrs_struct) do def create_media_item_from_backend_attrs(source, media_attrs_struct) do
attrs = Map.merge(%{source_id: source.id}, Map.from_struct(media_attrs_struct)) attrs = Map.merge(%{source_id: source.id}, Map.from_struct(media_attrs_struct))
# Some fields should only be set on insert and not on update.
fields_to_drop_on_update = [:playlist_index]
%MediaItem{} %MediaItem{}
|> MediaItem.changeset(attrs) |> MediaItem.changeset(attrs)
|> Repo.insert( |> Repo.insert(
on_conflict: [ on_conflict: [
set: Map.to_list(attrs) set:
attrs
|> Map.drop(fields_to_drop_on_update)
|> Map.to_list()
], ],
conflict_target: [:source_id, :media_id] conflict_target: [:source_id, :media_id]
) )

View file

@ -11,8 +11,7 @@ defmodule Pinchflat.YtDlp.Media do
:livestream, :livestream,
:short_form_content, :short_form_content,
:uploaded_at, :uploaded_at,
:duration_seconds, :duration_seconds
:playlist_index
] ]
defstruct [ defstruct [
@ -109,7 +108,7 @@ defmodule Pinchflat.YtDlp.Media do
duration_seconds: response["duration"] && round(response["duration"]), duration_seconds: response["duration"] && round(response["duration"]),
short_form_content: response["webpage_url"] && short_form_content?(response), short_form_content: response["webpage_url"] && short_form_content?(response),
uploaded_at: response["upload_date"] && parse_uploaded_at(response), uploaded_at: response["upload_date"] && parse_uploaded_at(response),
playlist_index: response["playlist_index"] playlist_index: response["playlist_index"] || 0
} }
end end

View file

@ -689,7 +689,24 @@ defmodule Pinchflat.MediaTest do
assert {:ok, %MediaItem{} = media_item_2} = Media.create_media_item_from_backend_attrs(source, different_attrs) assert {:ok, %MediaItem{} = media_item_2} = Media.create_media_item_from_backend_attrs(source, different_attrs)
assert media_item_1.id == media_item_2.id assert media_item_1.id == media_item_2.id
assert media_item_2.title == different_attrs.title assert Repo.reload(media_item_2).title == different_attrs.title
end
test "doesn't update fields like playlist_index" do
source = source_fixture()
media_attrs =
media_attributes_return_fixture()
|> Phoenix.json_library().decode!()
|> Map.put("playlist_index", 1)
|> YtDlpMedia.response_to_struct()
different_attrs = %YtDlpMedia{media_attrs | playlist_index: 9999}
assert {:ok, %MediaItem{} = _media_item_1} = Media.create_media_item_from_backend_attrs(source, media_attrs)
assert {:ok, %MediaItem{} = media_item_2} = Media.create_media_item_from_backend_attrs(source, different_attrs)
assert Repo.reload(media_item_2).playlist_index == media_attrs.playlist_index
end end
end end