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;
}
}