using System.ComponentModel.DataAnnotations; namespace Domain.Entities.Store; /// 게임 장르 코드 (관리형). 게임과 N:M (GameGenreMap). public class GameGenre { [Key] public int ID { get; private set; } public string KorName { get; private set; } = default!; public string? EngName { get; private set; } public int Order { get; private set; } public bool IsActive { get; private set; } = true; public DateTime CreatedAt { get; private set; } = DateTime.UtcNow; public DateTime? UpdatedAt { get; private set; } public virtual List GameGenreMap { get; private set; } = []; private GameGenre() { } public static GameGenre Create(string korName, string? engName = null, int order = 0, bool isActive = true) { Validate(korName, engName); return new GameGenre { KorName = korName.Trim(), EngName = string.IsNullOrWhiteSpace(engName) ? null : engName.Trim(), Order = order, IsActive = isActive }; } public void Update(string korName, string? engName, int order, bool isActive) { Validate(korName, engName); KorName = korName.Trim(); EngName = string.IsNullOrWhiteSpace(engName) ? null : engName.Trim(); Order = order; IsActive = isActive; UpdatedAt = DateTime.UtcNow; } private static void Validate(string korName, string? engName) { if (string.IsNullOrWhiteSpace(korName)) { throw new ArgumentException("KorName is required.", nameof(korName)); } if (korName.Length > 100) { throw new ArgumentOutOfRangeException(nameof(korName), "KorName 은 100자 이하로 입력하세요."); } if (engName is not null && engName.Length > 100) { throw new ArgumentOutOfRangeException(nameof(engName), "EngName 은 100자 이하로 입력하세요."); } } }