ProductConfiguration.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Domain.Entities.Store;
  2. using Microsoft.EntityFrameworkCore;
  3. using Microsoft.EntityFrameworkCore.Metadata.Builders;
  4. namespace Infrastructure.Persistence.Configurations.Store;
  5. public sealed class ProductConfiguration : IEntityTypeConfiguration<Product>
  6. {
  7. public void Configure(EntityTypeBuilder<Product> builder)
  8. {
  9. builder.ToTable(nameof(Product), t => t.HasComment("상점 상품"));
  10. builder.HasKey(x => x.ID);
  11. builder.HasOne(x => x.Game).WithMany().HasForeignKey(x => x.GameID).IsRequired(false).OnDelete(DeleteBehavior.Restrict);
  12. builder.Property(x => x.GameID).HasComment("게임 ID (선택 — null=플랫폼 직접판매)");
  13. builder.Property(x => x.Name).HasMaxLength(200).IsRequired().HasComment("상품명");
  14. builder.Property(x => x.Description).HasColumnType("nvarchar(max)");
  15. builder.Property(x => x.Thumbnail).HasMaxLength(500);
  16. builder.Property(x => x.Type).HasConversion<int>().IsRequired().HasComment("상품 유형 (1=Physical, 2=Digital)");
  17. builder.Property(x => x.Price).IsRequired().HasComment("판매가 (KRW)");
  18. builder.Property(x => x.Stock).IsRequired().HasComment("재고 (-1=무제한)");
  19. builder.Property(x => x.MinPurchase).IsRequired().HasDefaultValue(1).HasComment("1회 주문 최소 구매 수량");
  20. builder.Property(x => x.MaxPurchase).IsRequired().HasDefaultValue(999).HasComment("1회 주문 최대 구매 수량 (하드 상한 999)");
  21. builder.Property(x => x.RequireDonationChannel).IsRequired().HasDefaultValue(false).HasComment("구매 시 후원 채널 선택 필수 여부");
  22. builder.Property(x => x.ItemKind).HasComment("아이템 종류 (null=일반상품, 2~4=지위, 5~11=소모품)");
  23. builder.Property(x => x.DurationDays).IsRequired().HasDefaultValue(0).HasComment("아이템 효과 지속일 (0=즉시소모/영구)");
  24. builder.Property(x => x.EffectPayload).HasColumnType("nvarchar(max)").HasComment("지위 아이템 효과 페이로드 JSON (색상·아이콘·애니메이션)");
  25. builder.Property(x => x.IsGiftable).IsRequired().HasDefaultValue(false).HasComment("선물하기 가능 여부");
  26. builder.Property(x => x.IsActive).IsRequired();
  27. builder.Property(x => x.Order).IsRequired();
  28. builder.Property(x => x.SaleStartAt);
  29. builder.Property(x => x.SaleEndAt);
  30. builder.Property(x => x.CreatedAt).IsRequired();
  31. builder.Property(x => x.UpdatedAt);
  32. builder.Property(x => x.RowVersion).IsRowVersion();
  33. builder.HasIndex(x => new { x.GameID, x.IsActive, x.Order });
  34. builder.HasIndex(x => new { x.IsActive, x.Type });
  35. builder.HasIndex(x => new { x.ItemKind, x.IsActive });
  36. }
  37. }