🚀 Capítulo 19: Paginação e Filtros (Tema: Dragon Ball)
NOTE
Este capítulo utiliza a temática de Dragon Ball para explicar a Paginação. O Shenlong pode realizar desejos, mas buscar todas as esferas de uma vez sobrecarrega o sistema; precisamos ir por partes!
1. 🎯 Objetivo da Aula
Compreender a importância de não retornar todos os dados de uma vez (Paginação) e como permitir que o usuário filtre os dados usando Query Params.
2. 🏢 O Cenário Prático (Seu Desafio)
Existem milhares de Esferas do Dragão espalhadas pelo universo. Se o Radar do Dragão tentar listar todas elas em uma única tela, a bateria vai acabar e o sistema vai travar! Seu desafio é programar o Radar (a API) para:
- Mostrar apenas um grupo de esferas por vez (Ex: 5 por página).
- Permitir filtrar as esferas pelo planeta onde estão (Ex: Terra ou Namekusei).
3. 🧠 Fundamentos: A Teoria Traduzida
Quando nosso banco de dados tem milhares de registros, enviá-los todos de uma vez para o cliente causa lentidão e desperdício de internet. Usamos duas técnicas para resolver isso:
📄 1. Paginação (Pagination)
É a técnica de dividir a lista de resultados em páginas. O cliente diz qual página quer e quantos itens quer por página.
page(Página): O número da página atual (ex: 1, 2, 3).limit(Limite): Quantos itens mostrar por página (ex: 10).offset(Deslocamento): Quantos itens pular no banco para começar a mostrar. A fórmula é:(page - 1) * limit.
🔍 2. Filtros
Usamos Query Params para permitir que o usuário filtre os resultados.
- Exemplo:
GET /esferas?planeta=terra
4. 📖 Exemplo Guiado: Código com Paginação
app.get('/esferas', (req, res) => {
const page = parseInt(req.query.page) || 1;
const limit = parseInt(req.query.limit) || 5;
const offset = (page - 1) * limit;
// Simula a busca no banco usando slice no array
const esferasPaginadas = todasAsEsferas.slice(offset, offset + limit);
res.json({
pagina_atual: page,
itens_por_pagina: limit,
dados: esferasPaginadas
});
});5. 🛠️ Prática Obrigatória 1: Calculando o Deslocamento
Se um usuário pedir a página 3 com um limite de 10 itens por página, qual será o valor do offset (quantos itens o sistema vai pular)? Use a fórmula ensinada.
6. 🛠️ Prática Obrigatória 2: Vantagem para o Celular
Por que a paginação é extremamente importante para aplicativos de celular que usam redes 4G/5G?
7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 19 Backend) e clique em Commit to main. - Envie para a Nuvem (Push): Clique em Push origin.
8. 📂 Estrutura de Pastas
mod_07_backend_e_apis/
├── capitulos/
│ ├── capitulo_19_paginacao.md
│ └── codigos/
│ └── cap19/
│ └── calculo_offset.txt9. 💡 Checkpoint de Lógica
Se a nossa lista tiver 12 esferas e o limite for 5 por página. Quantas páginas completas teremos e quantos itens sobrarão na última página?
10. 🔥 Desafio de Fixação
Pesquise o que é a Paginação baseada em Cursor (Cursor-based pagination) e por que ela é usada em feeds de redes sociais como o Twitter/X em vez da paginação por página.
🔑 Gabarito de Código/Fórmulas
Gabarito da Prática 1:
Fórmula: (page - 1) * limit
Cálculo: (3 - 1) * 10 = 2 * 10 = 20. O sistema vai pular os primeiros 20 itens e mostrar do 21º ao 30º.