@page "/user-management" @attribute [Authorize(Roles = "Administrator")] @inject IAuthService AuthService @inject IEmailService EmailService @inject ILocalizationService Loc @inject NavigationManager Navigation @rendermode InteractiveServer @Loc["usermanagement.title"] - Author Buddy

@Loc["usermanagement.title"]

@foreach (var u in users) { }
Name E-Mail Rolle Status Aktionen
@u.Name @(u.Id == currentUserId ? "(Du)" : "") @(!string.IsNullOrEmpty(u.Email) ? u.Email : "—") @string.Join(", ", u.Roles.Select(RoleName)) @if (u.IsActive) { Aktiv } else { Inaktiv } @if (!string.IsNullOrEmpty(u.Email) && EmailService.IsConfigured) { } @if (u.Id != currentUserId) { @if (u.IsActive) { } else { } }
@if (!string.IsNullOrEmpty(statusMessage)) {
@statusMessage
}
@* Create User Dialog *@ @if (showCreateDialog) { } @* Edit User Dialog *@ @if (showEditDialog && _editUser != null) { } @* Delete Confirmation Dialog *@ @if (showDeleteDialog && _deleteUser != null) { } @code { private List users = new(); private int currentUserId; private string statusMessage = string.Empty; private bool showCreateDialog; private string _newUsername = string.Empty; private string _newEmail = string.Empty; private List _newRoles = new() { "Author" }; private string _newPassword = string.Empty; private string? _generatedPassword; private bool showEditDialog; private UserEntity? _editUser; private string _editEmail = string.Empty; private List _editRoles = new(); private bool showDeleteDialog; private UserEntity? _deleteUser; private static (string role, string label)[] UmRoleOptions => new[] { ("Author", "Autor"), ("Blogger", "Blogger"), ("Chat", "Chat"), ("Administrator", "Administrator") }; private string RoleName(UserRole role) => role switch { UserRole.Administrator => "Administrator", UserRole.Blogger => "Blogger", UserRole.Chat => "Chat", _ => "Autor" }; protected override async Task OnInitializedAsync() { await LoadUsers(); } private async Task LoadUsers() { users = await AuthService.GetAllUsersAsync(); currentUserId = AuthService.CurrentUser?.Id ?? 0; } private async Task ActivateUser(int userId) { var ok = await AuthService.SetUserActiveAsync(userId, true); statusMessage = ok ? "Benutzer aktiviert." : "Fehler"; await LoadUsers(); } private async Task DeactivateUser(int userId) { var ok = await AuthService.SetUserActiveAsync(userId, false); statusMessage = ok ? "Benutzer deaktiviert." : "Fehler"; await LoadUsers(); } private void ShowCreateDialog() { _newUsername = string.Empty; _newEmail = string.Empty; _newRoles = new List { "Author" }; _newPassword = string.Empty; _generatedPassword = null; showCreateDialog = true; } private void CancelCreate() { showCreateDialog = false; } private void ToggleNewRole(string role) { if (_newRoles.Contains(role)) _newRoles.Remove(role); else _newRoles.Add(role); } private void ToggleEditRole(string role) { if (_editRoles.Contains(role)) _editRoles.Remove(role); else _editRoles.Add(role); } private void GeneratePassword() { using var rng = System.Security.Cryptography.RandomNumberGenerator.Create(); var bytes = new byte[10]; rng.GetBytes(bytes); _generatedPassword = Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', 'X').Replace('/', 'Y'); _newPassword = _generatedPassword; } private async Task CreateUser() { if (string.IsNullOrWhiteSpace(_newUsername) || string.IsNullOrWhiteSpace(_newPassword)) return; if (_newRoles.Count == 0) { statusMessage = "Mindestens eine Rolle erforderlich."; return; } var roles = _newRoles.Select(r => r switch { "Administrator" => UserRole.Administrator, "Blogger" => UserRole.Blogger, "Chat" => UserRole.Chat, _ => UserRole.Author }).Distinct().ToList(); var ok = await AuthService.CreateUserAsync(_newUsername.Trim(), _newPassword, _newEmail.Trim(), roles); statusMessage = ok ? $"Benutzer '{_newUsername}' angelegt." : "Benutzername bereits vergeben oder maximal ein Admin erlaubt."; showCreateDialog = false; await LoadUsers(); } private void BeginEdit(UserEntity user) { _editUser = user; _editEmail = user.Email; _editRoles = user.Roles.Select(r => r.ToString()).ToList(); showEditDialog = true; } private void CancelEdit() { showEditDialog = false; _editUser = null; } private async Task SaveEdit() { if (_editUser == null) return; if (_editRoles.Count == 0) { statusMessage = "Mindestens eine Rolle erforderlich."; return; } var roles = _editRoles.Select(r => r switch { "Administrator" => UserRole.Administrator, "Blogger" => UserRole.Blogger, "Chat" => UserRole.Chat, _ => UserRole.Author }).Distinct().ToList(); string? email = _editEmail?.Trim(); if (string.IsNullOrEmpty(email)) email = null; var ok = await AuthService.UpdateUserAsync(_editUser.Id, email, roles); statusMessage = ok ? "Benutzer aktualisiert." : "Fehler (max. ein Admin erlaubt)."; showEditDialog = false; _editUser = null; await LoadUsers(); } private void BeginDelete(UserEntity user) { _deleteUser = user; showDeleteDialog = true; } private void CancelDelete() { showDeleteDialog = false; _deleteUser = null; } private async Task ConfirmDelete() { if (_deleteUser == null) return; var ok = await AuthService.DeleteUserAsync(_deleteUser.Id); statusMessage = ok ? "Benutzer gelöscht." : "Fehler"; showDeleteDialog = false; _deleteUser = null; await LoadUsers(); } private async Task SendRecovery(UserEntity user) { if (string.IsNullOrEmpty(user.Email)) return; var newPassword = await AuthService.ResetPasswordAsync(user.Id); if (string.IsNullOrEmpty(newPassword)) { statusMessage = "Fehler beim Zurücksetzen des Passworts."; return; } var sent = await EmailService.SendPasswordAsync(user.Email, user.Name, newPassword); statusMessage = sent ? $"Neues Passwort an {user.Email} gesendet." : "E-Mail konnte nicht gesendet werden (SMTP-Konfiguration prüfen)."; } }