Files
pos-system/services/membership-service-net/src/MembershipService.Domain/AggregatesModel/LevelAggregate/LevelDefinition.cs

234 lines
6.8 KiB
C#

using MembershipService.Domain.SeedWork;
namespace MembershipService.Domain.AggregatesModel.LevelAggregate;
/// <summary>
/// EN: Level definition aggregate root - configurable level rules.
/// VI: Level definition aggregate root - cấu hình level có thể tùy chỉnh.
/// </summary>
/// <remarks>
/// EN: Admin can customize level definitions through API.
/// Each level has a required EXP threshold and associated benefits.
/// VI: Admin có thể tùy chỉnh level definitions qua API.
/// Mỗi level có ngưỡng EXP yêu cầu và các benefits đi kèm.
/// </remarks>
public class LevelDefinition : Entity, IAggregateRoot
{
private readonly List<LevelBenefit> _benefits = new();
private int _levelNumber;
private string _name;
private int _requiredExp;
private string? _description;
private string? _iconUrl;
private string? _badgeColor;
private bool _isActive;
private DateTime _createdAt;
private DateTime _updatedAt;
/// <summary>
/// EN: Level number (1, 2, 3...).
/// VI: Số thứ tự level (1, 2, 3...).
/// </summary>
public int LevelNumber => _levelNumber;
/// <summary>
/// EN: Level name (Bronze, Silver, Gold...).
/// VI: Tên level (Bronze, Silver, Gold...).
/// </summary>
public string Name => _name;
/// <summary>
/// EN: Required EXP to reach this level.
/// VI: EXP cần thiết để đạt level này.
/// </summary>
public int RequiredExp => _requiredExp;
/// <summary>
/// EN: Level description.
/// VI: Mô tả level.
/// </summary>
public string? Description => _description;
/// <summary>
/// EN: Icon URL for the level badge.
/// VI: URL icon cho badge level.
/// </summary>
public string? IconUrl => _iconUrl;
/// <summary>
/// EN: Badge color in hex format (#CD7F32, #FFD700...).
/// VI: Màu badge dạng hex (#CD7F32, #FFD700...).
/// </summary>
public string? BadgeColor => _badgeColor;
/// <summary>
/// EN: Whether this level is active.
/// VI: Level có đang active không.
/// </summary>
public bool IsActive => _isActive;
/// <summary>
/// EN: Creation timestamp.
/// VI: Thời gian tạo.
/// </summary>
public DateTime CreatedAt => _createdAt;
/// <summary>
/// EN: Last update timestamp.
/// VI: Thời gian cập nhật cuối.
/// </summary>
public DateTime UpdatedAt => _updatedAt;
/// <summary>
/// EN: Benefits associated with this level.
/// VI: Các benefits đi kèm với level này.
/// </summary>
public IReadOnlyCollection<LevelBenefit> Benefits => _benefits.AsReadOnly();
/// <summary>
/// EN: Private constructor for EF Core.
/// VI: Constructor private cho EF Core.
/// </summary>
protected LevelDefinition()
{
_name = string.Empty;
}
/// <summary>
/// EN: Create new level definition.
/// VI: Tạo level definition mới.
/// </summary>
/// <param name="levelNumber">Level number (1, 2, 3...) / Số thứ tự level</param>
/// <param name="name">Level name / Tên level</param>
/// <param name="requiredExp">Required EXP / EXP yêu cầu</param>
/// <param name="description">Description / Mô tả</param>
/// <param name="iconUrl">Icon URL / URL icon</param>
/// <param name="badgeColor">Badge color (hex) / Màu badge</param>
public LevelDefinition(
int levelNumber,
string name,
int requiredExp,
string? description = null,
string? iconUrl = null,
string? badgeColor = null) : this()
{
if (levelNumber < 1)
throw new ArgumentException("Level number must be positive", nameof(levelNumber));
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Level name cannot be empty", nameof(name));
if (requiredExp < 0)
throw new ArgumentException("Required EXP cannot be negative", nameof(requiredExp));
Id = Guid.NewGuid();
_levelNumber = levelNumber;
_name = name;
_requiredExp = requiredExp;
_description = description;
_iconUrl = iconUrl;
_badgeColor = badgeColor;
_isActive = true;
_createdAt = DateTime.UtcNow;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Update level name.
/// VI: Cập nhật tên level.
/// </summary>
public void UpdateName(string name)
{
if (string.IsNullOrWhiteSpace(name))
throw new ArgumentException("Level name cannot be empty", nameof(name));
_name = name;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Update required EXP threshold.
/// VI: Cập nhật ngưỡng EXP yêu cầu.
/// </summary>
public void UpdateRequiredExp(int requiredExp)
{
if (requiredExp < 0)
throw new ArgumentException("Required EXP cannot be negative", nameof(requiredExp));
_requiredExp = requiredExp;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Update level description.
/// VI: Cập nhật mô tả level.
/// </summary>
public void UpdateDescription(string? description)
{
_description = description;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Update icon URL.
/// VI: Cập nhật URL icon.
/// </summary>
public void UpdateIconUrl(string? iconUrl)
{
_iconUrl = iconUrl;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Update badge color.
/// VI: Cập nhật màu badge.
/// </summary>
public void UpdateBadgeColor(string? badgeColor)
{
_badgeColor = badgeColor;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Add a benefit to this level.
/// VI: Thêm một benefit cho level này.
/// </summary>
public void AddBenefit(LevelBenefit benefit)
{
if (benefit == null)
throw new ArgumentNullException(nameof(benefit));
_benefits.Add(benefit);
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Remove a benefit from this level.
/// VI: Xóa một benefit khỏi level này.
/// </summary>
public void RemoveBenefit(LevelBenefit benefit)
{
_benefits.Remove(benefit);
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Activate this level.
/// VI: Kích hoạt level này.
/// </summary>
public void Activate()
{
_isActive = true;
_updatedAt = DateTime.UtcNow;
}
/// <summary>
/// EN: Deactivate this level (soft delete).
/// VI: Vô hiệu hóa level này (xóa mềm).
/// </summary>
public void Deactivate()
{
_isActive = false;
_updatedAt = DateTime.UtcNow;
}
}