From 3c6eeb5fe5aad0d880e8436852b8c36ba32fdbdd Mon Sep 17 00:00:00 2001 From: "Tizian.Breuch" Date: Thu, 4 Dec 2025 15:31:03 +0100 Subject: [PATCH] categorie image fix --- .../Services/Admin/AdminCategorieService.cs | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/Webshop.Application/Services/Admin/AdminCategorieService.cs b/Webshop.Application/Services/Admin/AdminCategorieService.cs index 6df6602..507177b 100644 --- a/Webshop.Application/Services/Admin/AdminCategorieService.cs +++ b/Webshop.Application/Services/Admin/AdminCategorieService.cs @@ -47,7 +47,9 @@ namespace Webshop.Application.Services.Admin } string? imageUrl = null; - if (categorieDto.ImageFile != null) + + // FIX: Prüfung auf Length > 0 hinzugefügt, wie im ProductService + if (categorieDto.ImageFile != null && categorieDto.ImageFile.Length > 0) { await using var stream = categorieDto.ImageFile.OpenReadStream(); imageUrl = await _fileStorageService.SaveFileAsync(stream, categorieDto.ImageFile.FileName, categorieDto.ImageFile.ContentType); @@ -84,23 +86,41 @@ namespace Webshop.Application.Services.Admin return ServiceResult.Fail(ServiceResultType.Conflict, "Eine andere Kategorie mit diesem Slug existiert bereits."); } - string? imageUrl = existing.ImageUrl; - if (categorieDto.ImageFile != null) + // ----------------------------------------------------------------------- + // BILD UPDATE LOGIK (Verbessert) + // ----------------------------------------------------------------------- + + // 1. Neues Bild hochladen, falls vorhanden + if (categorieDto.ImageFile != null && categorieDto.ImageFile.Length > 0) { await using var stream = categorieDto.ImageFile.OpenReadStream(); - imageUrl = await _fileStorageService.SaveFileAsync(stream, categorieDto.ImageFile.FileName, categorieDto.ImageFile.ContentType); - } - else if (string.IsNullOrEmpty(categorieDto.ImageUrl) && !string.IsNullOrEmpty(existing.ImageUrl)) - { - // Hier könnte Logik zum Löschen der alten Datei stehen, falls gewünscht - imageUrl = null; - } + var newUrl = await _fileStorageService.SaveFileAsync(stream, categorieDto.ImageFile.FileName, categorieDto.ImageFile.ContentType); + // Bestehendes Bild überschreiben + existing.ImageUrl = newUrl; + } + // 2. Optional: Logik zum Löschen des Bildes + // ACHTUNG: Die vorherige Logik hat das Bild oft versehentlich gelöscht, wenn das DTO + // das Feld 'ImageUrl' leer hatte (was bei Datei-Uploads oft passiert). + // Wir löschen nur, wenn KEIN neues File da ist UND explizit ein leerer String übergeben wurde, + // aber wir müssen vorsichtig sein, dass null (nicht gesendet) das Bild nicht löscht. + // Im Zweifel: Wenn du das Bild löschen willst, bräuchtest du ein explizites Flag (z.B. bool DeleteImage). + // Hier belassen wir es dabei: Wenn kein neues Bild kommt, bleibt das alte erhalten. + + // Falls du explizit Löschen unterstützen willst, wenn ImageUrl leer ist, nutze dies mit Vorsicht: + /* + else if (categorieDto.ImageUrl != null && string.IsNullOrEmpty(categorieDto.ImageUrl)) + { + // Nur löschen, wenn ImageUrl explizit als leerer String (nicht null) gesendet wurde + existing.ImageUrl = null; + } + */ + + // Mapping der restlichen Felder existing.Name = categorieDto.Name; existing.Slug = categorieDto.Slug; existing.Description = categorieDto.Description; existing.ParentcategorieId = categorieDto.ParentcategorieId; - existing.ImageUrl = imageUrl; existing.IsActive = categorieDto.IsActive; existing.DisplayOrder = categorieDto.DisplayOrder; existing.LastModifiedDate = DateTimeOffset.UtcNow; @@ -124,8 +144,6 @@ namespace Webshop.Application.Services.Admin return ServiceResult.Fail(ServiceResultType.Conflict, "Kategorie kann nicht gelöscht werden, da sie als übergeordnete Kategorie für andere Kategorien dient."); } - // Hier könnte man auch prüfen, ob Produkte dieser Kategorie zugeordnet sind. - await _categorieRepository.DeleteAsync(id); return ServiceResult.Ok(); }