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 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(); }); } }