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