From e4ae1572758758c115ac5a5d9263119bcd744f09 Mon Sep 17 00:00:00 2001 From: Claudio Ortolina Date: Thu, 12 Sep 2024 14:51:10 +0100 Subject: [PATCH] Associate artists and records --- lib/music_library/records/artist.ex | 4 ++++ lib/music_library/records/artist_record.ex | 20 +++++++++++++++++++ lib/music_library/records/record.ex | 4 ++++ .../20240912134607_create_artists_records.exs | 16 +++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 lib/music_library/records/artist_record.ex create mode 100644 priv/repo/migrations/20240912134607_create_artists_records.exs diff --git a/lib/music_library/records/artist.ex b/lib/music_library/records/artist.ex index 4b82fbc9..c41927b9 100644 --- a/lib/music_library/records/artist.ex +++ b/lib/music_library/records/artist.ex @@ -2,6 +2,8 @@ defmodule MusicLibrary.Records.Artist do use Ecto.Schema import Ecto.Changeset + alias MusicLibrary.{Records.ArtistRecord, Records.Record} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "artists" do @@ -9,6 +11,8 @@ defmodule MusicLibrary.Records.Artist do field :image, :string field :musicbrainz_id, Ecto.UUID + many_to_many :records, Record, join_through: ArtistRecord + timestamps(type: :utc_datetime) end diff --git a/lib/music_library/records/artist_record.ex b/lib/music_library/records/artist_record.ex new file mode 100644 index 00000000..e87f1256 --- /dev/null +++ b/lib/music_library/records/artist_record.ex @@ -0,0 +1,20 @@ +defmodule MusicLibrary.Records.ArtistRecord do + use Ecto.Schema + import Ecto.Changeset + + @primary_key {:id, :binary_id, autogenerate: true} + @foreign_key_type :binary_id + schema "artists_records" do + field :artist_id, :binary_id + field :record_id, :binary_id + + timestamps(type: :utc_datetime) + end + + @doc false + def changeset(artist_record, attrs) do + artist_record + |> cast(attrs, []) + |> validate_required([]) + end +end diff --git a/lib/music_library/records/record.ex b/lib/music_library/records/record.ex index dc9cc3f3..11519fc0 100644 --- a/lib/music_library/records/record.ex +++ b/lib/music_library/records/record.ex @@ -2,6 +2,8 @@ defmodule MusicLibrary.Records.Record do use Ecto.Schema import Ecto.Changeset + alias MusicLibrary.{Records.Artist, Records.ArtistRecord} + @primary_key {:id, :binary_id, autogenerate: true} @foreign_key_type :binary_id schema "records" do @@ -12,6 +14,8 @@ defmodule MusicLibrary.Records.Record do field :musicbrainz_id, Ecto.UUID field :genres, {:array, :string} + many_to_many :artists, Artist, join_through: ArtistRecord + timestamps(type: :utc_datetime) end diff --git a/priv/repo/migrations/20240912134607_create_artists_records.exs b/priv/repo/migrations/20240912134607_create_artists_records.exs new file mode 100644 index 00000000..12a86eff --- /dev/null +++ b/priv/repo/migrations/20240912134607_create_artists_records.exs @@ -0,0 +1,16 @@ +defmodule MusicLibrary.Repo.Migrations.CreateArtistsRecords do + use Ecto.Migration + + def change do + create table(:artists_records, primary_key: false) do + add :id, :binary_id, primary_key: true + add :artist_id, references(:artists, on_delete: :nothing, type: :binary_id) + add :record_id, references(:records, on_delete: :nothing, type: :binary_id) + + timestamps(type: :utc_datetime) + end + + create index(:artists_records, [:artist_id]) + create index(:artists_records, [:record_id]) + end +end