Motor de busca
Como os filtros viram consultas no PostgreSQL.
Atualizado em 11 de junho de 2026
O motor de busca vive em src/lib/search.ts. Ele converte os parâmetros da URL em um objeto where e um orderBy do Prisma, que o PostgreSQL executa.
Da URL à consulta
Cada filtro vira uma condição que é acumulada em uma lista e combinada com AND. Campos de texto usam contains sem diferenciar maiúsculas; faixas de CMV usam gte e lte; raridade usa in; legalidade consulta o campo JSON pela chave do formato.
A lógica das cores
As cores merecem cuidado porque a Scryfall as guarda em ordem alfabética, não na ordem clássica WUBRG. Por isso a comparação é feita por conjunto, não por igualdade de lista. Os três modos:
Contém
Usa hasEvery: a carta precisa ter todas as cores marcadas.
Exatamente essas cores
Combina hasEvery com a negação das demais cores. A carta precisa ter todas as marcadas e nenhuma das outras. É imune à ordem do array, detalhe que causou um bug real no início e levou a esta abordagem.
Identidade de cor
Garante que a identidade da carta caiba na seleção, negando qualquer cor fora dela. É a regra de construção de Commander.
Ordenação
A ordenação por popularidade usa o ranking do EDHREC com os nulos por último, de modo que cartas sem ranking não poluam o topo. As demais ordens (nome, custo de mana, lançamento) seguem o mesmo cuidado com nulos onde faz sentido.
Paginação
A busca usa paginação por deslocamento (skip e take), com um tamanho de página fixo, e roda em paralelo a contagem total e a página atual de resultados para montar a navegação.
Reuso
O mesmo motor alimenta a página /cartas e a busca instantânea do deck builder e da coleção, que apenas acrescentam o recorte por identidade de cor quando há um comandante definido.