using Microsoft.EntityFrameworkCore; using Socialize.Api.Modules.ContentItems.Data; using Socialize.Api.Modules.Workspaces.Data; namespace Socialize.Api.Modules.Approvals.Data; internal 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'"); workflowInstance.HasOne() .WithMany() .HasForeignKey(x => x.WorkspaceId) .OnDelete(DeleteBehavior.Restrict); workflowInstance.HasOne() .WithMany() .HasForeignKey(x => x.ContentItemId) .OnDelete(DeleteBehavior.Restrict); }); 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); approvalRequest.HasOne() .WithMany() .HasForeignKey(x => x.WorkspaceId) .OnDelete(DeleteBehavior.Restrict); approvalRequest.HasOne() .WithMany() .HasForeignKey(x => x.ContentItemId) .OnDelete(DeleteBehavior.Restrict); approvalRequest.HasOne() .WithMany() .HasForeignKey(x => x.WorkflowInstanceId) .OnDelete(DeleteBehavior.Restrict); }); 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); approvalDecision.HasOne() .WithMany() .HasForeignKey(x => x.ApprovalRequestId) .OnDelete(DeleteBehavior.Restrict); }); 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(); approvalStep.HasOne() .WithMany() .HasForeignKey(x => x.WorkspaceId) .OnDelete(DeleteBehavior.Restrict); }); return modelBuilder; } }