Pular para o conteúdo principal

Status: Approved · v2 · SPEC-DOMAIN-SEARCH-001

depends_on: SPEC-DOMAIN-TERRITORY-001, SPEC-DOMAIN-PLAYER-001, SPEC-DOMAIN-TEAM-001

used_by: IS-MVP-03.1, IS-MVP-03.2, IS-MVP-03.3

Busca e descoberta

Busca universal pública, filtros por tipo e descoberta territorial neutra.

Objetivo e limites

Esta especificação define o comportamento canônico do domínio Busca e descoberta no RaizFC. Ela deve ser consultada antes de alterar contratos, mocks, endpoints, telas, permissões ou Increment Specifications relacionados.

Incluído no MVP

  • Busca universal por texto.
  • Tipos player, team, championship, torcida, field, service, district, neighborhood e match.
  • Filtros avançados por tipo.
  • Sugestões/autocomplete.
  • Descoberta por distrito/bairro.

Fora do MVP

  • Busca semântica por IA.
  • Mapa/raio.
  • Boost pago.
  • Recomendação personalizada avançada.

Atores e responsabilidades

AtorResponsabilidade
VisitanteBusca entidades públicas.
UsuárioRecebe descoberta contextual e histórico opcional.
GestorEncontra jogadores, times e serviços para fluxos de gestão.
SistemaIndexa DTOs públicos e aplica privacidade/status.

Conceitos canônicos

Search Document

Representação pública indexável.

Consulta agregada multi-tipo.

Discovery Section

Coleção editorial/algorítmica por território e atividade.

Search Badge

Contexto como Provisório, Livre, Final ou Abandonado.

Invariantes

  • Somente dados públicos e permitidos entram no índice.
  • Patrocínio não altera ordenação.
  • Entidade suspended não aparece.
  • Abandoned pode aparecer com prioridade menor e badge.
  • Draft de campeonato não aparece.
  • Jogador privado não aparece.
  • Ordenação combina relevância textual, atividade/confiabilidade e contexto, sem substituir filtros explícitos.

Estados

EstadoSignificadoVisibilidade/efeito
indexedDisponívelBusca normal.
hiddenNão indexávelPrivacidade/status.
staleAguardando atualizaçãoPode usar último snapshot com cautela.
removedExcluído do índiceNão retorna.

Transições permitidas

OrigemAçãoDestinoAutoridadeEfeitos
indexindexedIndexerCria documento.
indexedhidehiddenPrivacidade/statusRemove resultados.
indexedmark_stalestaleSistemaAgenda rebuild.
anyremoveremovedIndexerExclui.

Permissões

Permission keyQuem recebe por padrãoAção protegidaAuditoria
search.publicPúblicoBuscar DTOs públicosNão
search.managementContextGestorBusca contextual adicionalNão
search.reindexSistema/operaçãoReindexarSim

Fluxos funcionais

Busca universal

  1. Cliente envia q, types, território e paginação.
  2. Backend normaliza consulta.
  3. Aplica filtros de status/privacidade.
  4. Busca índices/queries por tipo.
  5. Unifica resultados em SearchResultDto com score interno.
  6. Retorna grupos/ordem e sugestões.

Busca de jogadores

  1. Filtros incluem posição, distrito, status livre, time, stats públicas e período.
  2. Métricas derivadas usam partidas validadas.
  3. Ordenação por média só aparece quando amostra mínima é satisfeita.

Descoberta territorial

  1. Página de distrito/bairro pede coleções de times, jogos, campeonatos, torcidas e serviços.
  2. Ordenação prioriza atividade recente e confiabilidade, não pagamento.

Casos-limite e erros

CenárioComportamento esperadoCódigo/estado
Query vaziaRetornar sugestões/descoberta, não erro
Filtro inválidoValidation error por campoVALIDATION_ERROR
Entidade mergedRetornar canônica/redirectENTITY_MERGED
Stats privadasIgnorar filtro/resultado que exigiria exposiçãoPRIVACY_FILTERED
Página além do fimLista vazia com meta válida

Privacidade e exposição pública

  • Histórico de busca do usuário não é público.
  • Autocomplete não revela e-mail/telefone.
  • Filtros de stats respeitam privacidade.
  • Busca de gestão pode retornar mais contexto somente após permission check.

Notificações e auditoria

  • Não gera notificações comuns.
  • Mudança de status/privacidade dispara reindex interno e observabilidade.

API relacionada

MétodoRotaAcessoFinalidade
GET/api/v1/searchPúblicoUniversal
GET/api/v1/search/suggestionsPúblicoAutocomplete
GET/api/v1/search/teamsPúblicoTimes
GET/api/v1/search/playersPúblicoJogadores
GET/api/v1/search/matchesPúblicoPartidas
GET/api/v1/search/championshipsPúblicoCampeonatos
GET/api/v1/search/torcidasPúblicoTorcidas
GET/api/v1/search/fieldsPúblicoCampos
GET/api/v1/search/servicesPúblicoServiços
GET/api/v1/districts/:id/discoveryPúblicoDescoberta

Contratos compartilhados

  • SearchResultType
  • SearchResultDto
  • SearchBadgeDto
  • UniversalSearchQuery/Response
  • TeamSearchFilters
  • PlayerSearchFilters
  • MatchSearchFilters
  • DiscoverySectionDto

Requisitos de UX

  • Aba Buscar inicia universal e permite trocar tipo sem perder query.
  • Filtros aparecem em bottom sheet no mobile e painel lateral no desktop.
  • Resultados deixam claro tipo, território, badges e métricas relevantes.
  • Busca vazia oferece descoberta territorial.

Comportamento dos mocks

  • Resultados multi-tipo.
  • Empty, typo/suggestions, suspended filtered, abandoned badge, private player.
  • Filtros funcionais, não apenas decorativos.

Critérios de aceite

  • Público sem login.
  • Privacidade/status respeitados.
  • Sem boost pago.
  • Filtros por tipo.
  • Paginação/meta consistente.

Testes obrigatórios

  • Index visibility.
  • Relevância básica.
  • Filtros.
  • Merged/suspended/private.
  • Universal aggregation.
  • Pagination.

Pós-MVP

  • Busca semântica, geográfica, recomendação e mapas.

Decisões registradas

  • Busca é neutra.
  • Território é filtro central.
  • Patrocínio não compra posição.

Machine summary

spec: SPEC-DOMAIN-SEARCH-001
domain: Busca e descoberta
must_preserve:
- Somente dados públicos e permitidos entram no índice.
- Patrocínio não altera ordenação.
- Entidade suspended não aparece.
- Abandoned pode aparecer com prioridade menor e badge.
- Draft de campeonato não aparece.
- Jogador privado não aparece.
- Ordenação combina relevância textual, atividade/confiabilidade e contexto, sem substituir filtros explícitos.
touches:
- contracts
- mocks
- api
- frontend
- backend
- tests
- documentation