using FreeSql.DataAnnotations;
using F9WebAiTest.Domain.Enums.SYS.RBAC;
using F9WebAiTest.Domain.Events.SYS.RBAC;
namespace F9WebAiTest.Domain.Entities.SYS.RBAC;
/// 角色:一组权限的集合。
[Table(Name = "sys_rbac_roles")]
public class Role : AggregateRoot
{
[Column(Name = "name")]
public string Name { get; private set; } // 如 "财务专员", "系统管理员"
[Column(Name = "code")]
public string Code { get; private set; } // 如:role:xxxx
[Column(Name = "sort_order")]
public int SortOrder { get; private set; }
[Column(Name = "description")]
public string Description { get; private set; }
[Column(Name = "is_active")]
public bool IsActive { get; private set; }
private readonly List _permissionIds = [];
public IReadOnlyCollection PermissionIds => _permissionIds.AsReadOnly();
public Role() { }
public Role(long id, string name, string code, int sortOrder, string description)
{
Id = id;
Name = name;
Code = code;
SortOrder = sortOrder;
IsActive = true;
Description = description;
CreatedAt = DateTime.Now;
}
public void Activate() => IsActive = true;
public void Deactivate() => IsActive = false;
public void AddPermission(long permissionId, Resource_Type_Enum type)
{
if (!_permissionIds.Contains(permissionId))
_permissionIds.Add(permissionId);
if (type == Resource_Type_Enum.菜单)
AddDomainEvent(new RoleMenu_ChangedDomainEvent(Id));
else if (type == Resource_Type_Enum.部门)
AddDomainEvent(new RoleDepartment_ChangedDomainEvent(Id));
}
public void RemovePermission(long permissionId, Resource_Type_Enum type)
{
_permissionIds.Remove(permissionId);
if (type == Resource_Type_Enum.菜单)
AddDomainEvent(new RoleMenu_ChangedDomainEvent(Id));
else if (type == Resource_Type_Enum.部门)
AddDomainEvent(new RoleDepartment_ChangedDomainEvent(Id));
}
}