diff --git a/Webshop.Api/Controllers/Public/ReviewsController.cs b/Webshop.Api/Controllers/Public/ReviewsController.cs index 71db101..9c632e9 100644 --- a/Webshop.Api/Controllers/Public/ReviewsController.cs +++ b/Webshop.Api/Controllers/Public/ReviewsController.cs @@ -1,10 +1,11 @@ // src/Webshop.Api/Controllers/Public/ReviewsController.cs using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Threading.Tasks; -using Webshop.Application.DTOs.Products; // Für ProductDto +using Webshop.Application; using Webshop.Application.DTOs.Reviews; using Webshop.Application.Services.Public; @@ -23,10 +24,18 @@ namespace Webshop.Api.Controllers.Public } [HttpGet] - public async Task>> GetApprovedReviews(Guid productId) + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] + public async Task GetApprovedReviews(Guid productId) { - var reviews = await _reviewService.GetApprovedReviewsByProductIdAsync(productId); - return Ok(reviews); + var result = await _reviewService.GetApprovedReviewsByProductIdAsync(productId); + + return result.Type switch + { + ServiceResultType.Success => Ok(result.Value), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + _ => StatusCode(StatusCodes.Status500InternalServerError, "Ein unerwarteter Fehler ist aufgetreten.") + }; } } } \ No newline at end of file diff --git a/Webshop.Application/Services/Public/Interfaces/IReviewService.cs b/Webshop.Application/Services/Public/Interfaces/IReviewService.cs index fa58ecb..658ced3 100644 --- a/Webshop.Application/Services/Public/Interfaces/IReviewService.cs +++ b/Webshop.Application/Services/Public/Interfaces/IReviewService.cs @@ -2,12 +2,13 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Webshop.Application; using Webshop.Application.DTOs.Reviews; namespace Webshop.Application.Services.Public { public interface IReviewService { - Task> GetApprovedReviewsByProductIdAsync(Guid productId); + Task>> GetApprovedReviewsByProductIdAsync(Guid productId); } } \ No newline at end of file diff --git a/Webshop.Application/Services/Public/ReviewService.cs b/Webshop.Application/Services/Public/ReviewService.cs index 7c32ae0..c46474b 100644 --- a/Webshop.Application/Services/Public/ReviewService.cs +++ b/Webshop.Application/Services/Public/ReviewService.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Webshop.Application; using Webshop.Application.DTOs.Reviews; using Webshop.Domain.Interfaces; @@ -11,24 +12,36 @@ namespace Webshop.Application.Services.Public public class ReviewService : IReviewService { private readonly IReviewRepository _reviewRepository; + private readonly IProductRepository _productRepository; - public ReviewService(IReviewRepository reviewRepository) + public ReviewService(IReviewRepository reviewRepository, IProductRepository productRepository) { _reviewRepository = reviewRepository; + _productRepository = productRepository; } - public async Task> GetApprovedReviewsByProductIdAsync(Guid productId) + public async Task>> GetApprovedReviewsByProductIdAsync(Guid productId) { - var reviews = await _reviewRepository.GetApprovedByProductIdAsync(productId); - return reviews.Select(r => new ReviewDto + // Prüfung: Existiert das Produkt und ist es für die Öffentlichkeit sichtbar? + var product = await _productRepository.GetProductByIdAsync(productId); + if (product == null || !product.IsActive) { - // Mapping zu DTO, CustomerName wird für Anonymität oft gekürzt - CustomerName = $"{r.Customer?.FirstName} {r.Customer?.LastName?.FirstOrDefault()}.", + return ServiceResult.Fail>(ServiceResultType.NotFound, $"Produkt mit ID '{productId}' wurde nicht gefunden oder ist nicht aktiv."); + } + + var reviews = await _reviewRepository.GetApprovedByProductIdAsync(productId); + + var dtos = reviews.Select(r => new ReviewDto + { + // Anonymisiertes Mapping für die öffentliche Ansicht + CustomerName = (r.Customer != null) ? $"{r.Customer.FirstName} {r.Customer.LastName?.FirstOrDefault()}." : "Anonym", Rating = r.Rating, Title = r.Title, Comment = r.Comment, ReviewDate = r.ReviewDate - }); + }).ToList(); + + return ServiceResult.Ok>(dtos); } } } \ No newline at end of file