This commit is contained in:
2025-10-27 17:39:18 -04:00
commit 31f723bea4
1579 changed files with 642409 additions and 0 deletions

View File

@@ -0,0 +1,64 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Prefab.Base.Catalog.Attributes;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Catalog.Data.Configs;
public sealed class AttributeDefinitionConfig() : Prefab.Data.Configs.EntityConfig<AttributeDefinition>("AttributeDefinitions", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<AttributeDefinition> builder)
{
base.Configure(builder);
builder.HasKey(a => a.Id);
builder.Property(a => a.RowVersion)
.IsRowVersion();
builder.Property(a => a.Name)
.IsRequired()
.HasMaxLength(AttributeDefinitionRules.NameMaxLength);
builder.Property(a => a.Unit)
.HasMaxLength(AttributeDefinitionRules.UnitMaxLength);
builder.HasMany<ProductAttributeValue>()
.WithOne(v => v.AttributeDefinition)
.HasForeignKey(v => v.AttributeDefinitionId)
.OnDelete(DeleteBehavior.Cascade);
}
}
public sealed class ProductAttributeValueConfig() : Prefab.Data.Configs.EntityConfig<ProductAttributeValue>("ProductAttributeValues", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<ProductAttributeValue> builder)
{
base.Configure(builder);
builder.HasKey(v => v.Id);
builder.Property(v => v.RowVersion)
.IsRowVersion();
builder.Property(v => v.Value)
.HasMaxLength(ProductAttributeValueRules.ValueMaxLength);
builder.Property(v => v.UnitCode)
.HasMaxLength(ProductAttributeValueRules.UnitCodeMaxLength);
builder.Property(v => v.EnumCode)
.HasMaxLength(ProductAttributeValueRules.EnumCodeMaxLength);
builder.Property(v => v.NumericValue)
.HasPrecision(18, 4);
builder.HasIndex(v => new { v.ProductId, v.AttributeDefinitionId })
.IsUnique();
builder.HasOne(v => v.Product)
.WithMany(p => p.Attributes)
.HasForeignKey(v => v.ProductId)
.OnDelete(DeleteBehavior.Cascade);
}
}

View File

@@ -0,0 +1,43 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Prefab.Base.Catalog.Categories;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Catalog.Data.Configs;
public class CategoryConfig() : Prefab.Data.Configs.EntityConfig<Category>(nameof(IModuleDb.Categories), IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<Category> builder)
{
base.Configure(builder);
builder.HasKey(e => e.Id);
builder.Property(e => e.RowVersion)
.IsRowVersion();
builder.Property(e => e.Name)
.HasMaxLength(CategoryRules.NameMaxLength)
.IsRequired();
builder.Property(e => e.Description)
.HasMaxLength(CategoryRules.DescriptionMaxLength);
builder.Property(e => e.Slug)
.HasMaxLength(CategoryRules.SlugMaxLength);
builder.HasIndex(e => e.Slug)
.IsUnique()
.HasFilter("[Slug] IS NOT NULL");
builder.Property(e => e.DisplayOrder);
builder.Property(e => e.IsFeatured);
builder.Property(e => e.HeroImageUrl)
.HasMaxLength(CategoryRules.HeroImageUrlMaxLength);
builder.Property(e => e.Icon)
.HasMaxLength(CategoryRules.IconMaxLength);
}
}

View File

@@ -0,0 +1,188 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Prefab.Base.Catalog.Options;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Catalog.Data.Configs;
public sealed class OptionDefinitionConfig() : Prefab.Data.Configs.EntityConfig<OptionDefinition>("OptionDefinitions", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<OptionDefinition> builder)
{
base.Configure(builder);
builder.HasKey(o => o.Id);
builder.Property(o => o.RowVersion)
.IsRowVersion();
builder.Property(o => o.Name)
.HasMaxLength(OptionDefinitionRules.NameMaxLength)
.IsRequired();
builder.Property(o => o.Code)
.HasMaxLength(OptionDefinitionRules.CodeMaxLength)
.IsRequired();
builder.Property(o => o.Unit)
.HasMaxLength(OptionDefinitionRules.UnitMaxLength);
builder.Property(o => o.Min)
.HasPrecision(18, 4);
builder.Property(o => o.Max)
.HasPrecision(18, 4);
builder.Property(o => o.Step)
.HasPrecision(18, 4);
builder.Property(o => o.PricePerUnit)
.HasPrecision(18, 4);
builder.Property(o => o.PercentScope)
.HasConversion(
v => v.HasValue ? (int)v.Value : (int?)null,
v => v.HasValue ? (PercentScope)v.Value : null);
builder.HasIndex(o => new { o.ProductId, o.Code })
.IsUnique();
builder.HasOne(o => o.Product)
.WithMany(p => p.Options)
.HasForeignKey(o => o.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(o => o.Values)
.WithOne(v => v.OptionDefinition)
.HasForeignKey(v => v.OptionDefinitionId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(o => o.Tiers)
.WithOne(t => t.OptionDefinition)
.HasForeignKey(t => t.OptionDefinitionId)
.OnDelete(DeleteBehavior.Cascade);
}
}
public sealed class OptionValueConfig() : Prefab.Data.Configs.EntityConfig<OptionValue>("OptionValues", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<OptionValue> builder)
{
base.Configure(builder);
builder.HasKey(v => v.Id);
builder.Property(v => v.RowVersion)
.IsRowVersion();
builder.Property(v => v.Code)
.HasMaxLength(OptionValueRules.CodeMaxLength)
.IsRequired();
builder.Property(v => v.Label)
.HasMaxLength(OptionValueRules.LabelMaxLength)
.IsRequired();
builder.Property(v => v.PriceDelta)
.HasPrecision(9, 4);
builder.HasIndex(v => new { v.OptionDefinitionId, v.Code })
.IsUnique();
}
}
public sealed class OptionTierConfig() : Prefab.Data.Configs.EntityConfig<OptionTier>("OptionTiers", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<OptionTier> builder)
{
base.Configure(builder);
builder.HasKey(t => t.Id);
builder.Property(t => t.RowVersion)
.IsRowVersion();
builder.Property(t => t.FromInclusive)
.HasPrecision(18, 4);
builder.Property(t => t.ToInclusive)
.HasPrecision(18, 4);
builder.Property(t => t.UnitRate)
.HasPrecision(18, 4);
builder.Property(t => t.FlatDelta)
.HasPrecision(18, 2);
builder.HasIndex(t => new { t.OptionDefinitionId, t.FromInclusive, t.ToInclusive });
}
}
public sealed class OptionRuleSetConfig() : Prefab.Data.Configs.EntityConfig<OptionRuleSet>("OptionRuleSets", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<OptionRuleSet> builder)
{
base.Configure(builder);
builder.HasKey(r => r.Id);
builder.Property(r => r.RowVersion)
.IsRowVersion();
builder.Property(r => r.TargetKind)
.HasConversion<byte>();
builder.Property(r => r.Effect)
.HasConversion<byte>();
builder.Property(r => r.Mode)
.HasConversion<byte>();
builder.HasIndex(r => new { r.ProductId, r.TargetKind, r.TargetId });
builder.HasOne(r => r.Product)
.WithMany(p => p.RuleSets)
.HasForeignKey(r => r.ProductId)
.OnDelete(DeleteBehavior.Cascade);
}
}
public sealed class OptionRuleConditionConfig() : Prefab.Data.Configs.EntityConfig<OptionRuleCondition>("OptionRuleConditions", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<OptionRuleCondition> builder)
{
base.Configure(builder);
builder.HasKey(c => c.Id);
builder.Property(c => c.RowVersion)
.IsRowVersion();
builder.Property(c => c.Operator)
.HasConversion<byte>();
builder.Property(c => c.RightNumber)
.HasPrecision(18, 4);
builder.Property(c => c.RightMin)
.HasPrecision(18, 4);
builder.Property(c => c.RightMax)
.HasPrecision(18, 4);
builder.HasOne(c => c.RuleSet)
.WithMany(r => r.Conditions)
.HasForeignKey(c => c.RuleSetId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasOne(c => c.LeftOptionDefinition)
.WithMany()
.HasForeignKey(c => c.LeftOptionDefinitionId)
.OnDelete(DeleteBehavior.NoAction);
builder.HasOne(c => c.RightOptionValue)
.WithMany()
.HasForeignKey(c => c.RightOptionValueId)
.OnDelete(DeleteBehavior.NoAction);
}
}

View File

@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Catalog.Data.Configs;
public sealed class ProductCategoryConfig() : Prefab.Data.Configs.EntityConfig<ProductCategory>("ProductCategories", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<ProductCategory> builder)
{
base.Configure(builder);
builder.HasKey(pc => new { pc.ProductId, pc.CategoryId });
builder.HasOne(pc => pc.Product)
.WithMany(p => p.Categories)
.HasForeignKey(pc => pc.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasOne(pc => pc.Category)
.WithMany()
.HasForeignKey(pc => pc.CategoryId)
.OnDelete(DeleteBehavior.Restrict);
}
}

View File

@@ -0,0 +1,98 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Prefab.Base.Catalog.Products;
using Prefab.Catalog.Domain.Entities;
namespace Prefab.Catalog.Data.Configs;
public sealed class ProductConfig() : Prefab.Data.Configs.EntityConfig<Product>("Products", IModuleDb.SchemaName.ToLower())
{
public override void Configure(EntityTypeBuilder<Product> builder)
{
base.Configure(builder);
builder.HasKey(p => p.Id);
builder.Property(p => p.RowVersion)
.IsRowVersion();
builder.Property(p => p.Name)
.HasMaxLength(ProductRules.NameMaxLength)
.IsRequired();
builder.Property(p => p.Slug)
.HasMaxLength(ProductRules.SlugMaxLength);
builder.Property(p => p.Sku)
.HasMaxLength(ProductRules.SkuMaxLength);
builder.Property(p => p.Description)
.HasMaxLength(ProductRules.DescriptionMaxLength);
builder.Property(p => p.Price)
.HasPrecision(18, 2);
builder.HasIndex(p => p.Sku)
.IsUnique()
.HasFilter("[Sku] IS NOT NULL");
builder.HasIndex(p => p.Slug)
.IsUnique()
.HasFilter("[Slug] IS NOT NULL");
builder.HasOne(p => p.ParentProduct)
.WithMany(p => p.Variants)
.HasForeignKey(p => p.ParentProductId)
.OnDelete(DeleteBehavior.Restrict);
builder.HasMany(p => p.Attributes)
.WithOne(a => a.Product)
.HasForeignKey(a => a.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(p => p.Options)
.WithOne(o => o.Product)
.HasForeignKey(o => o.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(p => p.Categories)
.WithOne(pc => pc.Product)
.HasForeignKey(pc => pc.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(p => p.RuleSets)
.WithOne(r => r.Product)
.HasForeignKey(r => r.ProductId)
.OnDelete(DeleteBehavior.Cascade);
builder.HasMany(p => p.AxisValues)
.WithOne(v => v.ProductVariant)
.HasForeignKey(v => v.ProductVariantId)
.OnDelete(DeleteBehavior.NoAction);
}
}
public sealed class VariantAxisValueConfig() : IEntityTypeConfiguration<VariantAxisValue>
{
public void Configure(EntityTypeBuilder<VariantAxisValue> builder)
{
builder.ToTable("VariantAxisValues", IModuleDb.SchemaName.ToLower());
builder.HasKey(v => new { v.ProductVariantId, v.OptionDefinitionId });
builder.HasOne(v => v.ProductVariant)
.WithMany(p => p.AxisValues)
.HasForeignKey(v => v.ProductVariantId)
.OnDelete(DeleteBehavior.NoAction);
builder.HasOne(v => v.OptionDefinition)
.WithMany()
.HasForeignKey(v => v.OptionDefinitionId)
.OnDelete(DeleteBehavior.NoAction);
builder.HasOne(v => v.OptionValue)
.WithMany()
.HasForeignKey(v => v.OptionValueId)
.OnDelete(DeleteBehavior.Cascade);
}
}