From ee21d0573d4957f559a721d0f850ceb601b10acc Mon Sep 17 00:00:00 2001 From: "Tizian.Breuch" Date: Thu, 25 Sep 2025 17:03:28 +0200 Subject: [PATCH] fix? --- .../Services/Admin/AdminProductService.cs | 165 ++++-------------- 1 file changed, 34 insertions(+), 131 deletions(-) diff --git a/Webshop.Application/Services/Admin/AdminProductService.cs b/Webshop.Application/Services/Admin/AdminProductService.cs index 24cd0b3..c8275bf 100644 --- a/Webshop.Application/Services/Admin/AdminProductService.cs +++ b/Webshop.Application/Services/Admin/AdminProductService.cs @@ -17,7 +17,7 @@ namespace Webshop.Application.Services.Admin { private readonly IProductRepository _productRepository; private readonly IFileStorageService _fileStorageService; - private readonly ApplicationDbContext _context; // For checks that might not be in the repository + private readonly ApplicationDbContext _context; public AdminProductService( IProductRepository productRepository, @@ -29,32 +29,22 @@ namespace Webshop.Application.Services.Admin _context = context; } + // ... (GetAllAdminProductsAsync und GetAdminProductByIdAsync bleiben unverändert) ... + #region Unchanged Methods public async Task>> GetAllAdminProductsAsync() { - var products = await _context.Products - .Include(p => p.Productcategories) - .Include(p => p.Images) - .OrderBy(p => p.Name) - .ToListAsync(); - + var products = await _context.Products.Include(p => p.Productcategories).Include(p => p.Images).OrderBy(p => p.Name).ToListAsync(); var dtos = products.Select(MapToAdminDto).ToList(); return ServiceResult.Ok>(dtos); } public async Task> GetAdminProductByIdAsync(Guid id) { - var product = await _context.Products - .Include(p => p.Productcategories) - .Include(p => p.Images) - .FirstOrDefaultAsync(p => p.Id == id); - - if (product == null) - { - return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{id}' nicht gefunden."); - } - + var product = await _context.Products.Include(p => p.Productcategories).Include(p => p.Images).FirstOrDefaultAsync(p => p.Id == id); + if (product == null) { return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{id}' nicht gefunden."); } return ServiceResult.Ok(MapToAdminDto(product)); } + #endregion public async Task> CreateAdminProductAsync(CreateAdminProductDto productDto) { @@ -70,21 +60,27 @@ namespace Webshop.Application.Services.Admin } var images = new List(); - // Bild-Upload Logik... - if (productDto.MainImageFile != null) + + // << KORREKTUR: Null-Prüfung für das Hauptbild >> + if (productDto.MainImageFile != null && productDto.MainImageFile.Length > 0) { await using var stream = productDto.MainImageFile.OpenReadStream(); var url = await _fileStorageService.SaveFileAsync(stream, productDto.MainImageFile.FileName, productDto.MainImageFile.ContentType); images.Add(new ProductImage { Url = url, IsMainImage = true, DisplayOrder = 1 }); } + + // << KORREKTUR: Null-Prüfung für zusätzliche Bilder >> if (productDto.AdditionalImageFiles != null) { int order = 2; foreach (var file in productDto.AdditionalImageFiles) { - await using var stream = file.OpenReadStream(); - var url = await _fileStorageService.SaveFileAsync(stream, file.FileName, file.ContentType); - images.Add(new ProductImage { Url = url, IsMainImage = false, DisplayOrder = order++ }); + if (file != null && file.Length > 0) + { + await using var stream = file.OpenReadStream(); + var url = await _fileStorageService.SaveFileAsync(stream, file.FileName, file.ContentType); + images.Add(new ProductImage { Url = url, IsMainImage = false, DisplayOrder = order++ }); + } } } @@ -108,131 +104,38 @@ namespace Webshop.Application.Services.Admin }; await _productRepository.AddProductAsync(newProduct); - return ServiceResult.Ok(MapToAdminDto(newProduct)); } + // ... (UpdateAdminProductAsync und DeleteAdminProductAsync und MapToAdminDto bleiben unverändert) ... + #region Unchanged Methods public async Task UpdateAdminProductAsync(UpdateAdminProductDto productDto) { - var existingProduct = await _context.Products - .Include(p => p.Images) - .Include(p => p.Productcategories) - .FirstOrDefaultAsync(p => p.Id == productDto.Id); - - if (existingProduct == null) - { - return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{productDto.Id}' nicht gefunden."); - } - + var existingProduct = await _context.Products.Include(p => p.Images).Include(p => p.Productcategories).FirstOrDefaultAsync(p => p.Id == productDto.Id); + if (existingProduct == null) { return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{productDto.Id}' nicht gefunden."); } var skuExists = await _context.Products.AnyAsync(p => p.SKU == productDto.SKU && p.Id != productDto.Id); - if (skuExists) - { - return ServiceResult.Fail(ServiceResultType.Conflict, $"Ein anderes Produkt mit der SKU '{productDto.SKU}' existiert bereits."); - } + if (skuExists) { return ServiceResult.Fail(ServiceResultType.Conflict, $"Ein anderes Produkt mit der SKU '{productDto.SKU}' existiert bereits."); } var slugExists = await _context.Products.AnyAsync(p => p.Slug == productDto.Slug && p.Id != productDto.Id); - if (slugExists) - { - return ServiceResult.Fail(ServiceResultType.Conflict, $"Ein anderes Produkt mit dem Slug '{productDto.Slug}' existiert bereits."); - } - - // Bild-Management Logik... - if (productDto.ImagesToDelete != null && productDto.ImagesToDelete.Any()) - { - var imagesToRemove = existingProduct.Images.Where(img => productDto.ImagesToDelete.Contains(img.Id)).ToList(); - _context.ProductImages.RemoveRange(imagesToRemove); - } - if (productDto.MainImageFile != null) - { - var existingMainImage = existingProduct.Images.FirstOrDefault(img => img.IsMainImage); - if (existingMainImage != null) _context.ProductImages.Remove(existingMainImage); - - await using var stream = productDto.MainImageFile.OpenReadStream(); - var url = await _fileStorageService.SaveFileAsync(stream, productDto.MainImageFile.FileName, productDto.MainImageFile.ContentType); - existingProduct.Images.Add(new ProductImage { Url = url, IsMainImage = true, DisplayOrder = 1 }); - } - if (productDto.AdditionalImageFiles != null && productDto.AdditionalImageFiles.Any()) - { - int displayOrder = (existingProduct.Images.Any() ? existingProduct.Images.Max(i => i.DisplayOrder) : 0) + 1; - foreach (var file in productDto.AdditionalImageFiles) - { - await using var stream = file.OpenReadStream(); - var url = await _fileStorageService.SaveFileAsync(stream, file.FileName, file.ContentType); - existingProduct.Images.Add(new ProductImage { Url = url, IsMainImage = false, DisplayOrder = displayOrder++ }); - } - } - - // Basisdaten aktualisieren... - existingProduct.Name = productDto.Name; - existingProduct.Description = productDto.Description; - existingProduct.SKU = productDto.SKU; - existingProduct.Price = productDto.Price; - existingProduct.IsActive = productDto.IsActive; - existingProduct.StockQuantity = productDto.StockQuantity; - existingProduct.Slug = productDto.Slug; - existingProduct.Weight = productDto.Weight; - existingProduct.OldPrice = productDto.OldPrice; - existingProduct.SupplierId = productDto.SupplierId; - existingProduct.PurchasePrice = productDto.PurchasePrice; - existingProduct.LastModifiedDate = DateTimeOffset.UtcNow; - existingProduct.IsFeatured = productDto.IsFeatured; - existingProduct.FeaturedDisplayOrder = productDto.FeaturedDisplayOrder; - - // Kategorien synchronisieren - existingProduct.Productcategories.Clear(); - if (productDto.CategorieIds != null) - { - foreach (var categorieId in productDto.CategorieIds) - { - existingProduct.Productcategories.Add(new Productcategorie { categorieId = categorieId }); - } - } - - await _productRepository.UpdateProductAsync(existingProduct); - return ServiceResult.Ok(); + if (slugExists) { return ServiceResult.Fail(ServiceResultType.Conflict, $"Ein anderes Produkt mit dem Slug '{productDto.Slug}' existiert bereits."); } + if (productDto.ImagesToDelete != null && productDto.ImagesToDelete.Any()) { var imagesToRemove = existingProduct.Images.Where(img => productDto.ImagesToDelete.Contains(img.Id)).ToList(); _context.ProductImages.RemoveRange(imagesToRemove); } + if (productDto.MainImageFile != null) { var existingMainImage = existingProduct.Images.FirstOrDefault(img => img.IsMainImage); if (existingMainImage != null) _context.ProductImages.Remove(existingMainImage); await using var stream = productDto.MainImageFile.OpenReadStream(); var url = await _fileStorageService.SaveFileAsync(stream, productDto.MainImageFile.FileName, productDto.MainImageFile.ContentType); existingProduct.Images.Add(new ProductImage { Url = url, IsMainImage = true, DisplayOrder = 1 }); } + if (productDto.AdditionalImageFiles != null && productDto.AdditionalImageFiles.Any()) { int displayOrder = (existingProduct.Images.Any() ? existingProduct.Images.Max(i => i.DisplayOrder) : 0) + 1; foreach (var file in productDto.AdditionalImageFiles) { await using var stream = file.OpenReadStream(); var url = await _fileStorageService.SaveFileAsync(stream, file.FileName, file.ContentType); existingProduct.Images.Add(new ProductImage { Url = url, IsMainImage = false, DisplayOrder = displayOrder++ }); } } + existingProduct.Name = productDto.Name; existingProduct.Description = productDto.Description; existingProduct.SKU = productDto.SKU; existingProduct.Price = productDto.Price; existingProduct.IsActive = productDto.IsActive; existingProduct.StockQuantity = productDto.StockQuantity; existingProduct.Slug = productDto.Slug; existingProduct.Weight = productDto.Weight; existingProduct.OldPrice = productDto.OldPrice; existingProduct.SupplierId = productDto.SupplierId; existingProduct.PurchasePrice = productDto.PurchasePrice; existingProduct.LastModifiedDate = DateTimeOffset.UtcNow; existingProduct.IsFeatured = productDto.IsFeatured; existingProduct.FeaturedDisplayOrder = productDto.FeaturedDisplayOrder; + existingProduct.Productcategories.Clear(); if (productDto.CategorieIds != null) { foreach (var categorieId in productDto.CategorieIds) { existingProduct.Productcategories.Add(new Productcategorie { categorieId = categorieId }); } } + await _productRepository.UpdateProductAsync(existingProduct); return ServiceResult.Ok(); } public async Task DeleteAdminProductAsync(Guid id) { var product = await _productRepository.GetProductByIdAsync(id); - if (product == null) - { - return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{id}' nicht gefunden."); - } - - await _productRepository.DeleteProductAsync(id); - return ServiceResult.Ok(); + if (product == null) { return ServiceResult.Fail(ServiceResultType.NotFound, $"Produkt mit ID '{id}' nicht gefunden."); } + await _productRepository.DeleteProductAsync(id); return ServiceResult.Ok(); } private AdminProductDto MapToAdminDto(Product product) { - return new AdminProductDto - { - Id = product.Id, - Name = product.Name, - Description = product.Description, - SKU = product.SKU, - Price = product.Price, - OldPrice = product.OldPrice, - IsActive = product.IsActive, - IsInStock = product.IsInStock, - StockQuantity = product.StockQuantity, - Weight = product.Weight, - Slug = product.Slug, - CreatedDate = product.CreatedDate, - LastModifiedDate = product.LastModifiedDate, - SupplierId = product.SupplierId, - PurchasePrice = product.PurchasePrice, - IsFeatured = product.IsFeatured, - FeaturedDisplayOrder = product.FeaturedDisplayOrder, - categorieIds = product.Productcategories.Select(pc => pc.categorieId).ToList(), - Images = product.Images.OrderBy(i => i.DisplayOrder).Select(img => new ProductImageDto - { - Id = img.Id, - Url = img.Url, - IsMainImage = img.IsMainImage, - DisplayOrder = img.DisplayOrder - }).ToList() - }; + return new AdminProductDto { Id = product.Id, Name = product.Name, Description = product.Description, SKU = product.SKU, Price = product.Price, OldPrice = product.OldPrice, IsActive = product.IsActive, IsInStock = product.IsInStock, StockQuantity = product.StockQuantity, Weight = product.Weight, Slug = product.Slug, CreatedDate = product.CreatedDate, LastModifiedDate = product.LastModifiedDate, SupplierId = product.SupplierId, PurchasePrice = product.PurchasePrice, IsFeatured = product.IsFeatured, FeaturedDisplayOrder = product.FeaturedDisplayOrder, categorieIds = product.Productcategories.Select(pc => pc.categorieId).ToList(), Images = product.Images.OrderBy(i => i.DisplayOrder).Select(img => new ProductImageDto { Id = img.Id, Url = img.Url, IsMainImage = img.IsMainImage, DisplayOrder = img.DisplayOrder }).ToList() }; } + #endregion } } \ No newline at end of file