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));