From d559c81d3cda31d65cca60e0d94eab1026bef5b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sun, 29 Jun 2025 10:37:48 +0200 Subject: [PATCH 1/3] Update DeleteUserEndpoint.cs --- .../Endpoints/Users/DeleteUserEndpoint.cs | 7 ++-- src/Turnierplan.App/Helpers/DeletionHelper.cs | 32 ------------------- 2 files changed, 2 insertions(+), 37 deletions(-) diff --git a/src/Turnierplan.App/Endpoints/Users/DeleteUserEndpoint.cs b/src/Turnierplan.App/Endpoints/Users/DeleteUserEndpoint.cs index 2110b097..7a908dee 100644 --- a/src/Turnierplan.App/Endpoints/Users/DeleteUserEndpoint.cs +++ b/src/Turnierplan.App/Endpoints/Users/DeleteUserEndpoint.cs @@ -34,12 +34,9 @@ private static async Task Handle( return Results.NotFound(); } - var result = await deletionHelper.DeleteUserAsync(user, cancellationToken).ConfigureAwait(false); + repository.Remove(user); - if (!result) - { - return Results.InternalServerError("The deletion of the user failed. Please check the application logs for details."); - } + await repository.UnitOfWork.SaveChangesAsync(cancellationToken).ConfigureAwait(false); return Results.NoContent(); } diff --git a/src/Turnierplan.App/Helpers/DeletionHelper.cs b/src/Turnierplan.App/Helpers/DeletionHelper.cs index d1c1b1b4..61215867 100644 --- a/src/Turnierplan.App/Helpers/DeletionHelper.cs +++ b/src/Turnierplan.App/Helpers/DeletionHelper.cs @@ -1,7 +1,6 @@ using Turnierplan.Core.Image; using Turnierplan.Core.Organization; using Turnierplan.Core.Tournament; -using Turnierplan.Core.User; using Turnierplan.Core.Venue; using Turnierplan.ImageStorage; @@ -9,14 +8,11 @@ namespace Turnierplan.App.Helpers; internal interface IDeletionHelper { - Task DeleteUserAsync(User user, CancellationToken cancellationToken); - Task DeleteOrganizationAsync(Organization organization, CancellationToken cancellationToken); } internal sealed class DeletionHelper : IDeletionHelper { - private readonly IUserRepository _userRepository; private readonly IOrganizationRepository _organizationRepository; private readonly ITournamentRepository _tournamentRepository; private readonly IVenueRepository _venueRepository; @@ -25,7 +21,6 @@ internal sealed class DeletionHelper : IDeletionHelper private readonly ILogger _logger; public DeletionHelper( - IUserRepository userRepository, IOrganizationRepository organizationRepository, ITournamentRepository tournamentRepository, IVenueRepository venueRepository, @@ -33,7 +28,6 @@ public DeletionHelper( IImageStorage imageStorage, ILogger logger) { - _userRepository = userRepository; _organizationRepository = organizationRepository; _tournamentRepository = tournamentRepository; _venueRepository = venueRepository; @@ -42,32 +36,6 @@ public DeletionHelper( _logger = logger; } - public async Task DeleteUserAsync(User user, CancellationToken cancellationToken) - { - // TODO: Decide how to handle this (there is no longer a 1-n relation between user and organisation) - // When this is decided: Update the information text on the "delete user" screen in the frontend - - // foreach (var organization in user.Organizations.ToList()) // ToList() to avoid invalid operation exception - // { - // cancellationToken.ThrowIfCancellationRequested(); - // - // var result = await DeleteOrganizationAsync(organization, cancellationToken).ConfigureAwait(false); - // - // if (!result) - // { - // return false; - // } - // } - - cancellationToken.ThrowIfCancellationRequested(); - - _userRepository.Remove(user); - - await _userRepository.UnitOfWork.SaveChangesAsync(cancellationToken).ConfigureAwait(false); - - return true; - } - public async Task DeleteOrganizationAsync(Organization organization, CancellationToken cancellationToken) { var hasNonDeletedImages = false; From 93f27fe6f6851c7add6e8b71e253be1159ab8475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sun, 29 Jun 2025 10:43:02 +0200 Subject: [PATCH 2/3] Update text --- src/Turnierplan.App/Client/src/app/i18n/de.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Turnierplan.App/Client/src/app/i18n/de.ts b/src/Turnierplan.App/Client/src/app/i18n/de.ts index dc3e0e6d..11fa519a 100644 --- a/src/Turnierplan.App/Client/src/app/i18n/de.ts +++ b/src/Turnierplan.App/Client/src/app/i18n/de.ts @@ -122,7 +122,7 @@ export const de = { }, DeleteUser: { Title: 'Benutzer löschen', - Info: 'Wenn Sie eine Benutzer löschen, werden automatisch alle darin enthaltenen Organisationen, Turniere, Spielstätten sämtliche hochgeladenen Bilder mitgelöscht. Diese Aktion kann nicht widerrufen werden!', + Info: 'Wenn Sie eine Benutzer löschen, werden die Organisationen des Benutzers nicht mitgelöscht und bleiben weiterhin für alle Administratoren sichtbar.', IdConfirmation: 'Benutzer-ID:', SuccessToast: { Title: 'Benutzer wurde gelöscht', From 386dd621480a57e420ff7d35a2a4a316af31e26d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20H=C3=B6rner?= Date: Sun, 29 Jun 2025 10:47:44 +0200 Subject: [PATCH 3/3] Improve UI --- src/Turnierplan.App/Client/src/app/i18n/de.ts | 1 + .../rbac-principal/rbac-principal.component.html | 10 +++++++++- .../rbac-principal/rbac-principal.component.ts | 6 +++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Turnierplan.App/Client/src/app/i18n/de.ts b/src/Turnierplan.App/Client/src/app/i18n/de.ts index 11fa519a..9bebfc81 100644 --- a/src/Turnierplan.App/Client/src/app/i18n/de.ts +++ b/src/Turnierplan.App/Client/src/app/i18n/de.ts @@ -941,6 +941,7 @@ export const de = { ApiKey: 'API-Schlüssel', User: 'Benutzer' }, + PrincipalNotFound: 'Der Prinzipal konnte nicht mehr gefunden werden. Wurde der Nutzer/API-Schlüssel gelöscht?', TotalCount: 'Gesamt:', Id: 'ID:', CreatedAt: 'Erstellt am:', diff --git a/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.html b/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.html index 6696266a..b76bf3fc 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.html +++ b/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.html @@ -1,3 +1,6 @@ +@let displayName = displayName$ | async; +@let notFound = displayName?.found === false; + @switch (principal.kind) { @case (PrincipalKind.ApiKey) { @@ -6,4 +9,9 @@ } } -{{ displayName$ | async }} + +@if (notFound) { + +} + +{{ displayName?.value }} diff --git a/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.ts b/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.ts index 4cdba553..f54b85fa 100644 --- a/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.ts +++ b/src/Turnierplan.App/Client/src/app/portal/components/rbac-principal/rbac-principal.component.ts @@ -12,7 +12,7 @@ import { map } from 'rxjs/operators'; export class RbacPrincipalComponent implements OnInit { protected readonly PrincipalKind = PrincipalKind; - protected displayName$?: Observable; + protected displayName$?: Observable<{ found: boolean; value: string | undefined }>; @Input() public principal!: PrincipalDto; @@ -26,8 +26,8 @@ export class RbacPrincipalComponent implements OnInit { principalId: this.principal.principalId }) .pipe( - map((result) => result.name), - catchError(() => of(this.principal.principalId)) + map((result) => ({ found: true, value: result.name })), + catchError(() => of({ found: false, value: this.principal.principalId })) ); } }