Fix/job duplication#64
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
Este PR busca corrigir a duplicação de vagas (principalmente quando a mesma vaga aparece em múltiplas plataformas/fontes) através de deduplicação por identidade (título/empresa/local) e merge de palavras‑chave/fontes, tanto no backend (pipeline) quanto no frontend (hook de filtragem).
Changes:
- Implementa lógica de deduplicação + merge (keywords/fontes) no backend (
scrapeAllSources) e no frontend (useJobsFiltering). - Estende o tipo
Jobno frontend para suportarkeywordsesources. - Adiciona testes unitários cobrindo deduplicação e combinação de palavras‑chave.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/tests/unit/utils/useJobsFiltering.test.ts | Novo teste cobrindo deduplicação de vagas equivalentes e merge de palavras‑chave. |
| frontend/src/types/jobs.ts | Atualiza a interface Job para incluir keywords e sources. |
| frontend/src/hooks/useJobsFiltering.ts | Deduplica vagas no client, normaliza busca e combina keywords/fontes para filtros. |
| backend/tests/unit/services/pipeline/scrapeAllSources.test.js | Novo teste garantindo dedupe entre plataformas por título/empresa/local. |
| backend/src/pipeline/scrapeAllSources.js | Implementa dedupe por identidade/URL normalizada e merge de campos/keywords/fontes. |
| backend/src/db/environment.json | Altera o conjunto de KEYWORDS padrão persistido no environment.json. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| titulo: pickPreferredValue(existing.titulo, job.titulo), | ||
| empresa: pickPreferredValue(existing.empresa, job.empresa), | ||
| local: pickPreferredValue(existing.local, job.local), | ||
| link: pickPreferredValue(existing.link, job.link), | ||
| source: mergedSources.join(", ") || existing.source || job.source || "", |
There was a problem hiding this comment.
Na deduplicação, a chave de comparação remove query/hash do link, mas o valor persistido em job.link é escolhido por pickPreferredValue (maior string). Isso tende a manter parâmetros de tracking (ex.: ?refId=...) mesmo quando já foi considerado equivalente, o que pode vazar dados/ruído e deixar URLs instáveis. Sugestão: ao mesclar, preferir a versão normalizada (sem query/hash) ou a URL mais “canônica” (ex.: a mais curta), e/ou armazenar o link original em um campo separado.
| function mergeKeywords(existing, incoming) { | ||
| const mergedKeywords = getMergedKeywords(existing, incoming); | ||
| const mergedSources = getMergedSources(existing, incoming); | ||
|
|
||
| return { | ||
| ...existing, | ||
| ...incoming, | ||
| titulo: pickPreferredValue(existing.titulo, incoming.titulo, existing.title, incoming.title), | ||
| empresa: pickPreferredValue(existing.empresa, incoming.empresa, existing.company, incoming.company), | ||
| local: pickPreferredValue(existing.local, incoming.local, existing.location, incoming.location), | ||
| link: pickPreferredValue(existing.link, incoming.link, existing.jobUrl, incoming.jobUrl), | ||
| jobUrl: pickPreferredValue(existing.jobUrl, incoming.jobUrl, existing.link, incoming.link), | ||
| source: mergedSources.join(", ") || existing.source || incoming.source || "", |
There was a problem hiding this comment.
mergeKeywords agora está mesclando não só keywords, mas também campos de identidade (título/empresa/local/link) e fontes. Isso torna o nome enganoso e dificulta manutenção/leitura. Sugestão: renomear para algo como mergeJobs/mergeJobEntries (e manter mergeKeywords apenas para keywords, se ainda fizer sentido).
| titulo: pickPreferredValue(existing.titulo, incoming.titulo, existing.title, incoming.title), | ||
| empresa: pickPreferredValue(existing.empresa, incoming.empresa, existing.company, incoming.company), | ||
| local: pickPreferredValue(existing.local, incoming.local, existing.location, incoming.location), | ||
| link: pickPreferredValue(existing.link, incoming.link, existing.jobUrl, incoming.jobUrl), | ||
| jobUrl: pickPreferredValue(existing.jobUrl, incoming.jobUrl, existing.link, incoming.link), | ||
| source: mergedSources.join(", ") || existing.source || incoming.source || "", |
There was a problem hiding this comment.
A chave de deduplicação normaliza a URL removendo query/hash, mas na mesclagem o link/jobUrl é escolhido por pickPreferredValue (string mais longa). Isso tende a preservar parâmetros de tracking (ex.: trackingId, refId) e pode deixar o output com URLs menos estáveis/mais sensíveis. Sugestão: ao mesclar, preferir a URL canônica (normalizada sem query/hash) ou a mais curta, e opcionalmente manter a URL original em um campo separado se precisar para auditoria.
| { | ||
| "KEYWORDS": [ | ||
| "Java", | ||
| "Spring", | ||
| "RabbitMQ", | ||
| "Docker" | ||
| "Java" | ||
| ] |
There was a problem hiding this comment.
Esta alteração reduz o conjunto padrão de KEYWORDS para apenas "Java". Como isso impacta diretamente o comportamento padrão do scraper/API (config lê src/db/environment.json), vale confirmar se é intencional para este PR de deduplicação; caso não seja, reverter ou justificar no PR para evitar mudança de funcionalidade inesperada em ambiente local/empacotado.
No description provided.