using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using PlaylistShared.Api.Entities; namespace PlaylistShared.Api.Data; public class ApplicationDbContext : IdentityDbContext, Guid>, IDataProtectionKeyContext { public ApplicationDbContext(DbContextOptions options) : base(options) { } public DbSet FavoritePlaylists => Set(); public DbSet SharedPlaylists => Set(); public DbSet TrackAdditionLogs => Set(); public DbSet TrackRemovalLogs => Set(); public DbSet UserSessions => Set(); public DbSet YandexAuthSessions => Set(); public DbSet DataProtectionKeys { get; set; } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.FriendlyName).IsRequired(); }); builder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.ShareToken).IsUnique(); entity.HasOne(e => e.Creator) .WithMany(u => u.OwnedPlaylists) .HasForeignKey(e => e.CreatorUserId) .OnDelete(DeleteBehavior.Restrict); entity.Property(e => e.YandexPlaylistUuid).IsRequired().HasMaxLength(50); entity.Property(e => e.YandexPlaylistKind).IsRequired().HasMaxLength(50); entity.Property(e => e.YandexPlaylistOwnerUid).IsRequired().HasMaxLength(50); entity.Property(e => e.Title).IsRequired().HasMaxLength(255); }); builder.Entity(entity => { entity.HasKey(e => e.SessionId); entity.Property(e => e.SessionId).HasMaxLength(449); entity.HasIndex(e => e.AssociatedUserId); entity.HasOne(e => e.User) .WithMany() .HasForeignKey(e => e.AssociatedUserId) .OnDelete(DeleteBehavior.SetNull); }); builder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => new { e.SharedPlaylistId, e.TrackId }); entity.HasOne(e => e.SharedPlaylist) .WithMany(sp => sp.TrackAdditionLogs) .HasForeignKey(e => e.SharedPlaylistId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.AddedByUser) .WithMany() .HasForeignKey(e => e.AddedByUserId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Session) .WithMany(s => s.TrackAdditionLogs) .HasForeignKey(e => e.SessionId) .OnDelete(DeleteBehavior.Restrict); }); builder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => new { e.SharedPlaylistId, e.TrackId }); entity.HasOne(e => e.SharedPlaylist) .WithMany() .HasForeignKey(e => e.SharedPlaylistId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.RemovedByUser) .WithMany() .HasForeignKey(e => e.RemovedByUserId) .OnDelete(DeleteBehavior.Restrict); entity.HasOne(e => e.Session) .WithMany(s => s.TrackRemovalLogs) .HasForeignKey(e => e.SessionId) .OnDelete(DeleteBehavior.Restrict); }); builder.Entity(entity => { entity.HasKey(e => new { e.UserId, e.SharedPlaylistId }); entity.HasOne(e => e.User) .WithMany(u => u.FavoritePlaylists) .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); entity.HasOne(e => e.SharedPlaylist) .WithMany() .HasForeignKey(e => e.SharedPlaylistId) .OnDelete(DeleteBehavior.Cascade); entity.Property(e => e.AddedAtUtc).IsRequired(); }); builder.Entity(entity => { entity.HasKey(e => e.Id); entity.Property(e => e.Id) .ValueGeneratedOnAdd(); entity.HasOne(e => e.User) .WithMany() .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.SetNull); entity.Property(e => e.QrCodeUrl) .IsRequired() .HasMaxLength(500); entity.Property(e => e.SerializedCookies) .IsRequired() .HasColumnType("nvarchar(max)"); entity.Property(e => e.ConfirmedAt) .IsRequired(false); entity.Property(e => e.IsConfirmed) .IsRequired() .HasDefaultValue(false); entity.Property(e => e.TrackId) .HasMaxLength(100) .IsRequired(false); entity.Property(e => e.CsfrToken) .HasMaxLength(200) .IsRequired(false); entity.Property(e => e.HeaderCsfrToken) .HasMaxLength(200) .IsRequired(false); entity.Property(e => e.HeaderProcessId) .HasMaxLength(200) .IsRequired(false); entity.HasIndex(e => e.UserId) .HasDatabaseName("IX_YandexAuthSessions_UserId"); }); } }