[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;
}
}