StockBoardStats.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using System.ComponentModel.DataAnnotations;
  2. namespace Domain.Entities.Stocks;
  3. /// <summary>
  4. /// 종목 가상보드 통계 (d2 §③) — StockCode 파티션(가상 보드)별 글/댓글 수 집계.
  5. /// 목록 헤더·trending 랭킹 캐시용. 글/댓글 작성 핸들러에서 lazy upsert(즉시 증가, 별도 배치 불요).
  6. /// Stock FK 는 걸지 않는다(D1 소유). StockCode 자체가 PK.
  7. /// </summary>
  8. public class StockBoardStats
  9. {
  10. /// <summary>종목 단축코드 (PK, char 6)</summary>
  11. [Key]
  12. public string StockCode { get; private set; } = default!;
  13. /// <summary>게시글 수</summary>
  14. public int Posts { get; private set; }
  15. /// <summary>댓글 수</summary>
  16. public int Comments { get; private set; }
  17. /// <summary>마지막 글 작성 일시</summary>
  18. public DateTime? LastPostAt { get; private set; }
  19. public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
  20. private StockBoardStats() { }
  21. public static StockBoardStats Create(string stockCode)
  22. {
  23. if (stockCode is not { Length: 6 } || stockCode.Any(c => !char.IsAsciiDigit(c)))
  24. {
  25. throw new ArgumentException("stockCode must be 6 digits", nameof(stockCode));
  26. }
  27. return new StockBoardStats
  28. {
  29. StockCode = stockCode
  30. };
  31. }
  32. /// <summary>글 1건 증가 + 최종 작성 일시 갱신.</summary>
  33. public void IncrementPost(DateTime postAtUtc)
  34. {
  35. Posts++;
  36. LastPostAt = postAtUtc;
  37. UpdatedAt = DateTime.UtcNow;
  38. }
  39. /// <summary>댓글 1건 증가.</summary>
  40. public void IncrementComment()
  41. {
  42. Comments++;
  43. UpdatedAt = DateTime.UtcNow;
  44. }
  45. }