Documentação

CurvaDeMana Docs

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.