PAV-128 — Correção do coverage do sistema - #259
Merged
Merged
Conversation
…o catálogo de vagas, filtros e cache (#257) ## 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.
## Linear Issue: PAV-___ ## Branch flow - [x] Este PR é uma feature/fix/chore destinada a `develop`. - [ ] Este PR não contém alteração direta ou fluxo indevido para `master`. - [ ] A branch foi criada a partir da base prevista pelo fluxo do projeto. ## Objetivo Descreva objetivamente o problema resolvido por esta PR. ## Escopo O que faz parte desta entrega: - O que está fora do escopo: - ## Resumo das alterações - ## Arquivos e módulos afetados - ## Como testar ```bash # comandos de validação ``` ## Validation - [ ] Lint executado - [ ] Testes relevantes executados - [ ] Coverage permanece dentro do mínimo do projeto - [ ] Build executado quando aplicável - [ ] Validação manual realizada quando aplicável - [ ] Documentação atualizada quando necessária ## Impacto de banco / migration - [ ] Não altera schema nem migrations - [ ] Altera schema ou migrations Detalhes: ## Impacto em contratos/API - [ ] Não altera contratos - [ ] Altera endpoint, payload, schema ou comportamento de API Detalhes: ## Impacto de configuração / infraestrutura - [ ] Não altera configuração - [ ] Altera env, Docker, filas, cache, serviços ou infraestrutura Detalhes: ## Impacto de segurança - [ ] Sem impacto relevante - [ ] Impacto de segurança avaliado Detalhes: ## Impacto de dados pessoais / privacidade - [ ] Sem tratamento novo ou alteração de dados pessoais - [ ] Impacto avaliado Detalhes: ## Compatibilidade / dependências - [ ] Não depende de outra task/PR - [ ] Existe dependência ou ordem de deploy/merge Detalhes: ## Evidências Adicione logs, screenshots, links de execução ou outra evidência relevante. ## Riscos - ## Rollback Descreva como a alteração pode ser revertida com segurança. ## Checklist final - [ ] Escopo limitado ao card - [ ] Não inclui segredos, `.env`, certificados ou tokens - [ ] Não inclui arquivos temporários, builds, caches ou artefatos desnecessários - [ ] Não executa deploy como efeito desta PR - [ ] Critérios de aceite do card foram conferidos individualmente - [ ] Alterações de contrato possuem testes e documentação correspondentes - [ ] Alterações em banco/migrations foram validadas quando aplicável > Consulte o guia de contribuição do projeto para as regras completas.
Benevanio
requested review from
hltav,
nayarakarinesilva and
pedrosilvaadev
as code owners
October 1, 2026 01:27
nayarakarinesilva
approved these changes
Oct 1, 2026
hltav
approved these changes
Oct 1, 2026
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.
Linear
Issue: PAV-128
Branch flow
develop.master.Objetivo
Corrigir e ampliar o coverage do sistema após as alterações no catálogo de vagas, filtros e cache, adicionando testes para fluxos críticos de backend, painel admin e frontend, e estabilizando a execução da suíte do front_admin.
Escopo
O que faz parte desta entrega:
front_adminpara layouts, dashboard, observabilidade, permissões, scrapers e usuários.frontendpara schemas do novo dashboard, utils,HelpTabe ajuste de mocks de login.front_admin(maxWorkers: 2).O que está fora do escopo:
Resumo das alterações
list,create,update,delete) e testes unitários doApplicationNotesServicecom validação de ownership e escopo por usuário/vaga/nota.GET /jobs/searchcobrindo filtros, cache, fallback legacy, paginação e match score; ampliação do teste dosearchJobs.service; novo teste doJobProfileMatchService.backfillUserPii(dry-run e--write) e paraseed.NotificationButton,SidebarFooter,TimeFilter,DashboardPage,PlatformChart, hooks do dashboard,ObservabilityPage/ObservabilityPanelCard,PermissionsPage,ScrapersPage/useScrapers,UsersPageeUserList.jobModelFilters,locationFilters,searchKeywords),HelpTabe ajuste de testes de loading do login.front_admin/vite.config.tscommaxWorkers: 2.Arquivos e módulos afetados
backend/tests/integration/routes/savedJobs.routes.test.tsbackend/tests/integration/routes/searchJobs.routes.test.tsbackend/tests/unit/modules/jobs/jobProfileMatch.service.test.tsbackend/tests/unit/modules/jobs/searchJobs.service.test.tsbackend/tests/unit/modules/savedJobs/applicationNotes.service.test.tsbackend/tests/unit/scripts/backfillUserPii.test.tsbackend/tests/unit/scripts/seed.test.tsfront_admin/tests/app/layouts/**front_admin/tests/modules/**front_admin/vite.config.tsfrontend/tests/unit/components/login/RigthSide.test.tsxfrontend/tests/unit/new_dashboard/**Como testar
Validation
Impacto de banco / migration
Detalhes: N/A
Impacto em contratos/API
Detalhes: N/A — os testes apenas validam contratos existentes.
Impacto de configuração / infraestrutura
Detalhes: ajuste em
front_admin/vite.config.tsadicionandomaxWorkers: 2para estabilizar a execução paralela dos testes. Sem impacto em runtime de produção.Impacto de segurança
Detalhes: os testes de
backfillUserPiiapenas exercitam a criptografia/hash de PII já existente; nenhuma mudança em lógica de segurança.Impacto de dados pessoais / privacidade
Detalhes: os testes utilizam dados fictícios (fixtures) para validar o pipeline de PII já existente.
Compatibilidade / dependências
Detalhes: N/A
Evidências
npm run test:coverage(backend, front_admin, frontend) anexada na thread do card/PR.Develop - Alterações no catálogo de vagas, filtros e cache,Develop (#258),feat(PAV-128): correção do coverage do sistema.Riscos
maxWorkers: 2nofront_admin(trade-off para estabilidade).Rollback
Reverter o merge deste PR restaura o estado anterior dos testes e da configuração do Vitest. Como não há alterações de produção, o rollback é seguro e não impacta dados, contratos ou infraestrutura.
Checklist final
.env, certificados ou tokensLinear
Issue: PAV-128
Branch flow
develop.master.Objetivo
Corrigir e ampliar o coverage do sistema após as alterações no catálogo de vagas, filtros e cache, adicionando testes para fluxos críticos de backend, painel admin e frontend, e estabilizando a execução da suíte do front_admin.
Escopo
O que faz parte desta entrega:
front_adminpara layouts, dashboard, observabilidade, permissões, scrapers e usuários.frontendpara schemas do novo dashboard, utils,HelpTabe ajuste de mocks de login.front_admin(maxWorkers: 2).O que está fora do escopo:
Resumo das alterações
list,create,update,delete) e testes unitários doApplicationNotesServicecom validação de ownership e escopo por usuário/vaga/nota.GET /jobs/searchcobrindo filtros, cache, fallback legacy, paginação e match score; ampliação do teste dosearchJobs.service; novo teste doJobProfileMatchService.backfillUserPii(dry-run e--write) e paraseed.NotificationButton,SidebarFooter,TimeFilter,DashboardPage,PlatformChart, hooks do dashboard,ObservabilityPage/ObservabilityPanelCard,PermissionsPage,ScrapersPage/useScrapers,UsersPageeUserList.jobModelFilters,locationFilters,searchKeywords),HelpTabe ajuste de testes de loading do login.front_admin/vite.config.tscommaxWorkers: 2.Arquivos e módulos afetados
backend/tests/integration/routes/savedJobs.routes.test.tsbackend/tests/integration/routes/searchJobs.routes.test.tsbackend/tests/unit/modules/jobs/jobProfileMatch.service.test.tsbackend/tests/unit/modules/jobs/searchJobs.service.test.tsbackend/tests/unit/modules/savedJobs/applicationNotes.service.test.tsbackend/tests/unit/scripts/backfillUserPii.test.tsbackend/tests/unit/scripts/seed.test.tsfront_admin/tests/app/layouts/**front_admin/tests/modules/**front_admin/vite.config.tsfrontend/tests/unit/components/login/RigthSide.test.tsxfrontend/tests/unit/new_dashboard/**Como testar
Validation
Impacto de banco / migration
Detalhes: N/A
Impacto em contratos/API
Detalhes: N/A — os testes apenas validam contratos existentes.
Impacto de configuração / infraestrutura
Detalhes: ajuste em
front_admin/vite.config.tsadicionandomaxWorkers: 2para estabilizar a execução paralela dos testes. Sem impacto em runtime de produção.Impacto de segurança
Detalhes: os testes de
backfillUserPiiapenas exercitam a criptografia/hash de PII já existente; nenhuma mudança em lógica de segurança.Impacto de dados pessoais / privacidade
Detalhes: os testes utilizam dados fictícios (fixtures) para validar o pipeline de PII já existente.
Compatibilidade / dependências
Detalhes: N/A
Evidências
npm run test:coverage(backend, front_admin, frontend) anexada na thread do card/PR.Develop - Alterações no catálogo de vagas, filtros e cache,Develop (#258),feat(PAV-128): correção do coverage do sistema.Riscos
maxWorkers: 2nofront_admin(trade-off para estabilidade).Rollback
Reverter o merge deste PR restaura o estado anterior dos testes e da configuração do Vitest. Como não há alterações de produção, o rollback é seguro e não impacta dados, contratos ou infraestrutura.
Checklist final
.env, certificados ou tokens