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;