From eebc5f1d6dc6b192f0f8e2a9ee73c6d9b44ba7cb Mon Sep 17 00:00:00 2001 From: sherl Date: Tue, 16 Dec 2025 04:01:45 +0100 Subject: [PATCH] fix: remove required from entities' id also adds "Global" entity for storing global configuration --- Data/ApplicationDbContext.cs | 4 + Entities/Album.cs | 2 +- Entities/AlbumInteraction.cs | 2 +- Entities/Artist.cs | 2 +- Entities/Genre.cs | 2 +- Entities/GenreSong.cs | 2 +- Entities/Global.cs | 7 + Entities/Image.cs | 3 +- Entities/Playlist.cs | 2 +- Entities/Radio.cs | 2 +- ...0251209000751_InitialMigration.Designer.cs | 608 ----------- Migrations/20251209000751_InitialMigration.cs | 458 --------- ...0251216025633_InitialMigration.Designer.cs | 635 ++++++++++++ Migrations/20251216025633_InitialMigration.cs | 482 +++++++++ .../ApplicationDbContextModelSnapshot.cs | 953 +++++++++--------- 15 files changed, 1627 insertions(+), 1537 deletions(-) create mode 100644 Entities/Global.cs delete mode 100644 Migrations/20251209000751_InitialMigration.Designer.cs delete mode 100644 Migrations/20251209000751_InitialMigration.cs create mode 100644 Migrations/20251216025633_InitialMigration.Designer.cs create mode 100644 Migrations/20251216025633_InitialMigration.cs diff --git a/Data/ApplicationDbContext.cs b/Data/ApplicationDbContext.cs index 35ea131..0702ec0 100644 --- a/Data/ApplicationDbContext.cs +++ b/Data/ApplicationDbContext.cs @@ -17,6 +17,7 @@ public class ApplicationDbContext : DbContext public DbSet Artists => Set(); public DbSet Genres => Set(); public DbSet GenreSongs => Set(); + public DbSet Globals => Set(); public DbSet Images => Set(); public DbSet Playlists => Set(); public DbSet PlaylistSongs => Set(); @@ -52,6 +53,9 @@ public class ApplicationDbContext : DbContext builder.Entity(g => { g.HasIndex(g => g.NormalizedName).IsUnique(); }); + builder.Entity(c => { + c.HasIndex(c => c.Key).IsUnique(); + }); builder.Entity(p => { p.HasIndex(p => p.Uri).IsUnique(); }); diff --git a/Entities/Album.cs b/Entities/Album.cs index e3c4227..ad7bd53 100644 --- a/Entities/Album.cs +++ b/Entities/Album.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class Album { - required public int Id { get; set; } + public int Id { get; set; } public required string Name { get; set; } public required string Uri { get; set; } public int State { get; set; } = 0; diff --git a/Entities/AlbumInteraction.cs b/Entities/AlbumInteraction.cs index ec14046..402b083 100644 --- a/Entities/AlbumInteraction.cs +++ b/Entities/AlbumInteraction.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class AlbumInteraction { - required public int Id { get; set; } + public int Id { get; set; } required public int AlbumId { get; set; } required public int UserId { get; set; } public DateTime? PlayDate { get; set; } = null; diff --git a/Entities/Artist.cs b/Entities/Artist.cs index c24aea9..bbad743 100644 --- a/Entities/Artist.cs +++ b/Entities/Artist.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class Artist { - required public int Id { get; set; } + public int Id { get; set; } required public string Name { get; set; } required public string NormalizedName { get; set; } diff --git a/Entities/Genre.cs b/Entities/Genre.cs index fa1167a..b647867 100644 --- a/Entities/Genre.cs +++ b/Entities/Genre.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class Genre { - required public int Id { get; set; } + public int Id { get; set; } required public string Name { get; set; } required public string NormalizedName { get; set; } diff --git a/Entities/GenreSong.cs b/Entities/GenreSong.cs index f6c5966..1af9849 100644 --- a/Entities/GenreSong.cs +++ b/Entities/GenreSong.cs @@ -2,7 +2,7 @@ namespace Shadow.Entities; public class GenreSong { // Composite keys - required public int GenreId { get; set; } + public int GenreId { get; set; } required public int SongId { get; set; } required public Genre Genre { get; set; } diff --git a/Entities/Global.cs b/Entities/Global.cs new file mode 100644 index 0000000..da06133 --- /dev/null +++ b/Entities/Global.cs @@ -0,0 +1,7 @@ +namespace Shadow.Entities; +public class Global +{ + public int Id { get; set; } + required public string Key { get; set; } + public string? Value { get; set; } = null; +} diff --git a/Entities/Image.cs b/Entities/Image.cs index 37fb009..5207853 100644 --- a/Entities/Image.cs +++ b/Entities/Image.cs @@ -1,8 +1,9 @@ namespace Shadow.Entities; public class Image { - required public int Id { get; set; } + public int Id { get; set; } required public string Uri { get; set; } + required public string Filetype { get; set; } public int State { get; set; } public int? SongId { get; set; } = null; diff --git a/Entities/Playlist.cs b/Entities/Playlist.cs index e184b29..970351f 100644 --- a/Entities/Playlist.cs +++ b/Entities/Playlist.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class Playlist { - required public int Id { get; set; } + public int Id { get; set; } required public string Name { get; set; } required public string Uri { get; set; } required public string Description { get; set; } diff --git a/Entities/Radio.cs b/Entities/Radio.cs index 4995597..45d7e6a 100644 --- a/Entities/Radio.cs +++ b/Entities/Radio.cs @@ -1,7 +1,7 @@ namespace Shadow.Entities; public class Radio { - required public int Id { get; set; } + public int Id { get; set; } required public string Name { get; set; } required public string NormalizedName { get; set; } public string? Homepage { get; set; } = null; diff --git a/Migrations/20251209000751_InitialMigration.Designer.cs b/Migrations/20251209000751_InitialMigration.Designer.cs deleted file mode 100644 index e222e12..0000000 --- a/Migrations/20251209000751_InitialMigration.Designer.cs +++ /dev/null @@ -1,608 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using Shadow.Data; - -#nullable disable - -namespace Shadow.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20251209000751_InitialMigration")] - partial class InitialMigration - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ArtistId") - .HasColumnType("integer"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("State") - .HasColumnType("integer"); - - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("ArtistId"); - - b.HasIndex("Uri") - .IsUnique(); - - b.ToTable("Albums"); - }); - - modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => - { - b.Property("AlbumId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Id") - .HasColumnType("integer"); - - b.Property("PlayDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Starred") - .HasColumnType("boolean"); - - b.HasKey("AlbumId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("AlbumInteractions"); - }); - - modelBuilder.Entity("Shadow.Entities.Artist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique(); - - b.ToTable("Artists"); - }); - - modelBuilder.Entity("Shadow.Entities.Genre", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique(); - - b.ToTable("Genres"); - }); - - modelBuilder.Entity("Shadow.Entities.GenreSong", b => - { - b.Property("GenreId") - .HasColumnType("integer"); - - b.Property("SongId") - .HasColumnType("integer"); - - b.HasKey("GenreId", "SongId"); - - b.HasIndex("SongId"); - - b.ToTable("GenreSongs"); - }); - - modelBuilder.Entity("Shadow.Entities.Image", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("SongId") - .HasColumnType("integer"); - - b.Property("State") - .HasColumnType("integer"); - - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("SongId") - .IsUnique(); - - b.ToTable("Images"); - }); - - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("CreatorId") - .HasColumnType("integer"); - - b.Property("Description") - .IsRequired() - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("CreatorId"); - - b.HasIndex("Uri") - .IsUnique(); - - b.ToTable("Playlists"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => - { - b.Property("PlaylistId") - .HasColumnType("integer"); - - b.Property("SongId") - .HasColumnType("integer"); - - b.Property("Index") - .HasColumnType("integer"); - - b.HasKey("PlaylistId", "SongId"); - - b.HasIndex("SongId"); - - b.ToTable("PlaylistSongs"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => - { - b.Property("PlaylistId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("PlaylistId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("PlaylistUsers"); - }); - - modelBuilder.Entity("Shadow.Entities.Radio", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Homepage") - .HasColumnType("text"); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); - - b.Property("Url") - .IsRequired() - .HasColumnType("text"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique(); - - b.HasIndex("UserId"); - - b.ToTable("Radios"); - }); - - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("AlbumId") - .HasColumnType("integer"); - - b.Property("ArtistId") - .HasColumnType("integer"); - - b.Property("BitDepth") - .HasColumnType("integer"); - - b.Property("Bitrate") - .HasColumnType("integer"); - - b.Property("Channels") - .HasColumnType("integer"); - - b.Property("Comment") - .HasColumnType("text"); - - b.Property("Date") - .HasColumnType("timestamp with time zone"); - - b.Property("DiscNumber") - .HasColumnType("integer"); - - b.Property("Duration") - .HasColumnType("integer"); - - b.Property("Filepath") - .IsRequired() - .HasColumnType("text"); - - b.Property("Filetype") - .IsRequired() - .HasColumnType("text"); - - b.Property("ImageId") - .HasColumnType("integer"); - - b.Property("Index") - .HasColumnType("integer"); - - b.Property("SamplingRate") - .HasColumnType("integer"); - - b.Property("Size") - .HasColumnType("integer"); - - b.Property("State") - .HasColumnType("integer"); - - b.Property("Title") - .IsRequired() - .HasColumnType("text"); - - b.Property("TrackNumber") - .HasColumnType("integer"); - - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("AlbumId"); - - b.HasIndex("ArtistId"); - - b.HasIndex("Uri") - .IsUnique(); - - b.ToTable("Songs"); - }); - - modelBuilder.Entity("Shadow.Entities.SongInteraction", b => - { - b.Property("SongId") - .HasColumnType("integer"); - - b.Property("UserId") - .HasColumnType("integer"); - - b.Property("Id") - .HasColumnType("integer"); - - b.Property("PlayCount") - .HasColumnType("integer"); - - b.Property("Rating") - .HasColumnType("integer"); - - b.Property("Starred") - .HasColumnType("boolean"); - - b.HasKey("SongId", "UserId"); - - b.HasIndex("UserId"); - - b.ToTable("SongInteractions"); - }); - - modelBuilder.Entity("Shadow.Entities.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Name") - .IsRequired() - .HasColumnType("text"); - - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); - - b.Property("Password") - .IsRequired() - .HasColumnType("text"); - - b.Property("Role") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("Name") - .IsUnique(); - - b.ToTable("Users"); - }); - - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.HasOne("Shadow.Entities.Artist", "Artist") - .WithMany("Albums") - .HasForeignKey("ArtistId"); - - b.Navigation("Artist"); - }); - - modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => - { - b.HasOne("Shadow.Entities.Album", "Album") - .WithMany() - .HasForeignKey("AlbumId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.User", "User") - .WithMany("AlbumInteractions") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Album"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.GenreSong", b => - { - b.HasOne("Shadow.Entities.Genre", "Genre") - .WithMany("GenreSongPair") - .HasForeignKey("GenreId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany("GenreSongPair") - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Genre"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.Image", b => - { - b.HasOne("Shadow.Entities.Song", "Song") - .WithOne("Image") - .HasForeignKey("Shadow.Entities.Image", "SongId"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.HasOne("Shadow.Entities.User", "Creator") - .WithMany("Playlists") - .HasForeignKey("CreatorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => - { - b.HasOne("Shadow.Entities.Playlist", "Playlist") - .WithMany() - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany() - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => - { - b.HasOne("Shadow.Entities.Playlist", "Playlist") - .WithMany("AuthorizedPlaylistUsers") - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Radio", b => - { - b.HasOne("Shadow.Entities.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.HasOne("Shadow.Entities.Album", "Album") - .WithMany("Songs") - .HasForeignKey("AlbumId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Artist", "Artist") - .WithMany("Songs") - .HasForeignKey("ArtistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Album"); - - b.Navigation("Artist"); - }); - - modelBuilder.Entity("Shadow.Entities.SongInteraction", b => - { - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany() - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.User", "User") - .WithMany("SongInteractions") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Song"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.Navigation("Songs"); - }); - - modelBuilder.Entity("Shadow.Entities.Artist", b => - { - b.Navigation("Albums"); - - b.Navigation("Songs"); - }); - - modelBuilder.Entity("Shadow.Entities.Genre", b => - { - b.Navigation("GenreSongPair"); - }); - - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.Navigation("AuthorizedPlaylistUsers"); - }); - - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.Navigation("GenreSongPair"); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("Shadow.Entities.User", b => - { - b.Navigation("AlbumInteractions"); - - b.Navigation("Playlists"); - - b.Navigation("SongInteractions"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Migrations/20251209000751_InitialMigration.cs b/Migrations/20251209000751_InitialMigration.cs deleted file mode 100644 index 7cd579c..0000000 --- a/Migrations/20251209000751_InitialMigration.cs +++ /dev/null @@ -1,458 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace Shadow.Migrations -{ - /// - public partial class InitialMigration : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Artists", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - NormalizedName = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Artists", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Genres", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - NormalizedName = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Genres", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - NormalizedName = table.Column(type: "text", nullable: false), - Password = table.Column(type: "text", nullable: false), - Role = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Albums", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - Uri = table.Column(type: "text", nullable: false), - State = table.Column(type: "integer", nullable: false), - ArtistId = table.Column(type: "integer", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Albums", x => x.Id); - table.ForeignKey( - name: "FK_Albums_Artists_ArtistId", - column: x => x.ArtistId, - principalTable: "Artists", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Playlists", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - Uri = table.Column(type: "text", nullable: false), - Description = table.Column(type: "text", nullable: false), - CreatorId = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Playlists", x => x.Id); - table.ForeignKey( - name: "FK_Playlists_Users_CreatorId", - column: x => x.CreatorId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Radios", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Name = table.Column(type: "text", nullable: false), - NormalizedName = table.Column(type: "text", nullable: false), - Homepage = table.Column(type: "text", nullable: true), - Url = table.Column(type: "text", nullable: false), - UserId = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Radios", x => x.Id); - table.ForeignKey( - name: "FK_Radios_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "AlbumInteractions", - columns: table => new - { - AlbumId = table.Column(type: "integer", nullable: false), - UserId = table.Column(type: "integer", nullable: false), - Id = table.Column(type: "integer", nullable: false), - PlayDate = table.Column(type: "timestamp with time zone", nullable: true), - Starred = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_AlbumInteractions", x => new { x.AlbumId, x.UserId }); - table.ForeignKey( - name: "FK_AlbumInteractions_Albums_AlbumId", - column: x => x.AlbumId, - principalTable: "Albums", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_AlbumInteractions_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Songs", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Title = table.Column(type: "text", nullable: false), - Uri = table.Column(type: "text", nullable: false), - Filepath = table.Column(type: "text", nullable: false), - State = table.Column(type: "integer", nullable: false), - Filetype = table.Column(type: "text", nullable: false), - Date = table.Column(type: "timestamp with time zone", nullable: false), - Duration = table.Column(type: "integer", nullable: false), - Bitrate = table.Column(type: "integer", nullable: false), - Size = table.Column(type: "integer", nullable: false), - Comment = table.Column(type: "text", nullable: true), - Channels = table.Column(type: "integer", nullable: false), - SamplingRate = table.Column(type: "integer", nullable: false), - BitDepth = table.Column(type: "integer", nullable: true), - Index = table.Column(type: "integer", nullable: false), - TrackNumber = table.Column(type: "integer", nullable: true), - DiscNumber = table.Column(type: "integer", nullable: true), - AlbumId = table.Column(type: "integer", nullable: false), - ArtistId = table.Column(type: "integer", nullable: false), - ImageId = table.Column(type: "integer", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Songs", x => x.Id); - table.ForeignKey( - name: "FK_Songs_Albums_AlbumId", - column: x => x.AlbumId, - principalTable: "Albums", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_Songs_Artists_ArtistId", - column: x => x.ArtistId, - principalTable: "Artists", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "PlaylistUsers", - columns: table => new - { - PlaylistId = table.Column(type: "integer", nullable: false), - UserId = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PlaylistUsers", x => new { x.PlaylistId, x.UserId }); - table.ForeignKey( - name: "FK_PlaylistUsers_Playlists_PlaylistId", - column: x => x.PlaylistId, - principalTable: "Playlists", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_PlaylistUsers_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "GenreSongs", - columns: table => new - { - GenreId = table.Column(type: "integer", nullable: false), - SongId = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_GenreSongs", x => new { x.GenreId, x.SongId }); - table.ForeignKey( - name: "FK_GenreSongs_Genres_GenreId", - column: x => x.GenreId, - principalTable: "Genres", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_GenreSongs_Songs_SongId", - column: x => x.SongId, - principalTable: "Songs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Images", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - Uri = table.Column(type: "text", nullable: false), - State = table.Column(type: "integer", nullable: false), - SongId = table.Column(type: "integer", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Images", x => x.Id); - table.ForeignKey( - name: "FK_Images_Songs_SongId", - column: x => x.SongId, - principalTable: "Songs", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "PlaylistSongs", - columns: table => new - { - PlaylistId = table.Column(type: "integer", nullable: false), - SongId = table.Column(type: "integer", nullable: false), - Index = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_PlaylistSongs", x => new { x.PlaylistId, x.SongId }); - table.ForeignKey( - name: "FK_PlaylistSongs_Playlists_PlaylistId", - column: x => x.PlaylistId, - principalTable: "Playlists", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_PlaylistSongs_Songs_SongId", - column: x => x.SongId, - principalTable: "Songs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "SongInteractions", - columns: table => new - { - SongId = table.Column(type: "integer", nullable: false), - UserId = table.Column(type: "integer", nullable: false), - Id = table.Column(type: "integer", nullable: false), - PlayCount = table.Column(type: "integer", nullable: false), - Starred = table.Column(type: "boolean", nullable: true), - Rating = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_SongInteractions", x => new { x.SongId, x.UserId }); - table.ForeignKey( - name: "FK_SongInteractions_Songs_SongId", - column: x => x.SongId, - principalTable: "Songs", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_SongInteractions_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateIndex( - name: "IX_AlbumInteractions_UserId", - table: "AlbumInteractions", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Albums_ArtistId", - table: "Albums", - column: "ArtistId"); - - migrationBuilder.CreateIndex( - name: "IX_Albums_Uri", - table: "Albums", - column: "Uri", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Artists_NormalizedName", - table: "Artists", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Genres_NormalizedName", - table: "Genres", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_GenreSongs_SongId", - table: "GenreSongs", - column: "SongId"); - - migrationBuilder.CreateIndex( - name: "IX_Images_SongId", - table: "Images", - column: "SongId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Playlists_CreatorId", - table: "Playlists", - column: "CreatorId"); - - migrationBuilder.CreateIndex( - name: "IX_Playlists_Uri", - table: "Playlists", - column: "Uri", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_PlaylistSongs_SongId", - table: "PlaylistSongs", - column: "SongId"); - - migrationBuilder.CreateIndex( - name: "IX_PlaylistUsers_UserId", - table: "PlaylistUsers", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Radios_NormalizedName", - table: "Radios", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Radios_UserId", - table: "Radios", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_SongInteractions_UserId", - table: "SongInteractions", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_Songs_AlbumId", - table: "Songs", - column: "AlbumId"); - - migrationBuilder.CreateIndex( - name: "IX_Songs_ArtistId", - table: "Songs", - column: "ArtistId"); - - migrationBuilder.CreateIndex( - name: "IX_Songs_Uri", - table: "Songs", - column: "Uri", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Users_Name", - table: "Users", - column: "Name", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "AlbumInteractions"); - - migrationBuilder.DropTable( - name: "GenreSongs"); - - migrationBuilder.DropTable( - name: "Images"); - - migrationBuilder.DropTable( - name: "PlaylistSongs"); - - migrationBuilder.DropTable( - name: "PlaylistUsers"); - - migrationBuilder.DropTable( - name: "Radios"); - - migrationBuilder.DropTable( - name: "SongInteractions"); - - migrationBuilder.DropTable( - name: "Genres"); - - migrationBuilder.DropTable( - name: "Playlists"); - - migrationBuilder.DropTable( - name: "Songs"); - - migrationBuilder.DropTable( - name: "Users"); - - migrationBuilder.DropTable( - name: "Albums"); - - migrationBuilder.DropTable( - name: "Artists"); - } - } -} diff --git a/Migrations/20251216025633_InitialMigration.Designer.cs b/Migrations/20251216025633_InitialMigration.Designer.cs new file mode 100644 index 0000000..760d294 --- /dev/null +++ b/Migrations/20251216025633_InitialMigration.Designer.cs @@ -0,0 +1,635 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; +using Shadow.Data; + +#nullable disable + +namespace Shadow.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20251216025633_InitialMigration")] + partial class InitialMigration + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "10.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("State") + .HasColumnType("integer"); + + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("ArtistId"); + + b.HasIndex("Uri") + .IsUnique(); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => + { + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Id") + .HasColumnType("integer"); + + b.Property("PlayDate") + .HasColumnType("timestamp with time zone"); + + b.Property("Starred") + .HasColumnType("boolean"); + + b.HasKey("AlbumId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("AlbumInteractions"); + }); + + modelBuilder.Entity("Shadow.Entities.Artist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique(); + + b.ToTable("Artists"); + }); + + modelBuilder.Entity("Shadow.Entities.Genre", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique(); + + b.ToTable("Genres"); + }); + + modelBuilder.Entity("Shadow.Entities.GenreSong", b => + { + b.Property("GenreId") + .HasColumnType("integer"); + + b.Property("SongId") + .HasColumnType("integer"); + + b.HasKey("GenreId", "SongId"); + + b.HasIndex("SongId"); + + b.ToTable("GenreSongs"); + }); + + modelBuilder.Entity("Shadow.Entities.Global", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Key") + .IsRequired() + .HasColumnType("text"); + + b.Property("Value") + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("Key") + .IsUnique(); + + b.ToTable("Globals"); + }); + + modelBuilder.Entity("Shadow.Entities.Image", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Filetype") + .IsRequired() + .HasColumnType("text"); + + b.Property("SongId") + .HasColumnType("integer"); + + b.Property("State") + .HasColumnType("integer"); + + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("SongId") + .IsUnique(); + + b.ToTable("Images"); + }); + + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("CreatorId") + .HasColumnType("integer"); + + b.Property("Description") + .IsRequired() + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("CreatorId"); + + b.HasIndex("Uri") + .IsUnique(); + + b.ToTable("Playlists"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => + { + b.Property("PlaylistId") + .HasColumnType("integer"); + + b.Property("SongId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.HasKey("PlaylistId", "SongId"); + + b.HasIndex("SongId"); + + b.ToTable("PlaylistSongs"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => + { + b.Property("PlaylistId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("PlaylistId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("PlaylistUsers"); + }); + + modelBuilder.Entity("Shadow.Entities.Radio", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Homepage") + .HasColumnType("text"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Url") + .IsRequired() + .HasColumnType("text"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("Radios"); + }); + + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AlbumId") + .HasColumnType("integer"); + + b.Property("ArtistId") + .HasColumnType("integer"); + + b.Property("BitDepth") + .HasColumnType("integer"); + + b.Property("Bitrate") + .HasColumnType("integer"); + + b.Property("Channels") + .HasColumnType("integer"); + + b.Property("Comment") + .HasColumnType("text"); + + b.Property("Date") + .HasColumnType("timestamp with time zone"); + + b.Property("DiscNumber") + .HasColumnType("integer"); + + b.Property("Duration") + .HasColumnType("integer"); + + b.Property("Filepath") + .IsRequired() + .HasColumnType("text"); + + b.Property("Filetype") + .IsRequired() + .HasColumnType("text"); + + b.Property("ImageId") + .HasColumnType("integer"); + + b.Property("Index") + .HasColumnType("integer"); + + b.Property("SamplingRate") + .HasColumnType("integer"); + + b.Property("Size") + .HasColumnType("integer"); + + b.Property("State") + .HasColumnType("integer"); + + b.Property("Title") + .IsRequired() + .HasColumnType("text"); + + b.Property("TrackNumber") + .HasColumnType("integer"); + + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("AlbumId"); + + b.HasIndex("ArtistId"); + + b.HasIndex("Uri") + .IsUnique(); + + b.ToTable("Songs"); + }); + + modelBuilder.Entity("Shadow.Entities.SongInteraction", b => + { + b.Property("SongId") + .HasColumnType("integer"); + + b.Property("UserId") + .HasColumnType("integer"); + + b.Property("Id") + .HasColumnType("integer"); + + b.Property("PlayCount") + .HasColumnType("integer"); + + b.Property("Rating") + .HasColumnType("integer"); + + b.Property("Starred") + .HasColumnType("boolean"); + + b.HasKey("SongId", "UserId"); + + b.HasIndex("UserId"); + + b.ToTable("SongInteractions"); + }); + + modelBuilder.Entity("Shadow.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasColumnType("text"); + + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Role") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.HasOne("Shadow.Entities.Artist", "Artist") + .WithMany("Albums") + .HasForeignKey("ArtistId"); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => + { + b.HasOne("Shadow.Entities.Album", "Album") + .WithMany() + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany("AlbumInteractions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.GenreSong", b => + { + b.HasOne("Shadow.Entities.Genre", "Genre") + .WithMany("GenreSongPair") + .HasForeignKey("GenreId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany("GenreSongPair") + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Genre"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.Image", b => + { + b.HasOne("Shadow.Entities.Song", "Song") + .WithOne("Image") + .HasForeignKey("Shadow.Entities.Image", "SongId"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.HasOne("Shadow.Entities.User", "Creator") + .WithMany("Playlists") + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => + { + b.HasOne("Shadow.Entities.Playlist", "Playlist") + .WithMany() + .HasForeignKey("PlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany() + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Playlist"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => + { + b.HasOne("Shadow.Entities.Playlist", "Playlist") + .WithMany("AuthorizedPlaylistUsers") + .HasForeignKey("PlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Playlist"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Radio", b => + { + b.HasOne("Shadow.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.HasOne("Shadow.Entities.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Artist", "Artist") + .WithMany("Songs") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("Shadow.Entities.SongInteraction", b => + { + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany() + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany("SongInteractions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Song"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Shadow.Entities.Artist", b => + { + b.Navigation("Albums"); + + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Shadow.Entities.Genre", b => + { + b.Navigation("GenreSongPair"); + }); + + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.Navigation("AuthorizedPlaylistUsers"); + }); + + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.Navigation("GenreSongPair"); + + b.Navigation("Image"); + }); + + modelBuilder.Entity("Shadow.Entities.User", b => + { + b.Navigation("AlbumInteractions"); + + b.Navigation("Playlists"); + + b.Navigation("SongInteractions"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20251216025633_InitialMigration.cs b/Migrations/20251216025633_InitialMigration.cs new file mode 100644 index 0000000..6fa9ae9 --- /dev/null +++ b/Migrations/20251216025633_InitialMigration.cs @@ -0,0 +1,482 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace Shadow.Migrations +{ + /// + public partial class InitialMigration : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Artists", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + NormalizedName = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Artists", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Genres", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + NormalizedName = table.Column(type: "text", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Genres", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Globals", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Key = table.Column(type: "text", nullable: false), + Value = table.Column(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Globals", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Users", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + NormalizedName = table.Column(type: "text", nullable: false), + Password = table.Column(type: "text", nullable: false), + Role = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Users", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "Albums", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Uri = table.Column(type: "text", nullable: false), + State = table.Column(type: "integer", nullable: false), + ArtistId = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Albums", x => x.Id); + table.ForeignKey( + name: "FK_Albums_Artists_ArtistId", + column: x => x.ArtistId, + principalTable: "Artists", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "Playlists", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + Uri = table.Column(type: "text", nullable: false), + Description = table.Column(type: "text", nullable: false), + CreatorId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Playlists", x => x.Id); + table.ForeignKey( + name: "FK_Playlists_Users_CreatorId", + column: x => x.CreatorId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Radios", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Name = table.Column(type: "text", nullable: false), + NormalizedName = table.Column(type: "text", nullable: false), + Homepage = table.Column(type: "text", nullable: true), + Url = table.Column(type: "text", nullable: false), + UserId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Radios", x => x.Id); + table.ForeignKey( + name: "FK_Radios_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "AlbumInteractions", + columns: table => new + { + AlbumId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false), + Id = table.Column(type: "integer", nullable: false), + PlayDate = table.Column(type: "timestamp with time zone", nullable: true), + Starred = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_AlbumInteractions", x => new { x.AlbumId, x.UserId }); + table.ForeignKey( + name: "FK_AlbumInteractions_Albums_AlbumId", + column: x => x.AlbumId, + principalTable: "Albums", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_AlbumInteractions_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Songs", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Title = table.Column(type: "text", nullable: false), + Uri = table.Column(type: "text", nullable: false), + Filepath = table.Column(type: "text", nullable: false), + State = table.Column(type: "integer", nullable: false), + Filetype = table.Column(type: "text", nullable: false), + Date = table.Column(type: "timestamp with time zone", nullable: false), + Duration = table.Column(type: "integer", nullable: false), + Bitrate = table.Column(type: "integer", nullable: false), + Size = table.Column(type: "integer", nullable: false), + Comment = table.Column(type: "text", nullable: true), + Channels = table.Column(type: "integer", nullable: false), + SamplingRate = table.Column(type: "integer", nullable: false), + BitDepth = table.Column(type: "integer", nullable: true), + Index = table.Column(type: "integer", nullable: false), + TrackNumber = table.Column(type: "integer", nullable: true), + DiscNumber = table.Column(type: "integer", nullable: true), + AlbumId = table.Column(type: "integer", nullable: false), + ArtistId = table.Column(type: "integer", nullable: false), + ImageId = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Songs", x => x.Id); + table.ForeignKey( + name: "FK_Songs_Albums_AlbumId", + column: x => x.AlbumId, + principalTable: "Albums", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Songs_Artists_ArtistId", + column: x => x.ArtistId, + principalTable: "Artists", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "PlaylistUsers", + columns: table => new + { + PlaylistId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PlaylistUsers", x => new { x.PlaylistId, x.UserId }); + table.ForeignKey( + name: "FK_PlaylistUsers_Playlists_PlaylistId", + column: x => x.PlaylistId, + principalTable: "Playlists", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PlaylistUsers_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "GenreSongs", + columns: table => new + { + GenreId = table.Column(type: "integer", nullable: false), + SongId = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_GenreSongs", x => new { x.GenreId, x.SongId }); + table.ForeignKey( + name: "FK_GenreSongs_Genres_GenreId", + column: x => x.GenreId, + principalTable: "Genres", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_GenreSongs_Songs_SongId", + column: x => x.SongId, + principalTable: "Songs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "Images", + columns: table => new + { + Id = table.Column(type: "integer", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Uri = table.Column(type: "text", nullable: false), + Filetype = table.Column(type: "text", nullable: false), + State = table.Column(type: "integer", nullable: false), + SongId = table.Column(type: "integer", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Images", x => x.Id); + table.ForeignKey( + name: "FK_Images_Songs_SongId", + column: x => x.SongId, + principalTable: "Songs", + principalColumn: "Id"); + }); + + migrationBuilder.CreateTable( + name: "PlaylistSongs", + columns: table => new + { + PlaylistId = table.Column(type: "integer", nullable: false), + SongId = table.Column(type: "integer", nullable: false), + Index = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_PlaylistSongs", x => new { x.PlaylistId, x.SongId }); + table.ForeignKey( + name: "FK_PlaylistSongs_Playlists_PlaylistId", + column: x => x.PlaylistId, + principalTable: "Playlists", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_PlaylistSongs_Songs_SongId", + column: x => x.SongId, + principalTable: "Songs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "SongInteractions", + columns: table => new + { + SongId = table.Column(type: "integer", nullable: false), + UserId = table.Column(type: "integer", nullable: false), + Id = table.Column(type: "integer", nullable: false), + PlayCount = table.Column(type: "integer", nullable: false), + Starred = table.Column(type: "boolean", nullable: true), + Rating = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SongInteractions", x => new { x.SongId, x.UserId }); + table.ForeignKey( + name: "FK_SongInteractions_Songs_SongId", + column: x => x.SongId, + principalTable: "Songs", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_SongInteractions_Users_UserId", + column: x => x.UserId, + principalTable: "Users", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_AlbumInteractions_UserId", + table: "AlbumInteractions", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Albums_ArtistId", + table: "Albums", + column: "ArtistId"); + + migrationBuilder.CreateIndex( + name: "IX_Albums_Uri", + table: "Albums", + column: "Uri", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Artists_NormalizedName", + table: "Artists", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Genres_NormalizedName", + table: "Genres", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_GenreSongs_SongId", + table: "GenreSongs", + column: "SongId"); + + migrationBuilder.CreateIndex( + name: "IX_Globals_Key", + table: "Globals", + column: "Key", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Images_SongId", + table: "Images", + column: "SongId", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Playlists_CreatorId", + table: "Playlists", + column: "CreatorId"); + + migrationBuilder.CreateIndex( + name: "IX_Playlists_Uri", + table: "Playlists", + column: "Uri", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_PlaylistSongs_SongId", + table: "PlaylistSongs", + column: "SongId"); + + migrationBuilder.CreateIndex( + name: "IX_PlaylistUsers_UserId", + table: "PlaylistUsers", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Radios_NormalizedName", + table: "Radios", + column: "NormalizedName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Radios_UserId", + table: "Radios", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_SongInteractions_UserId", + table: "SongInteractions", + column: "UserId"); + + migrationBuilder.CreateIndex( + name: "IX_Songs_AlbumId", + table: "Songs", + column: "AlbumId"); + + migrationBuilder.CreateIndex( + name: "IX_Songs_ArtistId", + table: "Songs", + column: "ArtistId"); + + migrationBuilder.CreateIndex( + name: "IX_Songs_Uri", + table: "Songs", + column: "Uri", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_Users_Name", + table: "Users", + column: "Name", + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "AlbumInteractions"); + + migrationBuilder.DropTable( + name: "GenreSongs"); + + migrationBuilder.DropTable( + name: "Globals"); + + migrationBuilder.DropTable( + name: "Images"); + + migrationBuilder.DropTable( + name: "PlaylistSongs"); + + migrationBuilder.DropTable( + name: "PlaylistUsers"); + + migrationBuilder.DropTable( + name: "Radios"); + + migrationBuilder.DropTable( + name: "SongInteractions"); + + migrationBuilder.DropTable( + name: "Genres"); + + migrationBuilder.DropTable( + name: "Playlists"); + + migrationBuilder.DropTable( + name: "Songs"); + + migrationBuilder.DropTable( + name: "Users"); + + migrationBuilder.DropTable( + name: "Albums"); + + migrationBuilder.DropTable( + name: "Artists"); + } + } +} diff --git a/Migrations/ApplicationDbContextModelSnapshot.cs b/Migrations/ApplicationDbContextModelSnapshot.cs index 1e1ec19..cd678c4 100644 --- a/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Migrations/ApplicationDbContextModelSnapshot.cs @@ -1,4 +1,4 @@ -// +// using System; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; @@ -10,596 +10,623 @@ using Shadow.Data; namespace Shadow.Migrations { - [DbContext(typeof(ApplicationDbContext))] - partial class ApplicationDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { + [DbContext(typeof(ApplicationDbContext))] + partial class ApplicationDbContextModelSnapshot : ModelSnapshot + { + protected override void BuildModel(ModelBuilder modelBuilder) + { #pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "10.0.0") - .HasAnnotation("Relational:MaxIdentifierLength", 63); + modelBuilder + .HasAnnotation("ProductVersion", "10.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("ArtistId") - .HasColumnType("integer"); + b.Property("ArtistId") + .HasColumnType("integer"); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - b.Property("State") - .HasColumnType("integer"); + b.Property("State") + .HasColumnType("integer"); - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("ArtistId"); + b.HasIndex("ArtistId"); - b.HasIndex("Uri") - .IsUnique(); + b.HasIndex("Uri") + .IsUnique(); - b.ToTable("Albums"); - }); + b.ToTable("Albums"); + }); - modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => - { - b.Property("AlbumId") - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => + { + b.Property("AlbumId") + .HasColumnType("integer"); - b.Property("UserId") - .HasColumnType("integer"); + b.Property("UserId") + .HasColumnType("integer"); - b.Property("Id") - .HasColumnType("integer"); + b.Property("Id") + .HasColumnType("integer"); - b.Property("PlayDate") - .HasColumnType("timestamp with time zone"); + b.Property("PlayDate") + .HasColumnType("timestamp with time zone"); - b.Property("Starred") - .HasColumnType("boolean"); + b.Property("Starred") + .HasColumnType("boolean"); - b.HasKey("AlbumId", "UserId"); + b.HasKey("AlbumId", "UserId"); - b.HasIndex("UserId"); + b.HasIndex("UserId"); - b.ToTable("AlbumInteractions"); - }); + b.ToTable("AlbumInteractions"); + }); - modelBuilder.Entity("Shadow.Entities.Artist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.Artist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("NormalizedName") - .IsUnique(); + b.HasIndex("NormalizedName") + .IsUnique(); - b.ToTable("Artists"); - }); + b.ToTable("Artists"); + }); - modelBuilder.Entity("Shadow.Entities.Genre", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.Genre", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); - b.HasKey("Id"); + b.HasKey("Id"); - b.HasIndex("NormalizedName") - .IsUnique(); + b.HasIndex("NormalizedName") + .IsUnique(); - b.ToTable("Genres"); - }); + b.ToTable("Genres"); + }); - modelBuilder.Entity("Shadow.Entities.GenreSong", b => - { - b.Property("GenreId") - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.GenreSong", b => + { + b.Property("GenreId") + .HasColumnType("integer"); - b.Property("SongId") - .HasColumnType("integer"); + b.Property("SongId") + .HasColumnType("integer"); - b.HasKey("GenreId", "SongId"); + b.HasKey("GenreId", "SongId"); - b.HasIndex("SongId"); + b.HasIndex("SongId"); - b.ToTable("GenreSongs"); - }); + b.ToTable("GenreSongs"); + }); - modelBuilder.Entity("Shadow.Entities.Image", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + modelBuilder.Entity("Shadow.Entities.Global", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("SongId") - .HasColumnType("integer"); + b.Property("Key") + .IsRequired() + .HasColumnType("text"); - b.Property("State") - .HasColumnType("integer"); + b.Property("Value") + .HasColumnType("text"); - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); + b.HasKey("Id"); - b.HasKey("Id"); + b.HasIndex("Key") + .IsUnique(); - b.HasIndex("SongId") - .IsUnique(); + b.ToTable("Globals"); + }); - b.ToTable("Images"); - }); + modelBuilder.Entity("Shadow.Entities.Image", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("Filetype") + .IsRequired() + .HasColumnType("text"); - b.Property("CreatorId") - .HasColumnType("integer"); + b.Property("SongId") + .HasColumnType("integer"); - b.Property("Description") - .IsRequired() - .HasColumnType("text"); + b.Property("State") + .HasColumnType("integer"); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); + b.HasKey("Id"); - b.HasKey("Id"); + b.HasIndex("SongId") + .IsUnique(); - b.HasIndex("CreatorId"); + b.ToTable("Images"); + }); - b.HasIndex("Uri") - .IsUnique(); + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - b.ToTable("Playlists"); - }); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => - { - b.Property("PlaylistId") - .HasColumnType("integer"); + b.Property("CreatorId") + .HasColumnType("integer"); - b.Property("SongId") - .HasColumnType("integer"); + b.Property("Description") + .IsRequired() + .HasColumnType("text"); - b.Property("Index") - .HasColumnType("integer"); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - b.HasKey("PlaylistId", "SongId"); + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); - b.HasIndex("SongId"); + b.HasKey("Id"); - b.ToTable("PlaylistSongs"); - }); + b.HasIndex("CreatorId"); - modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => - { - b.Property("PlaylistId") - .HasColumnType("integer"); + b.HasIndex("Uri") + .IsUnique(); - b.Property("UserId") - .HasColumnType("integer"); + b.ToTable("Playlists"); + }); - b.HasKey("PlaylistId", "UserId"); + modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => + { + b.Property("PlaylistId") + .HasColumnType("integer"); - b.HasIndex("UserId"); + b.Property("SongId") + .HasColumnType("integer"); - b.ToTable("PlaylistUsers"); - }); + b.Property("Index") + .HasColumnType("integer"); - modelBuilder.Entity("Shadow.Entities.Radio", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + b.HasKey("PlaylistId", "SongId"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.HasIndex("SongId"); - b.Property("Homepage") - .HasColumnType("text"); + b.ToTable("PlaylistSongs"); + }); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => + { + b.Property("PlaylistId") + .HasColumnType("integer"); - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); + b.Property("UserId") + .HasColumnType("integer"); - b.Property("Url") - .IsRequired() - .HasColumnType("text"); + b.HasKey("PlaylistId", "UserId"); - b.Property("UserId") - .HasColumnType("integer"); + b.HasIndex("UserId"); - b.HasKey("Id"); + b.ToTable("PlaylistUsers"); + }); - b.HasIndex("NormalizedName") - .IsUnique(); + modelBuilder.Entity("Shadow.Entities.Radio", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - b.HasIndex("UserId"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.ToTable("Radios"); - }); + b.Property("Homepage") + .HasColumnType("text"); - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); - b.Property("AlbumId") - .HasColumnType("integer"); + b.Property("Url") + .IsRequired() + .HasColumnType("text"); - b.Property("ArtistId") - .HasColumnType("integer"); + b.Property("UserId") + .HasColumnType("integer"); - b.Property("BitDepth") - .HasColumnType("integer"); + b.HasKey("Id"); - b.Property("Bitrate") - .HasColumnType("integer"); + b.HasIndex("NormalizedName") + .IsUnique(); - b.Property("Channels") - .HasColumnType("integer"); + b.HasIndex("UserId"); - b.Property("Comment") - .HasColumnType("text"); + b.ToTable("Radios"); + }); - b.Property("Date") - .HasColumnType("timestamp with time zone"); + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - b.Property("DiscNumber") - .HasColumnType("integer"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Property("Duration") - .HasColumnType("integer"); + b.Property("AlbumId") + .HasColumnType("integer"); - b.Property("Filepath") - .IsRequired() - .HasColumnType("text"); + b.Property("ArtistId") + .HasColumnType("integer"); - b.Property("Filetype") - .IsRequired() - .HasColumnType("text"); + b.Property("BitDepth") + .HasColumnType("integer"); - b.Property("ImageId") - .HasColumnType("integer"); + b.Property("Bitrate") + .HasColumnType("integer"); - b.Property("Index") - .HasColumnType("integer"); + b.Property("Channels") + .HasColumnType("integer"); - b.Property("SamplingRate") - .HasColumnType("integer"); + b.Property("Comment") + .HasColumnType("text"); - b.Property("Size") - .HasColumnType("integer"); + b.Property("Date") + .HasColumnType("timestamp with time zone"); - b.Property("State") - .HasColumnType("integer"); + b.Property("DiscNumber") + .HasColumnType("integer"); - b.Property("Title") - .IsRequired() - .HasColumnType("text"); + b.Property("Duration") + .HasColumnType("integer"); - b.Property("TrackNumber") - .HasColumnType("integer"); + b.Property("Filepath") + .IsRequired() + .HasColumnType("text"); - b.Property("Uri") - .IsRequired() - .HasColumnType("text"); + b.Property("Filetype") + .IsRequired() + .HasColumnType("text"); - b.HasKey("Id"); + b.Property("ImageId") + .HasColumnType("integer"); - b.HasIndex("AlbumId"); + b.Property("Index") + .HasColumnType("integer"); - b.HasIndex("ArtistId"); + b.Property("SamplingRate") + .HasColumnType("integer"); - b.HasIndex("Uri") - .IsUnique(); + b.Property("Size") + .HasColumnType("integer"); - b.ToTable("Songs"); - }); + b.Property("State") + .HasColumnType("integer"); - modelBuilder.Entity("Shadow.Entities.SongInteraction", b => - { - b.Property("SongId") - .HasColumnType("integer"); + b.Property("Title") + .IsRequired() + .HasColumnType("text"); - b.Property("UserId") - .HasColumnType("integer"); + b.Property("TrackNumber") + .HasColumnType("integer"); - b.Property("Id") - .HasColumnType("integer"); + b.Property("Uri") + .IsRequired() + .HasColumnType("text"); - b.Property("PlayCount") - .HasColumnType("integer"); + b.HasKey("Id"); - b.Property("Rating") - .HasColumnType("integer"); + b.HasIndex("AlbumId"); - b.Property("Starred") - .HasColumnType("boolean"); + b.HasIndex("ArtistId"); - b.HasKey("SongId", "UserId"); + b.HasIndex("Uri") + .IsUnique(); - b.HasIndex("UserId"); + b.ToTable("Songs"); + }); - b.ToTable("SongInteractions"); - }); + modelBuilder.Entity("Shadow.Entities.SongInteraction", b => + { + b.Property("SongId") + .HasColumnType("integer"); - modelBuilder.Entity("Shadow.Entities.User", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); + b.Property("UserId") + .HasColumnType("integer"); - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + b.Property("Id") + .HasColumnType("integer"); - b.Property("Name") - .IsRequired() - .HasColumnType("text"); + b.Property("PlayCount") + .HasColumnType("integer"); - b.Property("NormalizedName") - .IsRequired() - .HasColumnType("text"); + b.Property("Rating") + .HasColumnType("integer"); - b.Property("Password") - .IsRequired() - .HasColumnType("text"); + b.Property("Starred") + .HasColumnType("boolean"); - b.Property("Role") - .HasColumnType("integer"); + b.HasKey("SongId", "UserId"); - b.HasKey("Id"); + b.HasIndex("UserId"); - b.HasIndex("Name") - .IsUnique(); + b.ToTable("SongInteractions"); + }); - b.ToTable("Users"); - }); + modelBuilder.Entity("Shadow.Entities.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.HasOne("Shadow.Entities.Artist", "Artist") - .WithMany("Albums") - .HasForeignKey("ArtistId"); + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - b.Navigation("Artist"); - }); + b.Property("Name") + .IsRequired() + .HasColumnType("text"); - modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => - { - b.HasOne("Shadow.Entities.Album", "Album") - .WithMany() - .HasForeignKey("AlbumId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.Property("NormalizedName") + .IsRequired() + .HasColumnType("text"); - b.HasOne("Shadow.Entities.User", "User") - .WithMany("AlbumInteractions") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); + b.Property("Password") + .IsRequired() + .HasColumnType("text"); - b.Navigation("Album"); + b.Property("Role") + .HasColumnType("integer"); - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.GenreSong", b => - { - b.HasOne("Shadow.Entities.Genre", "Genre") - .WithMany("GenreSongPair") - .HasForeignKey("GenreId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany("GenreSongPair") - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Genre"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.Image", b => - { - b.HasOne("Shadow.Entities.Song", "Song") - .WithOne("Image") - .HasForeignKey("Shadow.Entities.Image", "SongId"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.HasOne("Shadow.Entities.User", "Creator") - .WithMany("Playlists") - .HasForeignKey("CreatorId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Creator"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => - { - b.HasOne("Shadow.Entities.Playlist", "Playlist") - .WithMany() - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany() - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - - b.Navigation("Song"); - }); - - modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => - { - b.HasOne("Shadow.Entities.Playlist", "Playlist") - .WithMany("AuthorizedPlaylistUsers") - .HasForeignKey("PlaylistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Playlist"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Radio", b => - { - b.HasOne("Shadow.Entities.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.HasOne("Shadow.Entities.Album", "Album") - .WithMany("Songs") - .HasForeignKey("AlbumId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.Artist", "Artist") - .WithMany("Songs") - .HasForeignKey("ArtistId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Album"); - - b.Navigation("Artist"); - }); - - modelBuilder.Entity("Shadow.Entities.SongInteraction", b => - { - b.HasOne("Shadow.Entities.Song", "Song") - .WithMany() - .HasForeignKey("SongId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Shadow.Entities.User", "User") - .WithMany("SongInteractions") - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Song"); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Shadow.Entities.Album", b => - { - b.Navigation("Songs"); - }); - - modelBuilder.Entity("Shadow.Entities.Artist", b => - { - b.Navigation("Albums"); - - b.Navigation("Songs"); - }); - - modelBuilder.Entity("Shadow.Entities.Genre", b => - { - b.Navigation("GenreSongPair"); - }); - - modelBuilder.Entity("Shadow.Entities.Playlist", b => - { - b.Navigation("AuthorizedPlaylistUsers"); - }); - - modelBuilder.Entity("Shadow.Entities.Song", b => - { - b.Navigation("GenreSongPair"); - - b.Navigation("Image"); - }); - - modelBuilder.Entity("Shadow.Entities.User", b => - { - b.Navigation("AlbumInteractions"); - - b.Navigation("Playlists"); - - b.Navigation("SongInteractions"); - }); + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique(); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.HasOne("Shadow.Entities.Artist", "Artist") + .WithMany("Albums") + .HasForeignKey("ArtistId"); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("Shadow.Entities.AlbumInteraction", b => + { + b.HasOne("Shadow.Entities.Album", "Album") + .WithMany() + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany("AlbumInteractions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.GenreSong", b => + { + b.HasOne("Shadow.Entities.Genre", "Genre") + .WithMany("GenreSongPair") + .HasForeignKey("GenreId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany("GenreSongPair") + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Genre"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.Image", b => + { + b.HasOne("Shadow.Entities.Song", "Song") + .WithOne("Image") + .HasForeignKey("Shadow.Entities.Image", "SongId"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.HasOne("Shadow.Entities.User", "Creator") + .WithMany("Playlists") + .HasForeignKey("CreatorId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Creator"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistSong", b => + { + b.HasOne("Shadow.Entities.Playlist", "Playlist") + .WithMany() + .HasForeignKey("PlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany() + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Playlist"); + + b.Navigation("Song"); + }); + + modelBuilder.Entity("Shadow.Entities.PlaylistUser", b => + { + b.HasOne("Shadow.Entities.Playlist", "Playlist") + .WithMany("AuthorizedPlaylistUsers") + .HasForeignKey("PlaylistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Playlist"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Radio", b => + { + b.HasOne("Shadow.Entities.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.HasOne("Shadow.Entities.Album", "Album") + .WithMany("Songs") + .HasForeignKey("AlbumId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.Artist", "Artist") + .WithMany("Songs") + .HasForeignKey("ArtistId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Album"); + + b.Navigation("Artist"); + }); + + modelBuilder.Entity("Shadow.Entities.SongInteraction", b => + { + b.HasOne("Shadow.Entities.Song", "Song") + .WithMany() + .HasForeignKey("SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Shadow.Entities.User", "User") + .WithMany("SongInteractions") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Song"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("Shadow.Entities.Album", b => + { + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Shadow.Entities.Artist", b => + { + b.Navigation("Albums"); + + b.Navigation("Songs"); + }); + + modelBuilder.Entity("Shadow.Entities.Genre", b => + { + b.Navigation("GenreSongPair"); + }); + + modelBuilder.Entity("Shadow.Entities.Playlist", b => + { + b.Navigation("AuthorizedPlaylistUsers"); + }); + + modelBuilder.Entity("Shadow.Entities.Song", b => + { + b.Navigation("GenreSongPair"); + + b.Navigation("Image"); + }); + + modelBuilder.Entity("Shadow.Entities.User", b => + { + b.Navigation("AlbumInteractions"); + + b.Navigation("Playlists"); + + b.Navigation("SongInteractions"); + }); #pragma warning restore 612, 618 - } - } + } + } }