using ColaFlow.Shared.Kernel.Common;
using ColaFlow.Modules.Identity.Domain.Aggregates.Tenants;
namespace ColaFlow.Modules.Identity.Domain.Aggregates.Users;
///
/// Represents a user's role within a specific tenant
///
public sealed class UserTenantRole : Entity
{
public UserId UserId { get; private set; } = null!;
public TenantId TenantId { get; private set; } = null!;
public TenantRole Role { get; private set; }
public DateTime AssignedAt { get; private set; }
public Guid? AssignedByUserId { get; private set; }
// Navigation properties (optional, for EF Core)
public User User { get; private set; } = null!;
public Tenant Tenant { get; private set; } = null!;
// Private constructor for EF Core
private UserTenantRole() : base()
{
}
///
/// Factory method to create a user-tenant-role assignment
///
public static UserTenantRole Create(
UserId userId,
TenantId tenantId,
TenantRole role,
Guid? assignedByUserId = null)
{
return new UserTenantRole
{
Id = Guid.NewGuid(),
UserId = userId,
TenantId = tenantId,
Role = role,
AssignedAt = DateTime.UtcNow,
AssignedByUserId = assignedByUserId
};
}
///
/// Update the user's role (e.g., promote Member to Admin)
///
public void UpdateRole(TenantRole newRole, Guid updatedByUserId)
{
if (Role == newRole)
return;
Role = newRole;
AssignedByUserId = updatedByUserId;
// Note: AssignedAt is NOT updated to preserve original assignment timestamp
}
///
/// Check if user has permission (extensible for future fine-grained permissions)
///
public bool HasPermission(string permission)
{
// Future implementation: Check permission against role-permission mapping
// For now, this is a placeholder for fine-grained permission checks
return Role switch
{
TenantRole.TenantOwner => true, // Owner has all permissions
TenantRole.AIAgent when permission.StartsWith("read") => true,
TenantRole.AIAgent when permission.StartsWith("write_preview") => true,
_ => false // Implement specific permission checks as needed
};
}
}