From 6dc9dfa64e21873eea9793c7f88afca6eeded971 Mon Sep 17 00:00:00 2001 From: Jose E Rodriguez-Marrero Date: Wed, 5 Jun 2024 23:34:35 -0700 Subject: [PATCH] Implement MediatR in GetAllStock endpoint --- api/Controllers/StockController.cs | 15 +++++++++------ api/Handlers/GetAllStocksHandler.cs | 23 +++++++++++++++++++++++ api/Program.cs | 2 ++ api/Queries/GetAllStocksQuery.cs | 17 +++++++++++++++++ api/api.csproj | 1 + 5 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 api/Handlers/GetAllStocksHandler.cs create mode 100644 api/Queries/GetAllStocksQuery.cs diff --git a/api/Controllers/StockController.cs b/api/Controllers/StockController.cs index e1ac520..59d0b90 100644 --- a/api/Controllers/StockController.cs +++ b/api/Controllers/StockController.cs @@ -3,6 +3,8 @@ using api.Helpers; using api.Interfaces; using api.Mappers; +using api.Queries; +using MediatR; using MethodTimer; using Microsoft.AspNetCore.Mvc; @@ -12,17 +14,19 @@ namespace api.Controllers [ApiController] public class StockController : ControllerBase { + private readonly IMediator _mediator; private readonly IStockRepo _stockRepo; //* Used for unit testing - public StockController(IStockRepo stockRepo) + public StockController(IStockRepo stockRepo, IMediator mediator) { _stockRepo = stockRepo; + _mediator = mediator; } [Time] [HttpGet] - public async Task GetAll([FromQuery] QueryObject query) + public async Task GetAll([FromQuery] QueryObject queryObject) { //! Uncomment if ever passing dto to method. Validation performed in class. @@ -31,10 +35,9 @@ public async Task GetAll([FromQuery] QueryObject query) // return BadRequest(ModelState); // } - var stocks = await _stockRepo.GetAllAsync(query); - var stockDTOs = stocks.Select(s => s.ToStockDto()); - - return Ok(stockDTOs); + var query = new GetAllStocksQuery(queryObject); + var result = await _mediator.Send(query); + return Ok(result); } [HttpGet("{id:int}")] diff --git a/api/Handlers/GetAllStocksHandler.cs b/api/Handlers/GetAllStocksHandler.cs new file mode 100644 index 0000000..6003b85 --- /dev/null +++ b/api/Handlers/GetAllStocksHandler.cs @@ -0,0 +1,23 @@ +using api.DTOs.Stock; +using api.Interfaces; +using api.Mappers; +using api.Queries; +using MediatR; + +namespace api.Handlers +{ + public class GetAllStocksHandler : IRequestHandler> + { + private readonly IStockRepo _stockRepo; + public GetAllStocksHandler(IStockRepo stockRepo) + { + _stockRepo = stockRepo; + } + + public async Task> Handle(GetAllStocksQuery request, CancellationToken cancellationToken) + { + var stocks = await _stockRepo.GetAllAsync(request.QueryObject); + return stocks.Select(s => s.ToStockDto()).ToList(); + } + } +} diff --git a/api/Program.cs b/api/Program.cs index 2df8b15..730b9f2 100644 --- a/api/Program.cs +++ b/api/Program.cs @@ -1,3 +1,4 @@ +using System.Reflection; using api.Data; using api.Interfaces; using api.Models; @@ -59,6 +60,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly())); var app = builder.Build(); diff --git a/api/Queries/GetAllStocksQuery.cs b/api/Queries/GetAllStocksQuery.cs new file mode 100644 index 0000000..d388818 --- /dev/null +++ b/api/Queries/GetAllStocksQuery.cs @@ -0,0 +1,17 @@ +using api.DTOs.Stock; +using api.Helpers; +using api.Models; +using MediatR; + +namespace api.Queries +{ + public class GetAllStocksQuery : IRequest> + { + public QueryObject QueryObject { get; } + + public GetAllStocksQuery(QueryObject queryObject) + { + QueryObject = queryObject; + } + } +} diff --git a/api/api.csproj b/api/api.csproj index 10714aa..8f7cef0 100644 --- a/api/api.csproj +++ b/api/api.csproj @@ -13,6 +13,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all +