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

Funcionalidade de ativar e desativar um estudante e mudar status de uma matricula pra um curso especifico

Fiz duas implementações diferentes na API, uma para ativar e desativar o status de um estudante na tabela pessoas, e outra para mudar o status de uma matricula especifica na tabela matriculas "ex: matriculado e cancelado".

Para ativar ou desativar um estudante na api, alterando seu status na tabela pessoas, ativo ou inativo, se for desativar, isso consequentemente cancelara todas as matriculas desse estudante automaticamente, pois ele estara sendo desativado. Trabalhei implementando um metodo espeficico e uma rota para isso.

E para mudar uma matricula em um curso espeficico, ex: de matriculado pra cancelado ou cancelado pra matriculado, também implementei um metodo especifico pra isso. Se um estudante tiver matriculado em varios cursos, ao passar a rota certa do curso que quero mudar o status da matricula, ja mudara de "matriculado" para "cancelado" e vice-versa sem afetar o status na tabela pessoas, "ativo e inativo" e nem afetar outras matriculas em outros cursos.

5 respostas

Segue abaixo as duas implementações no arquivo PessoaController.js:

    // Metodo que alterna o status do estudante entre ativo e inativo 
    // Com base no método HTTP (PUT para ativar, DELETE para desativar)
    async alternarStatusEstudante(req, res) {
      const { estudante_id } = req.params;
      const status = req.method === 'PUT'; // Define true para ativar (PUT), false para desativar (DELETE)

      try {
          // Atualiza o campo 'ativo' do estudante com base no status definido
          await pessoaServices.atualizaRegistro({ ativo: status }, { id: estudante_id });
          
          // Se status é false (DELETE), atualiza também o status das matrículas para 'cancelado'
          if (!status) {
              await pessoaServices.atualizaStatusMatriculas(estudante_id, 'cancelado');
          }

          // Retorna a resposta de sucesso com mensagem baseada no status
          return res.status(200).json({ message: `Estudante ${status ? 'ativado' : 'desativado'} com sucesso.` });
      } catch (erro) {
          // Retorna erro com mensagem específica dependendo do status
          return res.status(500).json({ erro: `Erro ao ${status ? 'ativar' : 'desativar'} estudante` });
      }
    }

    // Metodo que alterna o status da matrícula entre 'matriculado' e 'cancelado'
    // Com base no método HTTP (PATCH para reativar, DELETE para desativar)
    async alternarStatusMatricula(req, res) {
      const { estudante_id } = req.params;
      const { curso_id } = req.query;
      const status = req.method === 'PATCH' ? 'matriculado' : 'cancelado'; // Define o status da matrícula com base no método HTTP

      try {
          // Atualiza o status da matrícula do estudante para o curso especificado
          await pessoaServices.atualizaStatusMatriculas(estudante_id, status, curso_id);

          // Retorna a resposta de sucesso com mensagem baseada no status da matrícula
          return res.status(200).json({ message: `Matrícula ${status === 'matriculado' ? 'reativada' : 'desativada'} com sucesso.` });
      } catch (erro) {
          // Retorna erro com mensagem específica dependendo do status
          return res.status(500).json({ erro: `Erro ao ${status === 'matriculado' ? 'reativar' : 'desativar'} matrícula` });
      }
    }

Implementação no arquivo PessoaService.js :

No PessoaServices.js, adicionei o método atualizaStatusMatriculas, que atualiza o status de todas as matrículas do estudante ou de uma matrícula específica se curso_id for fornecido:

    // Metodo que atualiza o status das matrículas de um estudante, podendo ser para um curso específico ou para todos
    async atualizaStatusMatriculas(estudante_id, novoStatus, curso_id = null) {
        // Define o status como 'matriculado' ou 'cancelado' com base no novoStatus fornecido
        const status = novoStatus === 'matriculado' ? 'matriculado' : 'cancelado';
        
        // Define a cláusula where para selecionar as matrículas a serem atualizadas:
        // Se curso_id for fornecido, aplica a atualização apenas para a matrícula desse curso
        // Se curso_id for null, aplica a atualização para todas as matrículas do estudante
        const whereClause = curso_id 
            ? { estudante_id: estudante_id, curso_id: curso_id } 
            : { estudante_id: estudante_id };

        // Executa a atualização dos registros de matrícula com o status definido
        await this.model.sequelize.models.Matricula.update(
            { status: status },
            { where: whereClause }
        );
    }

Rotas implementadas no Arquivo pessoasRoute.js:

// Rotas para atualizar o status de um estudante (ativo/inativo) na tabela pessoas
router.put('/pessoas/:estudante_id/status', (req, res) => pessoaController.alternarStatusEstudante(req, res));
router.delete('/pessoas/:estudante_id/status', (req, res) => pessoaController.alternarStatusEstudante(req, res));

// Rotas para reativar ou cancelar uma matrícula específica na tabela matriculas
router.patch('/pessoas/:estudante_id/matriculas/status', (req, res) => pessoaController.alternarStatusMatricula(req, res));
router.delete('/pessoas/:estudante_id/matriculas/status', (req, res) => pessoaController.alternarStatusMatricula(req, res));

Ajustes no Service.js:

O método atualizaRegistro foi atualizado para incluir o parâmetro paranoid: false e garantir que a atualização aconteça mesmo em registros que foram marcados como excluídos:

// Método para atualizar um registro existente
async atualizaRegistro(dadosAtualizados, where) {
    const [numRegistrosAtualizados] = await this.model.update(dadosAtualizados, {
        where: where, // apenas o `id` será passado como condição
        paranoid: false // garantir que a atualização ocorra, mesmo em registros soft-deleted
    });

    return numRegistrosAtualizados > 0;
}

Observação sobre Escopo Padrão:

Para implementar essas funcionalidades, foi necessário desativar o defaultScope no modelo Pessoa, pois ele estava filtrando registros apenas para estudantes ativos, o que impedia as atualizações de status em determinados cenários.

Rotas pra testes no Postman:

Rota pra mudar o status de uma matricula para um estudante em um curso específico na tabela matricula, de cancelado para matriculado:

PATCH http://localhost:3000/pessoas/4/matriculas/status?curso_id=1

Rota pra mudar o status de uma matricula para um estudante em um curso específico na tabela matricula, de matriculado pra cancelado:

DELETE http://localhost:3000/pessoas/4/matriculas/status?curso_id=3

====

Rota pra mudar o status de um estudante, para ativo na tabela pessoas: 

PUT http://localhost:3000/pessoas/4/status

Rota pra mudar o status de um estudante para desativado na tabela pessoas e cancelar todas as matriculas na tabela matriculas automaticamente: 

DELETE http://localhost:3000/pessoas/4/status
solução!

Busquei fazer com que a API tivesse uma lógica de controle de status mais robusta e flexível, permitindo o gerenciamento separado de status de estudante e de matrículas. Espero que a documentação ajude! Qualquer sugestão, fico à disposição para discutir.

Oi, José! Como vai?

Obrigada por compartilhar sua implementação com a gente.

Gostei de como você estruturou a lógica de controle de status entre estudantes e matrículas, permitindo flexibilidade ao gerenciar o status de forma independente. A utilização do paranoid: false para atualizar registros soft-deleted foi uma escolha interessante, garantindo que as atualizações ocorram em registros já marcados como excluídos.

Conte com o apoio do Fórum na sua jornada. Abraços e bons estudos!