using Microsoft.EntityFrameworkCore; namespace Socialize.Api.Modules.Feedback.Data; public static class FeedbackModelConfiguration { public static ModelBuilder ConfigureFeedbackModule(this ModelBuilder modelBuilder) { modelBuilder.Entity(feedback => { feedback.ToTable("FeedbackReports"); feedback.HasKey(x => x.Id); feedback.Property(x => x.Type).HasConversion().HasMaxLength(32).IsRequired(); feedback.Property(x => x.Status).HasConversion().HasMaxLength(32).IsRequired(); feedback.Property(x => x.Description).HasMaxLength(8000).IsRequired(); feedback.Property(x => x.ReporterDisplayName).HasMaxLength(256).IsRequired(); feedback.Property(x => x.ReporterEmail).HasMaxLength(256).IsRequired(); feedback.Property(x => x.SubmittedPath).HasMaxLength(2048).IsRequired(); feedback.Property(x => x.BrowserUserAgent).HasMaxLength(1024); feedback.Property(x => x.AppVersion).HasMaxLength(128); feedback.Property(x => x.WorkspaceName).HasMaxLength(256); feedback.Property(x => x.ClientName).HasMaxLength(256); feedback.Property(x => x.CampaignName).HasMaxLength(256); feedback.Property(x => x.ContentItemTitle).HasMaxLength(256); feedback.Property(x => x.CancellationReason).HasMaxLength(2000); feedback.Property(x => x.CreatedAt).ValueGeneratedOnAdd().HasDefaultValueSql("CURRENT_TIMESTAMP"); feedback.HasIndex(x => x.ReporterUserId); feedback.HasIndex(x => x.Status); feedback.HasIndex(x => x.Type); feedback.HasIndex(x => x.WorkspaceId); feedback.HasIndex(x => x.LastActivityAt); }); modelBuilder.Entity(tag => { tag.ToTable("FeedbackTags"); tag.HasKey(x => x.Id); tag.Property(x => x.Name).HasMaxLength(64).IsRequired(); tag.Property(x => x.NormalizedName).HasMaxLength(64).IsRequired(); tag.HasIndex(x => x.NormalizedName); tag.HasIndex(x => new { x.FeedbackReportId, x.NormalizedName }).IsUnique(); tag.HasOne(x => x.FeedbackReport) .WithMany(x => x.Tags) .HasForeignKey(x => x.FeedbackReportId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(screenshot => { screenshot.ToTable("FeedbackScreenshots"); screenshot.HasKey(x => x.Id); screenshot.Property(x => x.FileName).HasMaxLength(256).IsRequired(); screenshot.Property(x => x.ContentType).HasMaxLength(128).IsRequired(); screenshot.Property(x => x.BlobContainerName).HasMaxLength(128).IsRequired(); screenshot.Property(x => x.BlobName).HasMaxLength(512).IsRequired(); screenshot.Property(x => x.CreatedAt).ValueGeneratedOnAdd().HasDefaultValueSql("CURRENT_TIMESTAMP"); screenshot.HasIndex(x => x.FeedbackReportId).IsUnique(); screenshot.HasOne(x => x.FeedbackReport) .WithOne(x => x.Screenshot) .HasForeignKey(x => x.FeedbackReportId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(comment => { comment.ToTable("FeedbackComments"); comment.HasKey(x => x.Id); comment.Property(x => x.AuthorDisplayName).HasMaxLength(256).IsRequired(); comment.Property(x => x.AuthorEmail).HasMaxLength(256).IsRequired(); comment.Property(x => x.AuthorRole).HasMaxLength(32).IsRequired(); comment.Property(x => x.Body).HasMaxLength(8000).IsRequired(); comment.Property(x => x.CreatedAt).ValueGeneratedOnAdd().HasDefaultValueSql("CURRENT_TIMESTAMP"); comment.HasIndex(x => x.FeedbackReportId); comment.HasIndex(x => x.AuthorUserId); comment.HasIndex(x => x.CreatedAt); comment.HasOne(x => x.FeedbackReport) .WithMany(x => x.Comments) .HasForeignKey(x => x.FeedbackReportId) .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity(activity => { activity.ToTable("FeedbackActivityEntries"); activity.HasKey(x => x.Id); activity.Property(x => x.ActorDisplayName).HasMaxLength(256).IsRequired(); activity.Property(x => x.ActorEmail).HasMaxLength(256).IsRequired(); activity.Property(x => x.ActivityType).HasMaxLength(64).IsRequired(); activity.Property(x => x.FromValue).HasMaxLength(512); activity.Property(x => x.ToValue).HasMaxLength(512); activity.Property(x => x.Note).HasMaxLength(2000); activity.Property(x => x.CreatedAt).ValueGeneratedOnAdd().HasDefaultValueSql("CURRENT_TIMESTAMP"); activity.HasIndex(x => x.FeedbackReportId); activity.HasIndex(x => x.ActorUserId); activity.HasIndex(x => x.CreatedAt); activity.HasOne(x => x.FeedbackReport) .WithMany(x => x.ActivityEntries) .HasForeignKey(x => x.FeedbackReportId) .OnDelete(DeleteBehavior.Cascade); }); return modelBuilder; } }