Executando verificação de segurança...
1

[Dúvida] Querys com muitos campos em monolito

Tenho uma aplicação desenvolvida em nextjs que disponibiliza e consome uma API consumindo uma tabela de um banco Postgres. Meu dilema é: Estou passando os parâmetros da consulta diretamente no endpoint, exemplo: faço uma requisição GET no endpoint localhost:3000/api/cursos?nome=Direito&faculdade=Unime&turno=noite , mas não consigo criar uma dinâmica que, caso passe apenas um parâmetro apenas, ele consiga fazer a consulta. Existe alguma dinâmica já consolidada na comunidade dev? É mais viável fazer o get com todos os cursos em um grande array de cursos e filtrar no front?

const pool = require('../../models/conectarAoBanco');
export default async function cursos(req, res) {
const metodo = req.method; 
switch (metodo) {
  case "GET":
    const { pagina, tipo, nome, faculdade, cidade, pretencao, presencial, hibrido, online, nivel, turno } = req.query;
    let queryParams = [];
    let whereClause = '';
    if (nome) {
      whereClause += `cursos.nome ILIKE '%$${queryParams.length + 1}%' AND `;
      queryParams.push(nome);
    }
    if (faculdade) {
      whereClause += `parceiros.nome ILIKE '%$${queryParams.length + 1}%' AND `;
      queryParams.push(faculdade);
    }
    whereClause = whereClause.slice(0, -5);
    try {
      const {rows} = await pool.query(`
      SELECT
          cursos.id AS id_curso, 
          cursos.nome AS curso_nome,
          cursos.nivel,
          cursos.preco,
          cursos.modalidade,
          cursos.mais_cursado,
          cursos.em_promocao,
          cursos.desconto_porcentagem,
          cursos.url_localizacao_mapa,
          cursos.alta_empregabilidade,
          cursos.sobre,
          cursos.estado,
          cursos.cidade,
          cursos.endereco,
          cursos.latitude,
          cursos.longitude,
          cursos.semestres,
          cursos.inicio,
          cursos.economia_total,
          cursos.turno, 
          cursos.cidade, 
          cursos.caminho_imagem AS caminho_imagem_curso,
          CEIL(cursos.preco * ((100 - desconto_porcentagem) / 100)) AS preco_com_desconto,
          parceiros.id AS id_parceiro,
          parceiros.nome AS parceiro_nome,
          parceiros.caminho_imagem,
          parceiros.sobre_faculdade,
          parceiros.sobre_campus,
          parceiros.sobre_ead,
          parceiros.sobre_presencial,
          parceiros.recomendacao_porcentagem,
          parceiros.preco_curso_mais_barato
      FROM
          cursos
      JOIN
          parceiros ON cursos.id_parceiro = parceiros.id
      ${whereClause ? ' WHERE ' + whereClause : ''}  
      `, queryParams)
      
        res.status(200).json(rows);
    } catch(err) {
        res.status(200).json(err); 
    }
    console.log(queryParams)
    console.log(whereClause)
  break;
  case "POST": 
    res.status(200).send(`Dados inseridos com sucesso!`);
  break;
  case "PUT":
    res.status(200).json("Funciona Também!!!")
  break;
  case "DELETE":
    res.status(200).json("Funciona Também!!!")
  break;
  default:
    res.status(200).json("Método HTTP desconhecido");
  break;
}
}
Carregando publicação patrocinada...
2

Para esse tipo de pesquisa existem query builders. Procure por bibliotecas do tipo ou crie você mesmo. Dever ser bem simples de implementar. Se prevê outras queries similares no futuro tente manter a estrutura genérica para qualquer query select.

2

E agora que vi seu código: sob hipótese alguma faça string interpolation de uma query onde o usuário pode inserir qualquer dado. Isso pode acarretar em SQL injection. Sempre passe como a biblioteca indica. Ela tem o tratamento necessário para evitar esse tipo de vulnerabilidade.