Open
Conversation
## 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?
Benevanio
requested review from
hltav,
nayarakarinesilva and
pedrosilvaadev
as code owners
September 28, 2026 23:38
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.tsCacheJobsByIdsResult:jobs: vagas encontradas no Valkey.missingIds: IDs do índice sem documentoscraper:job:<id>(órfãos).cacheGetJobsByIdsDetailed(ids):{ jobs: [], missingIds: [] }quando não há IDs.cacheGetJobsByIdsagora delega paracacheGetJobsByIdsDetailed.cacheRemoveJobIndexIds(ids):scraper:jobs:index.sReme registra a operação.Filtros —
backend/src/modules/jobs/filters/jobSearch.filter.tsinferJobLocationParts, retornando:countrycontinentlocationstatecityinferJobContractpara detectar:cooperadopjcltfilterJobsagora aceita e combina:continentstatecitycontractcompanyANDe retorno antecipado quando não há filtros.Parser —
backend/src/modules/jobs/parsers/jobSearchQuery.parser.tscompany.hasPostOnlyFilters, que indica quando a busca depende de pós-filtragem.Serviço de busca —
backend/src/modules/jobs/services/searchJobs.service.tsMAX_HYDRATION_WINDOWS = 10.hydrateIndexPage:missingIds.removeOrphanIds:cacheRemoveJobIndexIds.orderIdsByProfileRelevance:Tipos —
backend/src/modules/jobs/types/jobSearch.types.tsSearchJobganhoucompany?: string | null.ParsedJobSearchQueryganhoucompany: string[].Seed
backend/src/scripts/seed.ts:devagora recebe perfil técnico:Pleno.seedCatalogJobs()no final.backend/src/scripts/seedCatalogJobs.ts:dev, de 99% a 45%.VALKEY_URLnão está definida.Docker
docker-compose.migrate.yml:VALKEY_URL: redis://valkey:6379/0.Frontend
frontend/src/domains/jobs/application/useJobsData.tsrequestIdRefpara sequenciar requisições.setLoading(false)só ocorre se a requisição ainda for a mais recente.frontend/src/domains/new_dashboard/NewDashboardPage.tsxmodelFilterMatchesJob).frontend/src/domains/new_dashboard/hooks/useDashboardJobs.tsrecommendationRequestIdRef.frontend/src/domains/new_dashboard/infrastructure/dashboardJobsApi.tsSearchJobFiltersexpandido com:senioritystatecityfamilytechnologycompanybuildFilterParams:toRecommendedJobnão inventa maismatchScore:0.Testes
backend/tests/unit/app.test.ts:cacheGetJobsByIdsDetailedecacheRemoveJobIndexIds.backend/tests/unit/libs/cache.test.ts:cacheGetJobsByIdsDetailedecacheRemoveJobIndexIds.backend/tests/unit/modules/jobs/jobSearch.filter.test.ts:backend/tests/unit/modules/jobs/searchJobs.service.test.ts:backend/tests/unit/scripts/seedCatalogJobs.test.ts:Documentação e dicionário
LOCAL_DEVELOPMENT.md:/vagas..cspell/custom-dictionary-workspace.txt:orfao,indice,hidratacao,scraper,srem,estagio,compativel,paginacao,senioridade,modalidade,localizacao.Impacto esperado