Files
gorbenko.pavel a8bfd9f456
Tests / frontend-test (push) Successful in 49s
Tests / backend-test (push) Successful in 1m38s
Feature/request type access (#23)
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/23
2026-09-25 11:48:02 +00:00

91 lines
4.6 KiB
C#

using Microsoft.EntityFrameworkCore;
using Tnsu.ApprovalRoute.Domain.Entities;
using Tnsu.ApprovalRoute.Infrastructure.Persistence.Entities;
namespace Tnsu.ApprovalRoute.Infrastructure.Persistence;
public class ApprovalRouteDbContext(DbContextOptions<ApprovalRouteDbContext> options) : DbContext(options)
{
public DbSet<RequestType> RequestTypes => Set<RequestType>();
public DbSet<RequestTypeAccess> RequestTypeAccesses => Set<RequestTypeAccess>();
public DbSet<RequestListPartition> RequestListPartitions => Set<RequestListPartition>();
public DbSet<TemplateRoute> TemplateRoutes => Set<TemplateRoute>();
public DbSet<TemplateRouteStep> TemplateRouteSteps => Set<TemplateRouteStep>();
public DbSet<TemplateRouteStepCondition> TemplateRouteStepConditions => Set<TemplateRouteStepCondition>();
public DbSet<AppSetting> Settings => Set<AppSetting>();
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<AppSetting>(e =>
{
// Имя таблицы задано явно: соглашение по именам сделало бы из
// AppSetting «app_settings», а таблица должна называться так же, как
// в api-tnsu-portal, — settings.
e.ToTable("settings");
e.HasKey(x => x.OptionName);
e.Property(x => x.OptionName).HasMaxLength(128);
});
modelBuilder.Entity<RequestType>(e =>
{
e.HasKey(x => x.Id);
e.Property(x => x.Name).HasMaxLength(256).IsRequired();
e.Property(x => x.PageUrl).HasMaxLength(512).IsRequired();
e.Property(x => x.ListId).HasMaxLength(512);
e.Property(x => x.SiteUrl).HasMaxLength(512);
e.Property(x => x.Section).HasMaxLength(256).IsRequired();
});
modelBuilder.Entity<RequestTypeAccess>(e =>
{
e.HasKey(x => x.Id);
e.Property(x => x.Email).HasMaxLength(256).IsRequired();
e.HasOne(x => x.RequestType).WithMany().HasForeignKey(x => x.RequestTypeId);
// Одна и та же пара тип+email не должна выдаваться дважды.
e.HasIndex(x => new { x.RequestTypeId, x.Email }).IsUnique();
});
modelBuilder.Entity<RequestListPartition>(e =>
{
e.HasKey(x => x.Id);
e.Property(x => x.ListId).HasMaxLength(512).IsRequired();
e.Property(x => x.Title).HasMaxLength(512);
e.HasOne(x => x.RequestType).WithMany(x => x.ListPartitions).HasForeignKey(x => x.RequestTypeId);
// Номер уникален в пределах типа заявок — вторая попытка записать тот же
// номер (например, при двойном запуске задачи) упадёт на этом индексе,
// а не создаст в реестре дубль.
e.HasIndex(x => new { x.RequestTypeId, x.Number }).IsUnique();
});
modelBuilder.Entity<TemplateRoute>(e =>
{
e.HasKey(x => x.Id);
e.HasOne(x => x.RequestType).WithMany(x => x.Routes).HasForeignKey(x => x.RequestTypeId);
e.HasIndex(x => new { x.RequestTypeId, x.DepartmentId, x.CompanyId, x.ByProject }).IsUnique();
});
modelBuilder.Entity<TemplateRouteStep>(e =>
{
e.HasKey(x => x.Id);
e.Property(x => x.ExecutorEmail).HasMaxLength(256);
e.Property(x => x.Position).HasMaxLength(128);
e.Property(x => x.ProjectRole).HasConversion<string>().HasMaxLength(32);
e.Property(x => x.HeadType).HasConversion<string>().HasMaxLength(32);
e.Property(x => x.Status).HasConversion<string>().HasMaxLength(32).IsRequired();
e.Property(x => x.ConditionsLogic).HasConversion<string>().HasMaxLength(16).IsRequired();
e.HasOne(x => x.Route).WithMany(x => x.Steps).HasForeignKey(x => x.RouteId);
e.HasIndex(x => new { x.RouteId, x.OrderNo });
});
modelBuilder.Entity<TemplateRouteStepCondition>(e =>
{
e.HasKey(x => x.Id);
e.Property(x => x.FieldName).HasMaxLength(128).IsRequired();
e.Property(x => x.Operation).HasConversion<string>().HasMaxLength(32).IsRequired();
e.Property(x => x.Value).HasMaxLength(256).IsRequired();
e.HasOne(x => x.Step).WithMany(x => x.Conditions).HasForeignKey(x => x.StepId).OnDelete(DeleteBehavior.Cascade);
e.HasIndex(x => new { x.StepId, x.OrderNo });
});
}
}