Resolvi implementar essa funcionalidade na API, de uma forma diferente da apresentada em aula. A busca de cursos por uma data específica ou em um intervalo de datas. Escolhi fazer a implementação de uma forma diferente da apresentada no curso para explorar outras maneiras de resolver o problema. Fui buscando, fazendo mudanças até chegar no resultado esperado. É possível fazer requisições usando a data de início para listar cursos em um dia específico ou em um intervalo definido de datas, mas de forma simples e rapida, busquei fazer um codigo limpo e robusto.
Metodo implementado no arquivo CursoController.js:
// Método unificado para buscar cursos por data ou intervalo de datas
async pegaPorDataOuIntervalo(req, res) {
const { dataInicio, dataFim } = req.params; // Obtendo as datas a partir dos parâmetros da requisição
try {
// Usando o método unificado no cursoServices para data ou intervalo de datas
const cursos = await cursoServices.pegaPorDataOuIntervalo(dataInicio, dataFim);
if (cursos.length === 0) {
return res.status(404).json({ mensagem: 'Nenhum curso encontrado para a(s) data(s) fornecida(s).' });
}
return res.status(200).json(cursos); // Retorna os cursos encontrados
} catch (error) {
return res.status(500).json({ mensagem: 'Erro ao buscar dados', erro: error.message });
}
}
No arquivo CursoServices.js :
const { Op } = require('sequelize'); // Importando Op para usar operadores do Sequelize, antes da classe
// Método genérico para buscar cursos por data ou intervalo de datas
async pegaPorDataOuIntervalo(dataInicio, dataFim = null) {
const condicoes = dataFim ? {
data_inicio: {
[Op.gte]: new Date(dataInicio), // Data inicial (maior ou igual)
[Op.lte]: new Date(dataFim) // Data final (menor ou igual)
}
} : {
data_inicio: dataInicio // Filtra os cursos pela data de início
};
return this.model.findAll({ where: condicoes });
}
Criei uma nova rota no arquivo cursosRoute.js :
// Rota para buscar cursos por data de início ou intervalo de datas
router.get('/cursos/data/:dataInicio/:dataFim?', (req, res) => cursoController.pegaPorDataOuIntervalo(req, res));
Fiz algumas mudanças e refatoração no arquivo Service.js :
class Service {
// O construtor recebe o nome do modelo para ser usado nas operações do service
constructor(nomeDoModel) {
this.model = dataSource[nomeDoModel]; // Atribui o modelo Sequelize correto
}
// Método genérico para buscar todos os registros de um determinado modelo
async pegaTodosOsRegistros() {
// Utiliza o Sequelize para buscar todos os registros da tabela correspondente
return this.model.findAll();
}
// Método para buscar um único registro pelo ID
async pegaUmRegistroPorId(id) {
// Usa findByPk para localizar um registro pela chave primária (ID)
return this.model.findByPk(id);
}
//Serviço para buscar uma matricula pelo id
async pegaUmRegistro(where) {
return this.model.findOne({ where: { ...where } });
}
// Metodo para buscar um registro pelo scopo.
async pegaRegistrosPorEscopo(escopo) {
return this.model.scope(escopo).findAll();
}
// Método para criar um novo registro no banco de dados
async criaRegistro(dadosDoRegistro) {
return this.model.create(dadosDoRegistro);
}
// Método para atualizar um registro existente
async atualizaRegistro(dadosAtualizados, where) {
// Atualiza o registro onde o ID for correspondente
const listadeRegistrosAtualizados = await this.model.update(dadosAtualizados, {
where: { ...where }
});
// Se nenhum registro for atualizado, retorna falso
if (listadeRegistrosAtualizados[0] === 0) {
return false;
}
// Retorna verdadeiro se a atualização for bem-sucedida
return true;
}
// Método para excluir um registro do banco de dados
async excluiRegistro(id) {
return this.model.destroy({ where: { id: id } });
}
}
Urls para testes das datas no postman:
Buscar por data específica: GET localhost:3000/cursos/data/2023-05-01
Buscar por intervalo de datas: GET localhost:3000/cursos/data/2023-01-01/2023-05-01
Assim, qualquer usuário pode encontrar cursos por um dia exato ou em períodos flexíveis, facilitando a visualização dos dados. Em breve trago mais atualizações!