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

Funcionalidade na API de Contagem de Cursos por Estudante

Olá, pessoal!

Implementei a funcionalidade na nossa API, que permite contar o número de cursos em que um estudante está matriculado. Essa adição foi feita no MatriculaController, MatriculaServices e pessoasRoute, agora obtemos a contagem de forma simples e eficiente.

Arquivo MatriculaController.js :

    // Método para contar cursos por ID do estudante
    async contaCursosPorEstudante(req, res) {
        const { estudante_id } = req.params; // Obtém o ID do estudante da requisição

        try {
            // Busca os dados do estudante e conta os cursos simultaneamente
            const [dadosEstudante, contagem] = await Promise.all([
                this.entidadeService.pegaUmRegistro({ id: estudante_id }),
                this.entidadeService.contaCursosPorEstudante(estudante_id),
            ]);

            // Verifica se o estudante existe
            if (!dadosEstudante) {
                return res.status(404).json({ mensagem: 'Estudante não encontrado' });
            }

            // Retorna a contagem e os dados do estudante
            return res.status(200).json({ contagem, estudante: dadosEstudante });
        } catch (error) {
            return res.status(500).json({ mensagem: 'Erro ao buscar dados' });
        }
    }

O método contaCursosPorEstudante é responsável por contar o número de cursos nos quais um estudante está matriculado, utilizando seu ID.

Resumo do Método contaCursosPorEstudante:

Entrada:

  • Recebe o ID do estudante através dos parâmetros da requisição.

Processo:

  • Faz uma chamada simultânea para dois serviços: Busca os dados do estudante com o método pegaUmRegistro; Conta as matrículas do estudante utilizando o método contaCursosPorEstudante.

  • Verifica se o estudante existe. Se não, retorna um erro 404 (não encontrado).

Saída:

  • Retorna um JSON contendo: A contagem de cursos nos quais o estudante está matriculado; Os dados do estudante.

Tratamento de Erros:

  • Se ocorrer algum erro durante o processo, retorna um erro 500 (erro interno do servidor).

Arquivo MatriculaServices.js :

    // Método para contar cursos por ID do estudante
    async contaCursosPorEstudante(estudante_id) {
        // Utiliza o Sequelize para contar as matrículas do estudante
        const total = await this.model.count({
            where: {
                estudante_id,
                status: 'matriculado' // Considerando apenas matrículas com status 'matriculado'
            }
        });

        return total; // Retorna a contagem
    }

Resumo do Método contaCursosPorEstudante no Arquivo MatriculaServices.js:

  • Objetivo: Este método conta quantas matrículas um estudante possui no sistema com o status de 'matriculado'.

  • Entrada: Recebe o estudante_id como parâmetro, que representa o ID do estudante cujas matrículas serão contadas.

  • Processo: Utiliza o Sequelize para realizar uma contagem de registros na tabela de matrículas (this.model.count); Aplica um filtro (where) que considera apenas as matrículas que pertencem ao estudante identificado pelo estudante_id e que estão com o status 'matriculado'.

  • Saída: Retorna um valor numérico (total), que representa o número total de matrículas ativas do estudante.

Este método é eficiente para obter rapidamente a quantidade de cursos em que um estudante está ativo, permitindo a implementação de funcionalidades que dependem dessa informação.

URLs para Teste no Postman:

Contar Cursos por Estudante: http://localhost:3000/pessoas/1/matriculas/contagem

3 respostas
solução!

Busquei explorar diferentes formas de implementação para praticar e melhorar as habilidades, e estou aberto a feedbacks e sugestões!

Agradeço a todos pela atenção!

DEI UMA REFATORADA NO CÓDIGO AGORA, UMA MELHORADA. ENVIANDO AQUI AS MELHORIAS

Agora alem de exibir a quantidade de matriculas, também será retornado quais cursos o estudante ta matriculado! Exibindo o ID dos cursos.

Ao buscar no postman: http://localhost:3000/pessoas/2/matriculas/quantidade

será retornado:

{
    "QuantidadeDeMatriculas": 2,
    "cursos": [ 7, 8 ],
    "estudante": {
        "id": 2,
        "status": "matriculado",
        "createdAt": "2024-10-30T15:21:35.375Z",
        "updatedAt": "2024-10-30T15:21:35.375Z",
        "deletedAt": null,
        "curso_id": 2,
        "estudante_id": 1
    }
}

O código MatriculaController.js ficou assim, metoto contaCursosPorEstudante :

    // Método para contar cursos por ID do estudante
    async contaCursosPorEstudante(req, res) {
        const { estudante_id } = req.params; // Obtém o ID do estudante da requisição

        try {
            const { total, cursos } = await this.entidadeService.obterQuantidadeECursosPorEstudante(estudante_id);
            const dadosEstudante = await this.entidadeService.pegaUmRegistro({ id: estudante_id });

            if (!dadosEstudante) {
                return res.status(404).json({ mensagem: 'Estudante não encontrado' });
            }

            // Retorna a contagem de matrículas, a lista de cursos e os dados do estudante
            return res.status(200).json({ QuantidadeDeMatriculas: total, cursos, estudante: dadosEstudante });
        } catch {
            return res.status(500).json({ mensagem: 'Erro ao buscar dados' });
        }
    }

O codigo do MatriculaService.js ficou assim, metodo obterQuantidadeECursosPorEstudante :

    // Método para obter a quantidade de matrículas e os IDs dos cursos por ID do estudante
    async obterQuantidadeECursosPorEstudante(estudante_id) {
        const [total, matriculas] = await Promise.all([
            this.model.count({
                where: {
                    estudante_id,
                    status: 'matriculado' // Considerando apenas matrículas com status 'matriculado'
                }
            }),
            this.model.findAll({
                where: {
                    estudante_id,
                    status: 'matriculado'
                },
                attributes: ['curso_id'] // Retorna apenas os IDs dos cursos
            })
        ]);

        return { total, cursos: matriculas.map(({ curso_id }) => curso_id) }; // Retorna contagem e IDs dos cursos
    }

Rota pra essa funcionalidade em pessoasRoute.js :

// Rota para contar cursos por ID do estudante
router.get('/pessoas/:estudante_id/matriculas/quantidade', (req, res) => matriculaController.contaCursosPorEstudante(req, res));

Bom, espero que tenham gostado.

Oi, José! Tudo bem?

Obrigada por compartilhar seu código com a gente.

Gostei de como você implementou a contagem de cursos por estudante com detalhes, utilizando o Promise.all para otimizar as consultas simultâneas. Essa abordagem é eficiente e ajuda a diminuir o tempo de resposta da API! Além disso, incluir a lista de IDs dos cursos foi uma boa adição para melhorar a visualização dos dados.

Conte com o apoio do Fórum para continuar evoluindo. Abraços e bons estudos!