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; } + } +}