From de0f2ac586a822c4b83febdcde4785cf2ea0b94b Mon Sep 17 00:00:00 2001 From: Nguyen Xuan Nhan Date: Wed, 15 May 2024 16:35:30 +0700 Subject: [PATCH] feat(product): add update endpoint --- .../Endpoints/Products/Update.Request.cs | 15 +++++ .../Endpoints/Products/Update.Response.cs | 5 ++ .../Endpoints/Products/Update.cs | 55 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/RookieShop.ApiService/Endpoints/Products/Update.Request.cs create mode 100644 src/RookieShop.ApiService/Endpoints/Products/Update.Response.cs create mode 100644 src/RookieShop.ApiService/Endpoints/Products/Update.cs diff --git a/src/RookieShop.ApiService/Endpoints/Products/Update.Request.cs b/src/RookieShop.ApiService/Endpoints/Products/Update.Request.cs new file mode 100644 index 0000000..31284e2 --- /dev/null +++ b/src/RookieShop.ApiService/Endpoints/Products/Update.Request.cs @@ -0,0 +1,15 @@ +using RookieShop.Domain.Entities.CategoryAggregator.Primitives; +using RookieShop.Domain.Entities.ProductAggregator.Primitives; + +namespace RookieShop.ApiService.Endpoints.Products; + +public sealed record UpdateProductRequest( + ProductId Id, + string Name, + string? Description, + int Quantity, + decimal Price, + decimal PriceSale, + IFormFile? ProductImages, + bool IsDeletedOldImage, + CategoryId? CategoryId = null); \ No newline at end of file diff --git a/src/RookieShop.ApiService/Endpoints/Products/Update.Response.cs b/src/RookieShop.ApiService/Endpoints/Products/Update.Response.cs new file mode 100644 index 0000000..41d2e69 --- /dev/null +++ b/src/RookieShop.ApiService/Endpoints/Products/Update.Response.cs @@ -0,0 +1,5 @@ +using RookieShop.ApiService.ViewModels.Products; + +namespace RookieShop.ApiService.Endpoints.Products; + +public sealed record UpdateProductResponse(ProductVm Product); \ No newline at end of file diff --git a/src/RookieShop.ApiService/Endpoints/Products/Update.cs b/src/RookieShop.ApiService/Endpoints/Products/Update.cs new file mode 100644 index 0000000..4cf91f0 --- /dev/null +++ b/src/RookieShop.ApiService/Endpoints/Products/Update.cs @@ -0,0 +1,55 @@ +using MediatR; +using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.AspNetCore.Mvc; +using RookieShop.ApiService.ViewModels.Products; +using RookieShop.Application.Products.Commands.Update; +using RookieShop.Domain.Entities.CategoryAggregator.Primitives; +using RookieShop.Domain.Entities.ProductAggregator.Primitives; +using RookieShop.Infrastructure.Endpoints.Abstractions; +using RookieShop.Infrastructure.RateLimiter; + +namespace RookieShop.ApiService.Endpoints.Products; + +public sealed class Update(ISender sender) : IEndpoint, UpdateProductRequest> +{ + public void MapEndpoint(IEndpointRouteBuilder app) => + app.MapPut("/products", + async ( + [FromForm] ProductId id, + [FromForm] string name, + [FromForm] string? description, + [FromForm] int quantity, + [FromForm] decimal price, + [FromForm] decimal priceSale, + [FromForm] IFormFile? productImages, + [FromForm] bool isDeletedOldImage = false, + [FromForm] CategoryId? categoryId = null) + => await HandleAsync(new(id, name, description, quantity, price, priceSale, productImages, + isDeletedOldImage, categoryId))) + .Produces() + .WithTags(nameof(Products)) + .WithName("Update Product") + .MapToApiVersion(new(1, 0)) + .RequirePerUserRateLimit(); + + public async Task> HandleAsync(UpdateProductRequest request, + CancellationToken cancellationToken = default) + { + UpdateProductCommand command = new( + request.Id, + request.Name, + request.Description, + request.Quantity, + request.Price, + request.PriceSale, + request.ProductImages, + request.IsDeletedOldImage, + request.CategoryId); + + var result = await sender.Send(command, cancellationToken); + + UpdateProductResponse response = new(result.Value.ToProductVm()); + + return TypedResults.Ok(response); + } +} \ No newline at end of file