using System.ComponentModel;
using System.Runtime.CompilerServices;
using Microsoft.Extensions.Logging;
using OrpaonVision.Core.Results;
using OrpaonVision.Model.Security;
using OrpaonVision.ConfigApp.Infrastructure.Services;
namespace OrpaonVision.ConfigApp.Infrastructure.Services;
///
/// 当前用户上下文服务。
///
public sealed class CurrentUserContext : INotifyPropertyChanged
{
private readonly ILogger _logger;
private readonly IAuthorizationService _authorizationService;
private UserModel? _currentUser;
private List _userPermissions = new();
private List _userRoles = new();
///
/// 构造函数。
///
public CurrentUserContext(
ILogger logger,
IAuthorizationService authorizationService)
{
_logger = logger;
_authorizationService = authorizationService;
}
///
/// 当前登录用户。
///
public UserModel? CurrentUser
{
get => _currentUser;
private set
{
if (_currentUser != value)
{
_currentUser = value;
OnPropertyChanged();
OnPropertyChanged(nameof(IsAuthenticated));
OnPropertyChanged(nameof(CurrentUserId));
OnPropertyChanged(nameof(CurrentUserName));
// 用户变更时重新加载权限
_ = Task.Run(LoadUserPermissions);
}
}
}
///
/// 是否已认证。
///
public bool IsAuthenticated => CurrentUser != null;
///
/// 当前用户ID。
///
public Guid CurrentUserId => CurrentUser?.Id ?? Guid.Empty;
///
/// 当前用户名。
///
public string CurrentUserName => CurrentUser?.Username ?? string.Empty;
///
/// 用户权限列表。
///
public IReadOnlyList UserPermissions => _userPermissions.AsReadOnly();
///
/// 用户角色列表。
///
public IReadOnlyList UserRoles => _userRoles.AsReadOnly();
///
/// 设置当前用户。
///
public async Task SetCurrentUserAsync(UserModel user)
{
try
{
_logger.LogInformation("设置当前用户: {Username}", user.Username);
CurrentUser = user;
// 等待权限加载完成
await LoadUserPermissions();
return Result.Success();
}
catch (Exception ex)
{
_logger.LogError(ex, "设置当前用户失败: {Username}", user.Username);
return Result.Fail("SET_USER_FAILED", $"设置当前用户失败: {ex.Message}");
}
}
///
/// 清除当前用户。
///
public void ClearCurrentUser()
{
_logger.LogInformation("清除当前用户");
CurrentUser = null;
_userPermissions.Clear();
_userRoles.Clear();
}
///
/// 检查用户是否拥有指定权限。
///
public bool HasPermission(string permissionCode)
{
if (!IsAuthenticated || string.IsNullOrEmpty(permissionCode))
return false;
return _userPermissions.Any(p => p.Code.Equals(permissionCode, StringComparison.OrdinalIgnoreCase));
}
///
/// 检查用户是否拥有指定角色。
///
public bool HasRole(string roleName)
{
if (!IsAuthenticated || string.IsNullOrEmpty(roleName))
return false;
return _userRoles.Any(r => r.Name.Equals(roleName, StringComparison.OrdinalIgnoreCase));
}
///
/// 批量检查权限。
///
public Dictionary CheckPermissions(IEnumerable permissionCodes)
{
var result = new Dictionary();
foreach (var code in permissionCodes)
{
result[code] = HasPermission(code);
}
return result;
}
///
/// 刷新用户权限。
///
public async Task RefreshPermissionsAsync()
{
try
{
if (!IsAuthenticated)
return Result.Success();
_logger.LogInformation("刷新用户权限: {Username}", CurrentUser!.Username);
await LoadUserPermissions();
return Result.Success();
}
catch (Exception ex)
{
_logger.LogError(ex, "刷新用户权限失败: {Username}", CurrentUser?.Username);
return Result.Fail("REFRESH_PERMISSIONS_FAILED", $"刷新用户权限失败: {ex.Message}");
}
}
private async Task LoadUserPermissions()
{
try
{
if (!IsAuthenticated)
{
_userPermissions.Clear();
_userRoles.Clear();
return;
}
// 获取用户权限
var permissionsResult = _authorizationService.GetUserPermissions(CurrentUserId);
if (permissionsResult.Succeeded)
{
_userPermissions = permissionsResult.Data?.ToList() ?? new List();
}
else
{
_logger.LogWarning("获取用户权限失败: {Code} - {Message}", permissionsResult.Code, permissionsResult.Message);
_userPermissions = new List();
}
// 获取用户角色
var rolesResult = _authorizationService.GetUserRoles(CurrentUserId);
if (rolesResult.Succeeded)
{
_userRoles = rolesResult.Data?.ToList() ?? new List();
}
else
{
_logger.LogWarning("获取用户角色失败: {Code} - {Message}", rolesResult.Code, rolesResult.Message);
_userRoles = new List();
}
// 通知权限变更
OnPropertyChanged(nameof(UserPermissions));
OnPropertyChanged(nameof(UserRoles));
}
catch (Exception ex)
{
_logger.LogError(ex, "加载用户权限失败: {Username}", CurrentUser?.Username);
_userPermissions = new List();
_userRoles = new List();
}
}
///
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}