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

Funcionalidade na API: Busca de Cursos por Data ou Intervalo de Datas

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!

2 respostas
solução!

Praticando sempre, espero estar evoluindo e ter ajudado alguem com duvida.

Oi, José! Como vai?

Obrigada por compartilhar seu código com a comunidade Alura.

Muito bom como você utilizou o Op para condicionar a busca, garantindo flexibilidade ao permitir tanto uma data específica quanto um intervalo de datas. Essa abordagem facilita bastante a consulta ao banco de dados e mantém o código limpo.

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