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)); } }