using System.ComponentModel.DataAnnotations;
namespace Domain.Entities.Stocks;
///
/// 회원 관심종목 (Member → Stock). d0 §2.1 규약대로 char(6) Code 를 FK 없이 denorm 보관하고 쓰기 시 AnyAsync 로 사전 검증한다.
/// (MemberID, StockCode) UNIQUE — 토글로 등록/해제.
///
public sealed class StockWatch
{
[Key]
public long ID { get; private set; }
/// 관심 등록 회원 ID
public int MemberID { get; private set; }
/// 단축코드 (char 6) — Stock.Code denorm
public string StockCode { get; private set; } = default!;
public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
private StockWatch() { }
private StockWatch(int memberID, string stockCode)
{
if (memberID <= 0)
{
throw new ArgumentOutOfRangeException(nameof(memberID));
}
if (stockCode is not { Length: 6 } || stockCode.Any(c => !char.IsAsciiDigit(c)))
{
throw new ArgumentException("stockCode must be 6 digits", nameof(stockCode));
}
MemberID = memberID;
StockCode = stockCode;
CreatedAt = DateTime.UtcNow;
}
public static StockWatch Create(int memberID, string stockCode)
{
return new(memberID, stockCode);
}
}