From 46c1d1d0864dd3e8a1da1e3352bef845a73c8f70 Mon Sep 17 00:00:00 2001 From: Jeferson Almeida Date: Fri, 3 Jan 2025 18:30:27 -0300 Subject: [PATCH] =?UTF-8?q?#271=20-=20Pagina=C3=A7=C3=A3o=20na=20API=20de?= =?UTF-8?q?=20Cat=C3=A1logo=20-=20feature/sp8/#271?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/CatalogoController.cs | 5 ++- .../Data/Repository/ProdutoRepository.cs | 35 +++++++++++++++---- .../JSE.Catalogo.API/JSE.Catalogo.API.csproj | 1 + .../Models/IProdutoRepository.cs | 2 +- .../JSE.Catalogo.API/Models/PagedResult.cs | 11 ++++++ 5 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 src/services/JSE.Catalogo.API/Models/PagedResult.cs diff --git a/src/services/JSE.Catalogo.API/Controllers/CatalogoController.cs b/src/services/JSE.Catalogo.API/Controllers/CatalogoController.cs index 2f52f3f..edec85d 100644 --- a/src/services/JSE.Catalogo.API/Controllers/CatalogoController.cs +++ b/src/services/JSE.Catalogo.API/Controllers/CatalogoController.cs @@ -15,11 +15,10 @@ public CatalogoController(IProdutoRepository produtoRepository) _produtoRepository = produtoRepository; } - [AllowAnonymous] [HttpGet("catalogo/produtos")] - public async Task> Index() + public async Task> Index([FromQuery] int ps = 8, [FromQuery] int page = 1, [FromQuery] string q = null) { - return await _produtoRepository.ObterTodos(); + return await _produtoRepository.ObterTodos(ps, page, q); } [HttpGet("catalogo/produtos/{id}")] diff --git a/src/services/JSE.Catalogo.API/Data/Repository/ProdutoRepository.cs b/src/services/JSE.Catalogo.API/Data/Repository/ProdutoRepository.cs index 739c39d..c2d7614 100644 --- a/src/services/JSE.Catalogo.API/Data/Repository/ProdutoRepository.cs +++ b/src/services/JSE.Catalogo.API/Data/Repository/ProdutoRepository.cs @@ -1,4 +1,5 @@ -using JSE.Catalogo.API.Models; +using Dapper; +using JSE.Catalogo.API.Models; using JSE.Core.Data; using Microsoft.EntityFrameworkCore; @@ -7,7 +8,7 @@ namespace JSE.Catalogo.API.Data.Repository public class ProdutoRepository : IProdutoRepository { private readonly CatalogoContext _context; - + public ProdutoRepository(CatalogoContext context) { _context = context; @@ -15,11 +16,31 @@ public ProdutoRepository(CatalogoContext context) public IUnitOfWork UnitOfWork => _context; - public async Task> ObterTodos() + public async Task> ObterTodos(int pageSize, int pageIndex, string query = null) { - return await _context.Produtos.AsNoTracking().ToListAsync(); - } + var sql = @$"SELECT * FROM Produtos + WHERE (@Nome IS NULL OR Nome LIKE '%' + @Nome + '%') + ORDER BY [Nome] + OFFSET {pageSize * (pageIndex - 1)} ROWS + FETCH NEXT {pageSize} ROWS ONLY + SELECT COUNT(Id) FROM Produtos + WHERE (@Nome IS NULL OR Nome LIKE '%' + @Nome + '%')"; + + var multi = await _context.Database.GetDbConnection() + .QueryMultipleAsync(sql, new { Nome = query }); + var produtos = multi.Read(); + var total = multi.Read().FirstOrDefault(); + + return new PagedResult() + { + List = produtos, + TotalResults = total, + PageIndex = pageIndex, + PageSize = pageSize, + Query = query + }; + } public async Task> ObterProdutosPorId(string ids) { @@ -34,14 +55,14 @@ public async Task> ObterProdutosPorId(string ids) .Where(p => idsValue.Contains(p.Id) && p.Ativo).ToListAsync(); } - public async Task ObterPorId(Guid id) + public async Task ObterPorId(Guid id) { return await _context.Produtos.FindAsync(id); } public void Adicionar(Produto produto) { - _context.Produtos.Add(produto); + _context.Produtos.Add(produto); } public void Atualizar(Produto produto) diff --git a/src/services/JSE.Catalogo.API/JSE.Catalogo.API.csproj b/src/services/JSE.Catalogo.API/JSE.Catalogo.API.csproj index c66dcc2..134868a 100644 --- a/src/services/JSE.Catalogo.API/JSE.Catalogo.API.csproj +++ b/src/services/JSE.Catalogo.API/JSE.Catalogo.API.csproj @@ -10,6 +10,7 @@ + diff --git a/src/services/JSE.Catalogo.API/Models/IProdutoRepository.cs b/src/services/JSE.Catalogo.API/Models/IProdutoRepository.cs index 8bf29ea..c0725a1 100644 --- a/src/services/JSE.Catalogo.API/Models/IProdutoRepository.cs +++ b/src/services/JSE.Catalogo.API/Models/IProdutoRepository.cs @@ -4,7 +4,7 @@ namespace JSE.Catalogo.API.Models { public interface IProdutoRepository : IRepository { - Task> ObterTodos(); + Task> ObterTodos(int pageSize, int pageIndex, string query = null); Task ObterPorId(Guid id); Task> ObterProdutosPorId(string ids); void Adicionar(Produto produto); diff --git a/src/services/JSE.Catalogo.API/Models/PagedResult.cs b/src/services/JSE.Catalogo.API/Models/PagedResult.cs new file mode 100644 index 0000000..f690441 --- /dev/null +++ b/src/services/JSE.Catalogo.API/Models/PagedResult.cs @@ -0,0 +1,11 @@ +namespace JSE.Catalogo.API.Models +{ + public class PagedResult where T : class + { + public IEnumerable List { get; set; } + public int TotalResults { get; set; } + public int PageIndex { get; set; } + public int PageSize { get; set; } + public string Query { get; set; } + } +}