diff --git a/lib/pinchflat/sources/source.ex b/lib/pinchflat/sources/source.ex index 9b31136..58e7ec0 100644 --- a/lib/pinchflat/sources/source.ex +++ b/lib/pinchflat/sources/source.ex @@ -107,7 +107,7 @@ defmodule Pinchflat.Sources.Source do |> dynamic_default(:uuid, fn _ -> Ecto.UUID.generate() end) |> validate_required(required_fields) |> cast_assoc(:metadata, with: &SourceMetadata.changeset/2, required: false) - |> unique_constraint([:collection_id, :media_profile_id, :title_filter_regex]) + |> unique_constraint([:collection_id, :media_profile_id, :title_filter_regex], error_key: :original_url) end @doc false diff --git a/priv/repo/migrations/20240401170440_re_re_add_source_uniqueness_index.exs b/priv/repo/migrations/20240401170440_re_re_add_source_uniqueness_index.exs index e702a24..99c956f 100644 --- a/priv/repo/migrations/20240401170440_re_re_add_source_uniqueness_index.exs +++ b/priv/repo/migrations/20240401170440_re_re_add_source_uniqueness_index.exs @@ -1,7 +1,19 @@ defmodule Pinchflat.Repo.Migrations.ReReAddSourceUniquenessIndex do use Ecto.Migration - def change do - create unique_index(:sources, [:collection_id, :media_profile_id, :title_filter_regex]) + def up do + execute """ + CREATE UNIQUE INDEX sources_collection_id_media_profile_id_title_filter_regex_index ON sources ( + collection_id, + media_profile_id, + IFNULL(title_filter_regex, '') + ); + """ + end + + def down do + execute """ + DROP INDEX sources_collection_id_media_profile_id_title_filter_regex_index; + """ end end diff --git a/test/pinchflat/sources_test.exs b/test/pinchflat/sources_test.exs index 741299d..8ce107d 100644 --- a/test/pinchflat/sources_test.exs +++ b/test/pinchflat/sources_test.exs @@ -151,7 +151,7 @@ defmodule Pinchflat.SourcesTest do valid_once_attrs = %{ media_profile_id: media_profile_fixture().id, original_url: "https://www.youtube.com/channel/abc123", - title_filter_regex: "TEST" + title_filter_regex: nil } assert {:ok, %Source{}} = Sources.create_source(valid_once_attrs)