using Microsoft.EntityFrameworkCore; namespace Socialize.Api.Modules.Approvals.Data; public static class ApprovalModelConfiguration { public static ModelBuilder ConfigureApprovalsModule(this ModelBuilder modelBuilder) { modelBuilder.Entity(workflowInstance => { workflowInstance.ToTable("ApprovalWorkflowInstances"); workflowInstance.HasKey(x => x.Id); workflowInstance.Property(x => x.State).HasMaxLength(64).IsRequired(); workflowInstance.Property(x => x.ApprovalMode).HasMaxLength(64).IsRequired(); workflowInstance.Property(x => x.StartedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); workflowInstance.HasIndex(x => x.WorkspaceId); workflowInstance.HasIndex(x => x.ContentItemId); workflowInstance.HasIndex(x => new { x.ContentItemId, x.State }) .IsUnique() .HasFilter("\"State\" = 'Pending'"); }); modelBuilder.Entity(approvalRequest => { approvalRequest.ToTable("ApprovalRequests"); approvalRequest.HasKey(x => x.Id); approvalRequest.Property(x => x.WorkflowStepTargetType).HasMaxLength(32); approvalRequest.Property(x => x.WorkflowStepTargetValue).HasMaxLength(128); approvalRequest.Property(x => x.Stage).HasMaxLength(64).IsRequired(); approvalRequest.Property(x => x.ReviewerName).HasMaxLength(256).IsRequired(); approvalRequest.Property(x => x.ReviewerEmail).HasMaxLength(256).IsRequired(); approvalRequest.Property(x => x.State).HasMaxLength(64).IsRequired(); approvalRequest.Property(x => x.AccessToken).HasMaxLength(64).IsRequired(); approvalRequest.Property(x => x.SentAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); approvalRequest.HasIndex(x => x.WorkspaceId); approvalRequest.HasIndex(x => x.ContentItemId); approvalRequest.HasIndex(x => x.WorkflowInstanceId); approvalRequest.HasIndex(x => x.ReviewerEmail); }); modelBuilder.Entity(approvalDecision => { approvalDecision.ToTable("ApprovalDecisions"); approvalDecision.HasKey(x => x.Id); approvalDecision.Property(x => x.Decision).HasMaxLength(64).IsRequired(); approvalDecision.Property(x => x.Comment).HasMaxLength(2048); approvalDecision.Property(x => x.DecidedByName).HasMaxLength(256).IsRequired(); approvalDecision.Property(x => x.DecidedByEmail).HasMaxLength(256).IsRequired(); approvalDecision.Property(x => x.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); approvalDecision.HasIndex(x => x.ApprovalRequestId); }); modelBuilder.Entity(approvalStep => { approvalStep.ToTable("WorkspaceApprovalStepConfigurations"); approvalStep.HasKey(x => x.Id); approvalStep.Property(x => x.Name).HasMaxLength(128).IsRequired(); approvalStep.Property(x => x.TargetType).HasMaxLength(32).IsRequired(); approvalStep.Property(x => x.TargetValue).HasMaxLength(128).IsRequired(); approvalStep.Property(x => x.RequiredApproverCount).HasDefaultValue(1); approvalStep.Property(x => x.CreatedAt) .ValueGeneratedOnAdd() .HasDefaultValueSql("CURRENT_TIMESTAMP"); approvalStep.HasIndex(x => x.WorkspaceId); approvalStep.HasIndex(x => new { x.WorkspaceId, x.SortOrder }).IsUnique(); }); return modelBuilder; } }