using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Stocks; /// /// 종목 가상보드 통계 (d2 §③) — StockCode 파티션(가상 보드)별 글/댓글 수 집계. /// 목록 헤더·trending 랭킹 캐시용. 글/댓글 작성 핸들러에서 lazy upsert(즉시 증가, 별도 배치 불요). /// Stock FK 는 걸지 않는다(D1 소유). StockCode 자체가 PK. /// public class StockBoardStats { /// 종목 단축코드 (PK, char 6) [Key] public string StockCode { get; private set; } = default!; /// 게시글 수 public int Posts { get; private set; } /// 댓글 수 public int Comments { get; private set; } /// 마지막 글 작성 일시 public DateTime? LastPostAt { get; private set; } public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow; private StockBoardStats() { } public static StockBoardStats Create(string stockCode) { if (stockCode is not { Length: 6 } || stockCode.Any(c => !char.IsAsciiDigit(c))) { throw new ArgumentException("stockCode must be 6 digits", nameof(stockCode)); } return new StockBoardStats { StockCode = stockCode }; } /// 글 1건 증가 + 최종 작성 일시 갱신. public void IncrementPost(DateTime postAtUtc) { Posts++; LastPostAt = postAtUtc; UpdatedAt = DateTime.UtcNow; } /// 댓글 1건 증가. public void IncrementComment() { Comments++; UpdatedAt = DateTime.UtcNow; } }