using Domain.Entities.Donations; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Infrastructure.Persistence.Configurations.Donations; public sealed class RankingSnapshotConfiguration : IEntityTypeConfiguration { public void Configure(EntityTypeBuilder builder) { builder.HasOne(x => x.Member).WithMany().HasForeignKey(x => x.MemberID).OnDelete(DeleteBehavior.NoAction); builder.ToTable(nameof(RankingSnapshot), x => x.HasComment("랭킹 스냅샷 (일 1회 집계)")); builder.HasKey(x => x.ID); builder.Property(x => x.ID).ValueGeneratedOnAdd(); builder.Property(x => x.Type).IsRequired().HasConversion().HasComment("랭킹 종류 (1=종합, 2=크리에이터, 3=후원자)"); builder.Property(x => x.Period).IsRequired().HasConversion().HasComment("기간 (1=오늘, 2=어제, 3=이번주, 4=이번달, 5=지난달, 6=전체)"); builder.Property(x => x.PeriodStart).IsRequired().HasComment("기간 시작"); builder.Property(x => x.PeriodEnd).IsRequired().HasComment("기간 종료"); builder.Property(x => x.Category).HasMaxLength(30).HasComment("카테고리 (전체/게임/버츄얼/토크/음악/먹방)"); builder.Property(x => x.MemberID).IsRequired().HasComment("회원 ID"); builder.Property(x => x.Rank).IsRequired().HasComment("순위"); builder.Property(x => x.PreviousRank).HasComment("전일 순위"); builder.Property(x => x.Score).IsRequired().HasComment("종합 점수"); builder.Property(x => x.MoneyAmount).IsRequired().HasComment("수령/후원 금액"); builder.Property(x => x.DonorCount).IsRequired().HasComment("후원자 수"); builder.Property(x => x.BroadcastSec).IsRequired().HasComment("방송 시간 (초)"); builder.Property(x => x.ViewCount).IsRequired().HasComment("조회수"); builder.Property(x => x.LikeCount).IsRequired().HasComment("좋아요"); builder.Property(x => x.SnapshotAt).IsRequired().HasComment("스냅샷 일시"); builder.HasIndex(x => new { x.Type, x.Period, x.Category, x.Rank }); builder.HasIndex(x => new { x.Type, x.Period, x.Category, x.MemberID }).IsUnique(); builder.HasIndex(x => x.SnapshotAt).IsDescending(true); } }