Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Implementação da funcionalidade de paginação e datas na api

Na implementação da funcionalidade de paginação nas rotas de listarLivros e listarAutores, minha abordagem ficou um pouco diferente da aula com a professora, pois busquei adicionar mais detalhes em tudo ficou em um único arquivo, existe outras abordagens, mas para fins de pratica eu fiz dessa forma.

Na minha implementação de paginaçao, a resposta da API inclui: lista de autores ou livros retornados, a paginaAtual que o cliente está visualizando, o totalPaginas disponíveis com base na contagem de documentos, o totalAutores ou totalLivros proporcionando uma visão clara da quantidade total de registros disponíveis.

Na implementação de datas em livros na api, algumas coisas também ficaram um pouco diferentes, tentei fazer diferente para fins de pratica, e tudo segue funcionando corretamente.

No tratamento de erros para validação de parâmetros e verificação de páginas, busquei garantir uma experiência mais robusta para o usuário.

Vou compartilhar meus codigos abaixo, somente os arquivos e trechos de codigos alterados, para paginaçao a estrutura é a mesma pra livros e autores, a funcionalidade de datas implementei somente em livros.

5 respostas

Em livroController.js

// Método para converter a data, utilizado em atualizar livro e cadastrar livro
    static converterData(dataString) {
        const [dia, mes, ano] = dataString.split('/'); // Divide a string em dia, mês e ano
        return new Date(ano, mes - 1, dia); // Cria um novo objeto Date
    }
    
    //metodo para buscar todos os livros
    static async listarLivros (req, res) {
        try {

            // Define limite e página padrão
            let { limite = 5, pagina = 1 } = req.query;
    
            // Converte limite e página para números inteiros
            limite = parseInt(limite);
            pagina = parseInt(pagina);
    
            // Valida se os parâmetros são números positivos
            if (isNaN(limite) || limite <= 0 || isNaN(pagina) || pagina <= 0) {
                return res.status(400).json({ message: "Limite e página devem ser números positivos." });
            }
    
            // Contagem total de documentos
            const totalLivros = await livro.countDocuments({});
            const totalPaginas = Math.ceil(totalLivros / limite);
    
            // Verifica se a página solicitada existe
            if (pagina > totalPaginas) {
                return res.status(404).json({ message: "Página não encontrada." });
            }
    
            // Busca os livros com paginação
            const listaLivros = await livro
                .find({})
                .sort({ dataAdicao: -1, titulo: 1 }) // Ordena por data de adição (mais recente primeiro) e título (alfabeticamente)
                .skip((pagina - 1) * limite)
                .limit(limite);
            
            // Retorna a página atual, o total de páginas e o total de livros
            res.status(200).json({
                livros: listaLivros,
                paginaAtual: pagina,
                totalPaginas: totalPaginas,
                totalLivros: totalLivros
            });
    
        } catch (erro) {
            res.status(500).json({ message: `${erro.message} - Falha na requisição` });
        }
    }
    
        //Metodo para cadastrar novo livro, POST    
    static async cadastrarLivro (req, res) {

        const novoLivro = req.body;

        try {

            // Verifica se dataAdicao está presente nos dados e faz a conversão
            if (novoLivro.dataAdicao) {
                novoLivro.dataAdicao = LivroController.converterData(novoLivro.dataAdicao);
            }

            const autorEncontrado = await autor.findById(novoLivro.autor);
            const livroCompleto = { ...novoLivro, autor: { ...autorEncontrado._doc }};
            const livroCriado = await livro.create(livroCompleto);
            
            res.status(201).json({mensagem: "Livro cadastrado com sucesso", livro: livroCriado});
        } catch (error) {
            res.status(500).json({mensagem: `${error.message} - Falha ao cadastrar livro`});
        }
    }

    // Método para editar um livro, PUT
    static async atualizarLivro(req, res) {
        try {
            const id = req.params.id;
            const dadosAtualizados = req.body;

            // Verifica se dataAdicao está presente nos dados e faz a conversão
            if (dadosAtualizados.dataAdicao) {
                dadosAtualizados.dataAdicao = LivroController.converterData(dadosAtualizados.dataAdicao); // Use o nome da classe para chamar o método
            }

            await livro.findByIdAndUpdate(id, dadosAtualizados);
            res.status(200).json({ mensagem: "Livro atualizado com sucesso" });
        } catch (erro) {
            res.status(500).json({ message: `${erro.message} - falha na atualização` });
        }
    }

Em Livro.js


//criando as propriedades que o livro terá
const livroSchema = new mongoose.Schema({ //criando o schema do livro
    id: { type: mongoose.Schema.Types.ObjectId },
    titulo: { type: String, required: true },
    editora: { type: String, required: true  },
    preco: { type: Number, required: true },
    paginas: { 
        type: Number, 
        min: [10, "O livro deve ter entre 10 e 1000 páginas"], 
        max: [1000, "O livro deve ter entre 10 e 1000 páginas"],
        required: true   
    }, 
    autor: autorSchema, 
    dataAdicao: { type: Date, default: Date.now }
    
}, {versionKey: false}); //removendo a versão do documento

// Altera o formato da data de adição do livro
// Formata a data para o padrão brasileiro
livroSchema.set('toJSON', {
    transform: (doc, ret) => {
        // Formata a data apenas para exibição
        if (ret.dataAdicao) {
            const options = { year: 'numeric', month: '2-digit', day: '2-digit' };
            ret.dataAdicao = new Date(ret.dataAdicao).toLocaleDateString('pt-BR', options);
        }
        return ret;
    }
});
solução!

Espero ter ajudado!

Olá, José. Tudo bem?

Uau! Muito obrigada por compartilhar sua versão com o fórum Alura! Parabéns pelo capricho e dedicação em tornar a experiência do usuário mais robusta. Tenho certeza que isso vai ajudar muito outros estudantes!

Conte com o apoio do Fórum em sua jornada :)

Um forte abraço e bons estudos!