fix: better data model for liked songs, refs NOISSUE
This commit is contained in:
		@@ -18,4 +18,17 @@ public class DataContext : DbContext
 | 
				
			|||||||
        => optionsBuilder.UseNpgsql($"Host={AppConfiguration.Instance.DatabaseUri}:{AppConfiguration.Instance.DatabasePort};"
 | 
					        => optionsBuilder.UseNpgsql($"Host={AppConfiguration.Instance.DatabaseUri}:{AppConfiguration.Instance.DatabasePort};"
 | 
				
			||||||
                                    + $"Username={AppConfiguration.Instance.DatabaseUser};Password={AppConfiguration.Instance.DatabasePW};"
 | 
					                                    + $"Username={AppConfiguration.Instance.DatabaseUser};Password={AppConfiguration.Instance.DatabasePW};"
 | 
				
			||||||
                                    + $"Database={AppConfiguration.Instance.DatabaseName}");
 | 
					                                    + $"Database={AppConfiguration.Instance.DatabaseName}");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    protected override void OnModelCreating(ModelBuilder modelBuilder)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        // configures one-to-many relationship
 | 
				
			||||||
 | 
					        modelBuilder.Entity<User>()
 | 
				
			||||||
 | 
					                .HasMany(u => u.LikedSongs)
 | 
				
			||||||
 | 
					                .WithMany(s => s.LikedBy)
 | 
				
			||||||
 | 
					                .UsingEntity(
 | 
				
			||||||
 | 
					                    "LikedSongs",
 | 
				
			||||||
 | 
					                    r => r.HasOne(typeof(Song)).WithMany().HasForeignKey("SongId").HasPrincipalKey(nameof(Song.SongId)),
 | 
				
			||||||
 | 
					                    l => l.HasOne(typeof(User)).WithMany().HasForeignKey("UserId").HasPrincipalKey(nameof(User.UserId)),
 | 
				
			||||||
 | 
					                    j => j.HasKey("SongId", "UserId"));   
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										296
									
								
								song_of_the_day/Data/Migrations/20250720144512_explicitly model liked songs relationship.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										296
									
								
								song_of_the_day/Data/Migrations/20250720144512_explicitly model liked songs relationship.Designer.cs
									
									
									
										generated
									
									
									
										Normal file
									
								
							@@ -0,0 +1,296 @@
 | 
				
			|||||||
 | 
					// <auto-generated />
 | 
				
			||||||
 | 
					using System;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Infrastructure;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Migrations;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
 | 
				
			||||||
 | 
					using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#nullable disable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace song_of_the_day.DataMigrations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    [DbContext(typeof(DataContext))]
 | 
				
			||||||
 | 
					    [Migration("20250720144512_explicitly model liked songs relationship")]
 | 
				
			||||||
 | 
					    partial class explicitlymodellikedsongsrelationship
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void BuildTargetModel(ModelBuilder modelBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					#pragma warning disable 612, 618
 | 
				
			||||||
 | 
					            modelBuilder
 | 
				
			||||||
 | 
					                .HasAnnotation("ProductVersion", "9.0.3")
 | 
				
			||||||
 | 
					                .HasAnnotation("Relational:MaxIdentifierLength", 63);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("LikedSongs", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("SongId", "UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("LikedSongs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("CreatedByUserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Description")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("IncludesLikedSongs")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("IncludesUnCategorizedSongs")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SpotifyPlaylistId")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Title")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("Id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("CreatedByUserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("SmartPlaylistDefinitions");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("Song", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("SongId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Artist")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("Provider")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("SmartPlaylistDefinitionId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("SmartPlaylistDefinitionId1")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SpotifyId")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Url")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SmartPlaylistDefinitionId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SmartPlaylistDefinitionId1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Songs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<DateTime>("Date")
 | 
				
			||||||
 | 
					                        .HasColumnType("timestamp with time zone");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("HasUsedSuggestion")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("SongId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("SuggestionHelperId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("UserHasSubmitted")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("UserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("Id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SuggestionHelperId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("SongSuggestions");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SuggestionHelper", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Description")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("SmartPlaylistDefinitionId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Title")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("Id");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("SmartPlaylistDefinitionId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("SuggestionHelpers");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("User", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .ValueGeneratedOnAdd()
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("UserId"));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("AssociationInProgress")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("IsIntroduced")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("LdapUserName")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("Name")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("NickName")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SignalMemberId")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SpotifyAuthAccessToken")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<DateTime?>("SpotifyAuthCreatedAt")
 | 
				
			||||||
 | 
					                        .HasColumnType("timestamp with time zone");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int?>("SpotifyAuthExpiresAfterSeconds")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<string>("SpotifyAuthRefreshToken")
 | 
				
			||||||
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<bool>("WasChosenForSuggestionThisRound")
 | 
				
			||||||
 | 
					                        .HasColumnType("boolean");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("Users");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("LikedSongs", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("Song", null)
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SongId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("User", null)
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("UserId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("User", "CreatedBy")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("CreatedByUserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("CreatedBy");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("Song", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("SmartPlaylistDefinition", null)
 | 
				
			||||||
 | 
					                        .WithMany("ExplicitlyExcludedSongs")
 | 
				
			||||||
 | 
					                        .HasForeignKey("SmartPlaylistDefinitionId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("SmartPlaylistDefinition", null)
 | 
				
			||||||
 | 
					                        .WithMany("ExplicitlyIncludedSongs")
 | 
				
			||||||
 | 
					                        .HasForeignKey("SmartPlaylistDefinitionId1");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("Song", "Song")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("SuggestionHelper", "SuggestionHelper")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SuggestionHelperId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("User", "User")
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("Song");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("SuggestionHelper");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("User");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SuggestionHelper", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("SmartPlaylistDefinition", null)
 | 
				
			||||||
 | 
					                        .WithMany("Categories")
 | 
				
			||||||
 | 
					                        .HasForeignKey("SmartPlaylistDefinitionId");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Navigation("Categories");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("ExplicitlyExcludedSongs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Navigation("ExplicitlyIncludedSongs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					#pragma warning restore 612, 618
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,80 @@
 | 
				
			|||||||
 | 
					using Microsoft.EntityFrameworkCore.Migrations;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#nullable disable
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace song_of_the_day.DataMigrations
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// <inheritdoc />
 | 
				
			||||||
 | 
					    public partial class explicitlymodellikedsongsrelationship : Migration
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void Up(MigrationBuilder migrationBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            migrationBuilder.DropForeignKey(
 | 
				
			||||||
 | 
					                name: "FK_Songs_Users_UserId",
 | 
				
			||||||
 | 
					                table: "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.DropIndex(
 | 
				
			||||||
 | 
					                name: "IX_Songs_UserId",
 | 
				
			||||||
 | 
					                table: "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.DropColumn(
 | 
				
			||||||
 | 
					                name: "UserId",
 | 
				
			||||||
 | 
					                table: "Songs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateTable(
 | 
				
			||||||
 | 
					                name: "LikedSongs",
 | 
				
			||||||
 | 
					                columns: table => new
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    SongId = table.Column<int>(type: "integer", nullable: false),
 | 
				
			||||||
 | 
					                    UserId = table.Column<int>(type: "integer", nullable: false)
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                constraints: table =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    table.PrimaryKey("PK_LikedSongs", x => new { x.SongId, x.UserId });
 | 
				
			||||||
 | 
					                    table.ForeignKey(
 | 
				
			||||||
 | 
					                        name: "FK_LikedSongs_Songs_SongId",
 | 
				
			||||||
 | 
					                        column: x => x.SongId,
 | 
				
			||||||
 | 
					                        principalTable: "Songs",
 | 
				
			||||||
 | 
					                        principalColumn: "SongId",
 | 
				
			||||||
 | 
					                        onDelete: ReferentialAction.Cascade);
 | 
				
			||||||
 | 
					                    table.ForeignKey(
 | 
				
			||||||
 | 
					                        name: "FK_LikedSongs_Users_UserId",
 | 
				
			||||||
 | 
					                        column: x => x.UserId,
 | 
				
			||||||
 | 
					                        principalTable: "Users",
 | 
				
			||||||
 | 
					                        principalColumn: "UserId",
 | 
				
			||||||
 | 
					                        onDelete: ReferentialAction.Cascade);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateIndex(
 | 
				
			||||||
 | 
					                name: "IX_LikedSongs_UserId",
 | 
				
			||||||
 | 
					                table: "LikedSongs",
 | 
				
			||||||
 | 
					                column: "UserId");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /// <inheritdoc />
 | 
				
			||||||
 | 
					        protected override void Down(MigrationBuilder migrationBuilder)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            migrationBuilder.DropTable(
 | 
				
			||||||
 | 
					                name: "LikedSongs");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.AddColumn<int>(
 | 
				
			||||||
 | 
					                name: "UserId",
 | 
				
			||||||
 | 
					                table: "Songs",
 | 
				
			||||||
 | 
					                type: "integer",
 | 
				
			||||||
 | 
					                nullable: true);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.CreateIndex(
 | 
				
			||||||
 | 
					                name: "IX_Songs_UserId",
 | 
				
			||||||
 | 
					                table: "Songs",
 | 
				
			||||||
 | 
					                column: "UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            migrationBuilder.AddForeignKey(
 | 
				
			||||||
 | 
					                name: "FK_Songs_Users_UserId",
 | 
				
			||||||
 | 
					                table: "Songs",
 | 
				
			||||||
 | 
					                column: "UserId",
 | 
				
			||||||
 | 
					                principalTable: "Users",
 | 
				
			||||||
 | 
					                principalColumn: "UserId");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -21,6 +21,21 @@ namespace song_of_the_day.DataMigrations
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 | 
					            NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("LikedSongs", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.Property<int>("SongId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.Property<int>("UserId")
 | 
				
			||||||
 | 
					                        .HasColumnType("integer");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasKey("SongId", "UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasIndex("UserId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.ToTable("LikedSongs");
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
					            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    b.Property<int>("Id")
 | 
					                    b.Property<int>("Id")
 | 
				
			||||||
@@ -83,17 +98,12 @@ namespace song_of_the_day.DataMigrations
 | 
				
			|||||||
                    b.Property<string>("Url")
 | 
					                    b.Property<string>("Url")
 | 
				
			||||||
                        .HasColumnType("text");
 | 
					                        .HasColumnType("text");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    b.Property<int?>("UserId")
 | 
					 | 
				
			||||||
                        .HasColumnType("integer");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    b.HasKey("SongId");
 | 
					                    b.HasKey("SongId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    b.HasIndex("SmartPlaylistDefinitionId");
 | 
					                    b.HasIndex("SmartPlaylistDefinitionId");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    b.HasIndex("SmartPlaylistDefinitionId1");
 | 
					                    b.HasIndex("SmartPlaylistDefinitionId1");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    b.HasIndex("UserId");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    b.ToTable("Songs");
 | 
					                    b.ToTable("Songs");
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -204,6 +214,21 @@ namespace song_of_the_day.DataMigrations
 | 
				
			|||||||
                    b.ToTable("Users");
 | 
					                    b.ToTable("Users");
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            modelBuilder.Entity("LikedSongs", b =>
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    b.HasOne("Song", null)
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("SongId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    b.HasOne("User", null)
 | 
				
			||||||
 | 
					                        .WithMany()
 | 
				
			||||||
 | 
					                        .HasForeignKey("UserId")
 | 
				
			||||||
 | 
					                        .OnDelete(DeleteBehavior.Cascade)
 | 
				
			||||||
 | 
					                        .IsRequired();
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
					            modelBuilder.Entity("SmartPlaylistDefinition", b =>
 | 
				
			||||||
                {
 | 
					                {
 | 
				
			||||||
                    b.HasOne("User", "CreatedBy")
 | 
					                    b.HasOne("User", "CreatedBy")
 | 
				
			||||||
@@ -222,10 +247,6 @@ namespace song_of_the_day.DataMigrations
 | 
				
			|||||||
                    b.HasOne("SmartPlaylistDefinition", null)
 | 
					                    b.HasOne("SmartPlaylistDefinition", null)
 | 
				
			||||||
                        .WithMany("ExplicitlyIncludedSongs")
 | 
					                        .WithMany("ExplicitlyIncludedSongs")
 | 
				
			||||||
                        .HasForeignKey("SmartPlaylistDefinitionId1");
 | 
					                        .HasForeignKey("SmartPlaylistDefinitionId1");
 | 
				
			||||||
 | 
					 | 
				
			||||||
                    b.HasOne("User", null)
 | 
					 | 
				
			||||||
                        .WithMany("LikedSongs")
 | 
					 | 
				
			||||||
                        .HasForeignKey("UserId");
 | 
					 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            modelBuilder.Entity("SongSuggestion", b =>
 | 
					            modelBuilder.Entity("SongSuggestion", b =>
 | 
				
			||||||
@@ -266,11 +287,6 @@ namespace song_of_the_day.DataMigrations
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    b.Navigation("ExplicitlyIncludedSongs");
 | 
					                    b.Navigation("ExplicitlyIncludedSongs");
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
 | 
					 | 
				
			||||||
            modelBuilder.Entity("User", b =>
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    b.Navigation("LikedSongs");
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
#pragma warning restore 612, 618
 | 
					#pragma warning restore 612, 618
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,4 +8,6 @@ public class Song
 | 
				
			|||||||
    public string? Url { get; set; }
 | 
					    public string? Url { get; set; }
 | 
				
			||||||
    public SongProvider? Provider { get; set; }
 | 
					    public SongProvider? Provider { get; set; }
 | 
				
			||||||
    public string? SpotifyId { get; set; }
 | 
					    public string? SpotifyId { get; set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public IList<User> LikedBy { get; set; }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
		Reference in New Issue
	
	Block a user