Skip to content

Develop -Alterações no catálogo de vagas, filtros e cacheAlterações no catálogo de vagas, filtros e cache - #257

Open
Benevanio wants to merge 2 commits into
masterfrom
develop
Open

Benevanio wants to merge 2 commits into
masterfrom
develop

Conversation

@Benevanio

Copy link
Copy Markdown
Collaborator

Visão geral

Este conjunto de mudanças amplia o suporte ao catálogo de vagas no Valkey, melhora a paginação e hidratação de documentos, adiciona filtros mais granulares no backend e torna o frontend mais resiliente a respostas obsoletas. Também atualiza o seed local para criar vagas de catálogo e preencher o perfil técnico do usuário dev.

Backend

Cache — backend/src/lib/cache.ts

  • Adicionado o tipo CacheJobsByIdsResult:
    • jobs: vagas encontradas no Valkey.
    • missingIds: IDs do índice sem documento scraper:job:<id> (órfãos).
  • Criada a função cacheGetJobsByIdsDetailed(ids):
    • Hidrata os documentos das vagas.
    • Informa quais IDs estão órfãos.
    • Retorna { jobs: [], missingIds: [] } quando não há IDs.
  • cacheGetJobsByIds agora delega para cacheGetJobsByIdsDetailed.
  • Criada cacheRemoveJobIndexIds(ids):
    • Remove IDs órfãos do índice global scraper:jobs:index.
    • Usa sRem e registra a operação.
    • Espelha o auto-reparo já feito pelo scraper Go.

Filtros — backend/src/modules/jobs/filters/jobSearch.filter.ts

  • Inferência de localização refatorada para inferJobLocationParts, retornando:
    • country
    • continent
    • location
    • state
    • city
  • Adicionadas regras de localização para diversos países e continentes:
    • Brasil, EUA, Canadá, México, Argentina, Chile, Colômbia, Portugal, Espanha, Reino Unido, França, Alemanha, Países Baixos, Índia, Singapura, Austrália, Nova Zelândia e África do Sul.
  • Adicionados estados brasileiros e cidades conhecidas.
  • Criado inferJobContract para detectar:
    • cooperado
    • pj
    • clt
  • filterJobs agora aceita e combina:
    • continent
    • state
    • city
    • contract
    • company
  • Mantido o comportamento de combinação com AND e retorno antecipado quando não há filtros.

Parser — backend/src/modules/jobs/parsers/jobSearchQuery.parser.ts

  • Adicionado suporte ao filtro company.
  • Criado hasPostOnlyFilters, que indica quando a busca depende de pós-filtragem.

Serviço de busca — backend/src/modules/jobs/services/searchJobs.service.ts

  • Adicionado MAX_HYDRATION_WINDOWS = 10.
  • Criada hydrateIndexPage:
    • Preenche a página avançando no índice quando há IDs órfãos.
    • Coleta missingIds.
    • Remove órfãos do índice global.
    • Calcula total real descontando órfãos.
  • Criada removeOrphanIds:
    • Chama cacheRemoveJobIndexIds.
    • Registra aviso em caso de falha sem quebrar a requisição.
  • Criada orderIdsByProfileRelevance:
    • Usa as tecnologias do perfil do candidato.
    • Prioriza vagas compatíveis com o perfil.
  • A busca com filtro apenas de empresa usa pós-filtro.
  • A busca normal usa hidratação paginada e ranking por perfil quando há match.

Tipos — backend/src/modules/jobs/types/jobSearch.types.ts

  • SearchJob ganhou company?: string | null.
  • ParsedJobSearchQuery ganhou company: string[].

Seed

  • backend/src/scripts/seed.ts:
    • Usuário dev agora recebe perfil técnico:
      • React, TypeScript, Node.js, PostgreSQL, Docker e AWS.
    • Nível definido como Pleno.
    • Adicionada criptografia de tecnologias, experiências e nível.
    • Usuário existente tem o perfil técnico atualizado.
    • Executa seedCatalogJobs() no final.
  • Novo arquivo backend/src/scripts/seedCatalogJobs.ts:
    • Cria 12 vagas de catálogo no Valkey.
    • Gera índices invertidos equivalentes aos do scraper.
    • Ordena as vagas por match com o perfil dev, de 99% a 45%.
    • Ignorado com aviso quando VALKEY_URL não está definida.

Docker

  • docker-compose.migrate.yml:
    • Adicionada a variável VALKEY_URL: redis://valkey:6379/0.

Frontend

frontend/src/domains/jobs/application/useJobsData.ts

  • Adicionado requestIdRef para sequenciar requisições.
  • Respostas antigas não sobrescrevem mais a lista exibida.
  • setLoading(false) só ocorre se a requisição ainda for a mais recente.

frontend/src/domains/new_dashboard/NewDashboardPage.tsx

  • Removido o filtro local de modelo (modelFilterMatchesJob).
  • O backend já aplica o filtro de modelo.
  • Evita esconder vagas já filtradas e quebrar a contagem da página.
  • O match só é recalculado localmente quando a API não devolveu score.

frontend/src/domains/new_dashboard/hooks/useDashboardJobs.ts

  • Adicionado recommendationRequestIdRef.
  • Garante que apenas a resposta mais recente escreva nos estados de recomendação.
  • Erros e estados de carregamento ignoram respostas obsoletas.

frontend/src/domains/new_dashboard/infrastructure/dashboardJobsApi.ts

  • SearchJobFilters expandido com:
    • seniority
    • state
    • city
    • family
    • technology
    • company
  • Criado buildFilterParams:
    • Remove filtros vazios ou nulos.
    • Evita enviar parâmetros desnecessários.
  • toRecommendedJob não inventa mais matchScore:
    • Usa o valor do backend quando disponível.
    • Caso contrário, usa 0.

Testes

  • backend/tests/unit/app.test.ts:
    • Mocks para cacheGetJobsByIdsDetailed e cacheRemoveJobIndexIds.
    • Ajustes no teste de paginação.
  • backend/tests/unit/libs/cache.test.ts:
    • Testes para cacheGetJobsByIdsDetailed e cacheRemoveJobIndexIds.
  • backend/tests/unit/modules/jobs/jobSearch.filter.test.ts:
    • Novos testes para localização, contrato, empresa, continente, estado, cidade, tecnologia, família, senioridade, modalidade e ordenação.
  • backend/tests/unit/modules/jobs/searchJobs.service.test.ts:
    • Testes de hidratação do índice, remoção de órfãos, limite de janelas, paginação, pós-filtro e priorização por perfil.
  • backend/tests/unit/scripts/seedCatalogJobs.test.ts:
    • Valida match esperado, ordenação, índices invertidos e unicidade de IDs/URLs.

Documentação e dicionário

  • LOCAL_DEVELOPMENT.md:
    • Atualizado para descrever o novo seed, as 12 vagas de catálogo e o comportamento da aba /vagas.
  • .cspell/custom-dictionary-workspace.txt:
    • Adicionadas palavras como orfao, indice, hidratacao, scraper, srem, estagio, compativel, paginacao, senioridade, modalidade, localizacao.

Impacto esperado

  • Listagem de vagas mais consistente mesmo com IDs órfãos no Valkey.
  • Paginação e total alinhados com os documentos realmente disponíveis.
  • Filtros mais granulares sem depender exclusivamente dos índices do scraper.
  • Frontend sem condições de corrida ao trocar filtros ou páginas.
  • Seed local mais realista para desenvolvimento e testes.

Benevanio and others added 2 commits September 28, 2026 17:51
## O que foi feito?

Implementado sistema robusto de busca e filtro de vagas com suporte a
índices invertidos no Valkey, detecção e auto-reparo de documentos
órfãos, seed de catálogo com vagas calibradas para match de perfil, e
filtros granulares por localização (país, continente, estado, cidade),
contrato, empresa e senioridade. A busca utiliza índice global
(`scraper:jobs:index`) como fonte primária, hidratando documentos em
janelas de até 10 fatias para evitar varredura completa em índices
grandes. IDs sem documento correspondente no Valkey são detectados,
removidos do índice automaticamente (auto-reparo espelhando scraper-go),
e contabilizados no total retornado. Filtros estruturados (país,
tecnologia, família, senioridade) usam índices invertidos
(`scraper:jobs:*`) quando disponíveis; filtros post-only como empresa
caem no caminho fallback de busca full-scan seguida de pós-filtro em
memória. Perfis técnicos do usuário agora são hidratados no seed com
tecnologias e nível, permitindo priorização de vagas compatíveis:
`cacheSearchKeywords()` retorna IDs de vagas que casam com o perfil do
candidato, reordenando resultados de maior para menor match. Infer de
localização foi refatorado em tabela declarativa (`LOCATION_RULES`,
`BRAZILIAN_STATES`, `KNOWN_CITIES`), espelhando estrutura do scraper Go
para consistência bit-a-bit. Novo método `inferJobContract()` classifica
vagas como CLT, PJ ou cooperado a partir de título, descrição e
localização. Interface `SearchJobFilters` expandida com novos campos:
`seniority`, `state`, `city`, `contract`, `family`, `technology`,
`company`. Frontend removeu recalcular match quando backend já forneceu
`matchScore`, e eliminou re-filtro client-side por modelo (quebrava
paginação). Seed de desenvolvimento cria 12 vagas em catálogo calibradas
de 99% a 45% match com perfil técnico do dev (`React`, `TypeScript`,
`Node.js`, `PostgreSQL`, `Docker`, `AWS`), e atualiza perfil técnico se
usuário existir. Testes unitários cobrem: hidratação de páginas com
órfãos, auto-reparo, limite de esforço (max 10 janelas), priorização por
perfil, pós-filtro por empresa e contrato, e matching de regras de
localização. Nova função `buildFilterParams()` remove filtros vazios
antes de enviar, evitando cache poisoning. Sem mudança no contrato HTTP;
apenas refactor de busca, hidratação e seed.

## Documentos alterados

- `.cspell/custom-dictionary-workspace.txt` [change]
- `LOCAL_DEVELOPMENT.md` [change]
- `backend/src/lib/cache.ts` [change]
- `backend/src/modules/jobs/filters/jobSearch.filter.ts` [change]
- `backend/src/modules/jobs/parsers/jobSearchQuery.parser.ts` [change]
- `backend/src/modules/jobs/services/searchJobs.service.ts` [change]
- `backend/src/modules/jobs/types/jobSearch.types.ts` [change]
- `backend/src/scripts/seed.ts` [change]
- `backend/src/scripts/seedCatalogJobs.ts` [add]
- `backend/tests/unit/app.test.ts` [change]
- `backend/tests/unit/libs/cache.test.ts` [change]
- `backend/tests/unit/modules/jobs/jobSearch.filter.test.ts` [add]
- `backend/tests/unit/modules/jobs/searchJobs.service.test.ts` [add]
- `backend/tests/unit/scripts/seedCatalogJobs.test.ts` [add]
- `docker-compose.migrate.yml` [change]
- `frontend/src/domains/jobs/application/useJobsData.ts` [change]
- `frontend/src/domains/new_dashboard/NewDashboardPage.tsx` [change]
- `frontend/src/domains/new_dashboard/hooks/useDashboardJobs.ts`
[change]
-
`frontend/src/domains/new_dashboard/infrastructure/dashboardJobsApi.ts`
[change]

## Checklist

- [x] Testado?
- [x] Documentado?
- [x] Build passando?

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant