feat: add feedback backend foundation
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace Socialize.Api.Modules.Feedback.Data;
|
||||
|
||||
public static class FeedbackModelConfiguration
|
||||
{
|
||||
public static ModelBuilder ConfigureFeedbackModule(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<FeedbackReport>(feedback =>
|
||||
{
|
||||
feedback.ToTable("FeedbackReports");
|
||||
feedback.HasKey(x => x.Id);
|
||||
feedback.Property(x => x.Type).HasConversion<string>().HasMaxLength(32).IsRequired();
|
||||
feedback.Property(x => x.Status).HasConversion<string>().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.ProjectName).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<FeedbackTag>(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);
|
||||
});
|
||||
|
||||
return modelBuilder;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
namespace Socialize.Api.Modules.Feedback.Data;
|
||||
|
||||
public class FeedbackReport
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public FeedbackType Type { get; set; }
|
||||
public FeedbackStatus Status { get; set; }
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public Guid ReporterUserId { get; set; }
|
||||
public string ReporterDisplayName { get; set; } = string.Empty;
|
||||
public string ReporterEmail { get; set; } = string.Empty;
|
||||
public string SubmittedPath { get; set; } = string.Empty;
|
||||
public string? BrowserUserAgent { get; set; }
|
||||
public int? ViewportWidth { get; set; }
|
||||
public int? ViewportHeight { get; set; }
|
||||
public string? AppVersion { get; set; }
|
||||
public Guid? WorkspaceId { get; set; }
|
||||
public string? WorkspaceName { get; set; }
|
||||
public Guid? ClientId { get; set; }
|
||||
public string? ClientName { get; set; }
|
||||
public Guid? ProjectId { get; set; }
|
||||
public string? ProjectName { get; set; }
|
||||
public Guid? ContentItemId { get; set; }
|
||||
public string? ContentItemTitle { get; set; }
|
||||
public DateTimeOffset CreatedAt { get; set; }
|
||||
public DateTimeOffset LastActivityAt { get; set; }
|
||||
public DateTimeOffset? CancelledAt { get; set; }
|
||||
public Guid? CancelledByUserId { get; set; }
|
||||
public string? CancellationReason { get; set; }
|
||||
public ICollection<FeedbackTag> Tags { get; } = new List<FeedbackTag>();
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Socialize.Api.Modules.Feedback.Data;
|
||||
|
||||
public enum FeedbackStatus
|
||||
{
|
||||
New,
|
||||
Planned,
|
||||
Resolved,
|
||||
WontDo,
|
||||
Cancelled,
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
namespace Socialize.Api.Modules.Feedback.Data;
|
||||
|
||||
public class FeedbackTag
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public Guid FeedbackReportId { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string NormalizedName { get; set; } = string.Empty;
|
||||
public FeedbackReport? FeedbackReport { get; set; }
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
namespace Socialize.Api.Modules.Feedback.Data;
|
||||
|
||||
public enum FeedbackType
|
||||
{
|
||||
Bug,
|
||||
Suggestion,
|
||||
Request,
|
||||
}
|
||||
Reference in New Issue
Block a user