From 870930914e3d358e8b0b8de22ca316317dd58aab Mon Sep 17 00:00:00 2001 From: troogs Date: Sun, 26 Apr 2026 10:28:31 +0200 Subject: [PATCH] Enhance user authentication and management: add unverified user check, update error messages, and improve user interface for better usability --- FoodsharingSiegen.Server/Auth/AuthService.cs | 8 +- FoodsharingSiegen.Server/Pages/Login.razor.cs | 2 +- FoodsharingSiegen.Server/Pages/Users.razor | 224 ++++++++++-------- FoodsharingSiegen.Server/Pages/Users.razor.cs | 106 +++++---- 4 files changed, 195 insertions(+), 145 deletions(-) diff --git a/FoodsharingSiegen.Server/Auth/AuthService.cs b/FoodsharingSiegen.Server/Auth/AuthService.cs index 61aab8b..1503d0d 100644 --- a/FoodsharingSiegen.Server/Auth/AuthService.cs +++ b/FoodsharingSiegen.Server/Auth/AuthService.cs @@ -142,6 +142,12 @@ namespace FoodsharingSiegen.Server.Auth if (_user != null) { + if (_user.Type == UserType.Unverified) + { + _user = null; + return new OperationResult(new Exception("Anmeldung nicht möglich.")); + } + var serializedToken = AuthHelper.CreateToken(_user); await _localStorageService.SetItem(StorageKeys.TokenKey, serializedToken); @@ -156,7 +162,7 @@ namespace FoodsharingSiegen.Server.Auth return new OperationResult(); } - return new OperationResult(new Exception("Benutzername oder Passwort falsch")); + return new OperationResult(new Exception("E-Mail-Adresse oder Passwort ist ungültig.")); } #endregion diff --git a/FoodsharingSiegen.Server/Pages/Login.razor.cs b/FoodsharingSiegen.Server/Pages/Login.razor.cs index b920892..a3eb49a 100644 --- a/FoodsharingSiegen.Server/Pages/Login.razor.cs +++ b/FoodsharingSiegen.Server/Pages/Login.razor.cs @@ -62,7 +62,7 @@ namespace FoodsharingSiegen.Server.Pages if (loginR.Success) NavigationManager.NavigateTo("/", true); else - LoginErrorMessage = "E-Mail-Adresse oder Passwort ist ungültig."; + LoginErrorMessage = loginR.ErrorMessage; } #endregion diff --git a/FoodsharingSiegen.Server/Pages/Users.razor b/FoodsharingSiegen.Server/Pages/Users.razor index 96f489b..8cf4923 100644 --- a/FoodsharingSiegen.Server/Pages/Users.razor +++ b/FoodsharingSiegen.Server/Pages/Users.razor @@ -6,111 +6,131 @@ @inherits FoodsharingSiegen.Server.BaseClasses.FsBase -@code { - - private RenderFragment PopupTitleTemplate(PopupTitleContext value) - { - var header = "Benutzer erstellen"; - if (value.EditState == DataGridEditState.Edit) header = "Benutzer bearbeiten"; - - return builder => - { - builder.OpenElement(0, "span"); - builder.AddContent(1, header); - builder.CloseElement(); - }; - } - -} - Benutzerverwaltung - @AppSettings.Terms.Title -

Benutzerverwaltung Admin

- -
- +
+

Benutzerverwaltung Admin

+
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Verfügbar: @string.Join(", ", Enum.GetValues()) - - - @if (string.IsNullOrWhiteSpace(context.Groups)) - { - Keine Gruppen - } - else - { - @string.Join(", ", context.GroupsList) - } - - - - +
+ @if (SortedUsers != null) + { + @foreach (var user in SortedUsers) + { + + + @user.Name + @user.Mail + + Typ: + @if (user.Type == UserType.Unverified) + { + @user.Type + } + else if (user.Type == UserType.Admin) + { + @user.Type + } + else + { + @user.Type + } + + +
+ @if (user.GroupsList != null && user.GroupsList.Any()) + { + @foreach(var group in user.GroupsList) + { + @group.ToString() + } + } + else + { + Keine Gruppen + } +
+
+ +
+ + +
+ +
+
+ } + } +
+ + + + + + + @(IsEditing ? "Benutzer bearbeiten" : "Benutzer erstellen") + + + + @if (EditModel != null) + { + + Name + + + + E-Mail + + + + Typ + + + + Gruppen + + + Verfügbar: @string.Join(", ", Enum.GetValues()) + + } + + + + + + + \ No newline at end of file diff --git a/FoodsharingSiegen.Server/Pages/Users.razor.cs b/FoodsharingSiegen.Server/Pages/Users.razor.cs index 7adf746..80d43b3 100644 --- a/FoodsharingSiegen.Server/Pages/Users.razor.cs +++ b/FoodsharingSiegen.Server/Pages/Users.razor.cs @@ -1,4 +1,4 @@ -using Blazorise.DataGrid; +using Blazorise; using FoodsharingSiegen.Contracts.Entity; using FoodsharingSiegen.Contracts.Enums; using FoodsharingSiegen.Contracts.Helper; @@ -32,19 +32,24 @@ namespace FoodsharingSiegen.Server.Pages private SetPasswordModal? PasswordModal { get; set; } /// - /// Gets or sets the value of the selected company texts (ab) + /// Gets or sets the edit user modal /// - private List SelectedCompanyTexts { get; set; } = new(); + private Modal? editUserModal { get; set; } /// - /// Gets or sets the value of the selected user (ab) + /// Gets or sets the selected group texts /// - private User? SelectedUser { get; set; } + private List SelectedGroupTexts { get; set; } = new(); /// - /// Gets or sets the value of the user data grid (ab) + /// Gets or sets the edit model /// - private DataGrid? UserDataGrid { get; set; } + private User? EditModel { get; set; } + + /// + /// Gets or sets a value indicating whether we are editing an existing user + /// + private bool IsEditing { get; set; } /// /// Gets the value of the user groups (ab) @@ -56,6 +61,11 @@ namespace FoodsharingSiegen.Server.Pages /// private List? UserList { get; set; } + /// + /// Gets the sorted users list + /// + private IEnumerable SortedUsers => UserList?.OrderByDescending(x => x.Type).ThenBy(x => x.Name) ?? Enumerable.Empty(); + #endregion #region Override InitializeDataAsync @@ -84,6 +94,54 @@ namespace FoodsharingSiegen.Server.Pages #endregion + #region Actions + + private void CreateNewUser() + { + EditModel = new User(); + IsEditing = false; + editUserModal?.Show(); + } + + private void EditUser(User user) + { + EditModel = user.Clone(); + IsEditing = true; + editUserModal?.Show(); + } + + private void SetPassword(User user) + { + PasswordModal?.Show(user); + } + + private async Task SaveUser() + { + if (EditModel == null) return; + + if (IsEditing) + { + var updateR = await UserService.Update(EditModel); + if (!updateR.Success) + await Notification.Error($"Fehler beim Speichern: {updateR.ErrorMessage}")!; + else + await Notification.Success("Benutzer aktualisiert"); + } + else + { + var addUserR = await UserService.AddUserAsync(EditModel); + if (!addUserR.Success) + await Notification.Error($"Fehler beim Anlegen: {addUserR.ErrorMessage}")!; + else + await Notification.Success("Benutzer erstellt"); + } + + await editUserModal?.Hide()!; + await LoadUsers(); + } + + #endregion + #region Private Method OnPasswordSet /// @@ -125,39 +183,5 @@ namespace FoodsharingSiegen.Server.Pages } #endregion - - #region Private Method RowInserted - - /// - /// Rows the inserted using the specified arg (a. beging, 01.04.2022) - /// - /// The arg - private async Task RowInserted(SavedRowItem> arg) - { - var addUserR = await UserService.AddUserAsync(arg.OldItem); - if (!addUserR.Success) - await Notification.Error($"Fehler beim Anlegen: {addUserR.ErrorMessage}")!; - else - await LoadUsers(); - } - - #endregion - - #region Private Method RowUpdated - - /// - /// Rows the updated using the specified arg (a. beging, 01.04.2022) - /// - /// The arg - private async Task RowUpdated(SavedRowItem> arg) - { - if (arg.OldItem?.Id == null || arg.OldItem.Id.Equals(Guid.Empty) || arg.Values?.Any() != true) return; - - var updateR = await UserService.Update(arg.OldItem); - if (!updateR.Success) - await Notification.Error($"Fehler beim Speichern: {updateR.ErrorMessage}")!; - } - - #endregion } } \ No newline at end of file