diff --git a/src/Turnierplan.App/Client/src/app/i18n/de.ts b/src/Turnierplan.App/Client/src/app/i18n/de.ts index dc3e0e6d..9bebfc81 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', @@ -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 })) ); } } 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;