Achei que seria interessante compartilhar, implementei a funcionalidade de paginação para pessoas, tanto ativas quanto ativas e inativas, adaptando o PessoaController.js e PessoaServices.js para isso. E também implementei a paginação para todos os cursos, ficou bem organizado.
Ao fazer o GET em http://localhost:3000/pessoas/todos ou http://localhost:3000/pessoas/todos?page=2 , retornara : Os objetos de cada pessoa, pagina atual, total de paginas, total pessoas "ativas ou ativas e inativas";
{
"pessoas": [
{
//os objetos contendo as pessoas
},
{
//os objetos contendo as pessoas
},
],
"paginaAtual": 1,
"totalPaginas": 5,
"totalPessoas": 10
}
Implementação em PessoaController.js :
// Método para retornar todas as pessoas ativas com paginação
async pegaPessoasAtivas(req, res) {
const page = Math.max(parseInt(req.query.page) || 1, 1); // Define a página atual, garantindo que seja pelo menos 1
const limit = Math.max(parseInt(req.query.limit) || 2, 1); // Define o limite de resultados por página, garantindo que seja pelo menos 1
try {
// Chama o serviço para obter as pessoas ativas com a paginação definida
const { pessoas, totalPaginas, totalPessoas } = await pessoaServices.pegaPessoasAtivasPaginado(page, limit);
// Retorna a resposta com os dados das pessoas
res.status(200).json({ pessoas, paginaAtual: page, totalPaginas, totalPessoas });
} catch (erro) {
res.status(erro.message === 'Página não encontrada' ? 404 : 500).json({ erro: erro.message });
}
}
// Método para retornar todas as pessoas (ativas e inativas) com paginação
async pegaTodasAsPessoas(req, res) {
const page = Math.max(parseInt(req.query.page) || 1, 1); // Define a página atual, garantindo que seja pelo menos 1
const limit = Math.max(parseInt(req.query.limit) || 2, 1); // Define o limite de resultados por página, garantindo que seja pelo menos 1
try {
// Chama o serviço para obter todas as pessoas com a paginação definida
const { pessoas, totalPaginas, totalPessoas } = await pessoaServices.pegaTodasAsPessoasPaginado(page, limit);
// Retorna a resposta com os dados das pessoas
res.status(200).json({ pessoas, paginaAtual: page, totalPaginas, totalPessoas });
} catch (erro) {
res.status(erro.message === 'Página não encontrada' ? 404 : 500).json({ erro: erro.message });
}
}
Implementação em PessoaService.js :
// Busca pessoas ativas com paginação
async pegaPessoasAtivasPaginado(page, limit) {
const offset = (page - 1) * limit; // Calcula o deslocamento (offset) com base na página atual e no limite de resultados por página
// Realiza a busca no banco de dados, contando e buscando as pessoas ativas
const { count, rows } = await this.model.findAndCountAll({
where: { ativo: true }, // Filtra para incluir apenas pessoas ativas
limit, // Limita o número de resultados retornados
offset, // Aplica o deslocamento para a paginação
order: [['nome', 'ASC']], // Ordena os resultados pelo nome em ordem ascendente
});
const totalPaginas = Math.ceil(count / limit); // Calcula o total de páginas com base na contagem total de pessoas ativas e o limite
if (page > totalPaginas) throw new Error('Página não encontrada'); // Verifica se a página solicitada existe, lançando um erro se for maior que o total de páginas
return { pessoas: rows, totalPaginas, totalPessoas: count }; // Retorna um objeto contendo as pessoas encontradas, o total de páginas e o total de pessoas
}
// Busca todas as pessoas (ativas e inativas) com paginação
async pegaTodasAsPessoasPaginado(page, limit) {
const offset = (page - 1) * limit;
// Realiza a busca no banco de dados, contando e buscando todas as pessoas
const { count, rows } = await this.model.findAndCountAll({
limit,
offset,
order: [['nome', 'ASC']],
});
const totalPaginas = Math.ceil(count / limit);
if (page > totalPaginas) throw new Error('Página não encontrada');
return { pessoas: rows, totalPaginas, totalPessoas: count };
}