From e43fdc01fe7209c17b1e543974698cc13f77f2e7 Mon Sep 17 00:00:00 2001 From: "Tizian.Breuch" Date: Thu, 25 Sep 2025 14:25:25 +0200 Subject: [PATCH] adminreview --- .../Admin/AdminReviewsController.cs | 32 +++++++++++++++---- .../Services/Admin/AdminReviewService.cs | 19 ++++++++--- .../Admin/Interfaces/IAdminReviewService.cs | 2 +- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/Webshop.Api/Controllers/Admin/AdminReviewsController.cs b/Webshop.Api/Controllers/Admin/AdminReviewsController.cs index 7ef23de..cce986b 100644 --- a/Webshop.Api/Controllers/Admin/AdminReviewsController.cs +++ b/Webshop.Api/Controllers/Admin/AdminReviewsController.cs @@ -1,8 +1,12 @@ // src/Webshop.Api/Controllers/Admin/AdminReviewsController.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; +using Webshop.Application.DTOs.Reviews; using Webshop.Application.Services.Admin; namespace Webshop.Api.Controllers.Admin @@ -20,26 +24,42 @@ namespace Webshop.Api.Controllers.Admin } [HttpGet] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task GetAllReviews() { - var reviews = await _adminReviewService.GetAllReviewsAsync(); - return Ok(reviews); + var result = await _adminReviewService.GetAllReviewsAsync(); + // In a simple GetAll, we typically just return the value on success. + return Ok(result.Value); } [HttpPost("{id}/approve")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task ApproveReview(Guid id) { var result = await _adminReviewService.ApproveReviewAsync(id); - if (result.Type == Application.ServiceResultType.Success) return NoContent(); - return NotFound(new { Message = result.ErrorMessage }); + + return result.Type switch + { + ServiceResultType.Success => NoContent(), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + _ => StatusCode(StatusCodes.Status500InternalServerError, new { Message = result.ErrorMessage ?? "Ein unerwarteter Fehler ist aufgetreten." }) + }; } [HttpDelete("{id}")] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)] public async Task DeleteReview(Guid id) { var result = await _adminReviewService.DeleteReviewAsync(id); - if (result.Type == Application.ServiceResultType.Success) return NoContent(); - return NotFound(new { Message = result.ErrorMessage }); + + return result.Type switch + { + ServiceResultType.Success => NoContent(), + ServiceResultType.NotFound => NotFound(new { Message = result.ErrorMessage }), + _ => StatusCode(StatusCodes.Status500InternalServerError, new { Message = result.ErrorMessage ?? "Ein unerwarteter Fehler ist aufgetreten." }) + }; } } } \ No newline at end of file diff --git a/Webshop.Application/Services/Admin/AdminReviewService.cs b/Webshop.Application/Services/Admin/AdminReviewService.cs index 5c9d5b1..aca25a0 100644 --- a/Webshop.Application/Services/Admin/AdminReviewService.cs +++ b/Webshop.Application/Services/Admin/AdminReviewService.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; @@ -17,27 +18,32 @@ namespace Webshop.Application.Services.Admin _reviewRepository = reviewRepository; } - public async Task> GetAllReviewsAsync() + public async Task>> GetAllReviewsAsync() { var reviews = await _reviewRepository.GetAllAsync(); - return reviews.Select(r => new ReviewDto + var dtos = reviews.Select(r => new ReviewDto { Id = r.Id, ProductId = r.ProductId, ProductName = r.Product?.Name, - CustomerName = $"{r.Customer?.FirstName} {r.Customer?.LastName}", + CustomerName = $"{r.Customer?.FirstName} {r.Customer?.LastName}".Trim(), Rating = r.Rating, Title = r.Title, Comment = r.Comment, ReviewDate = r.ReviewDate, IsApproved = r.IsApproved }); + + return ServiceResult.Ok>(dtos); } public async Task ApproveReviewAsync(Guid reviewId) { var review = await _reviewRepository.GetByIdAsync(reviewId); - if (review == null) return ServiceResult.Fail(ServiceResultType.NotFound, "Bewertung nicht gefunden."); + if (review == null) + { + return ServiceResult.Fail(ServiceResultType.NotFound, $"Bewertung mit ID '{reviewId}' nicht gefunden."); + } review.IsApproved = true; await _reviewRepository.UpdateAsync(review); @@ -47,7 +53,10 @@ namespace Webshop.Application.Services.Admin public async Task DeleteReviewAsync(Guid reviewId) { var review = await _reviewRepository.GetByIdAsync(reviewId); - if (review == null) return ServiceResult.Fail(ServiceResultType.NotFound, "Bewertung nicht gefunden."); + if (review == null) + { + return ServiceResult.Fail(ServiceResultType.NotFound, $"Bewertung mit ID '{reviewId}' nicht gefunden."); + } await _reviewRepository.DeleteAsync(reviewId); return ServiceResult.Ok(); diff --git a/Webshop.Application/Services/Admin/Interfaces/IAdminReviewService.cs b/Webshop.Application/Services/Admin/Interfaces/IAdminReviewService.cs index 905ea85..d1c5efa 100644 --- a/Webshop.Application/Services/Admin/Interfaces/IAdminReviewService.cs +++ b/Webshop.Application/Services/Admin/Interfaces/IAdminReviewService.cs @@ -9,7 +9,7 @@ namespace Webshop.Application.Services.Admin { public interface IAdminReviewService { - Task> GetAllReviewsAsync(); + Task>> GetAllReviewsAsync(); Task ApproveReviewAsync(Guid reviewId); Task DeleteReviewAsync(Guid reviewId); }