Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4,197 changes: 4,197 additions & 0 deletions .cspell/custom-dictionary-workspace.txt

Large diffs are not rendered by default.

20 changes: 19 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ CORS_ALLOWED_ORIGINS=http://localhost:5173,http://localhost:5174
SEARCH_LOCATION=Brasil
SEARCH_GEO_ID=106057199
SEARCH_LANGUAGE=pt
REMOTE_ONLY=true
REMOTE_ONLY=false
JOB_TYPES=C,F
TIME_FILTER=r604800
SEARCH_KEYWORDS=UX Designer,UI Designer,Product Manager,Product Owner
Expand Down Expand Up @@ -69,6 +69,24 @@ EMAIL_QUEUE_ATTEMPTS=3
ADZUNA_APP_ID=
ADZUNA_APP_KEY=
JOOBLE_API_KEY=
LINKEDIN_KEYWORD_SLOT_SIZE=30
ADZUNA_KEYWORD_SLOT_SIZE=30
GUPY_ENABLED=true
GUPY_RAW_DISCOVERY_ENABLED=true
GUPY_FULL_SWEEP_ENABLED=true
GUPY_FULL_REMOTE_SWEEP_ENABLED=true
GUPY_QUERY_LIMIT=60
INHIRE_ENABLED=true
INHIRE_TENANTS_FILE=./internal/interfaces/inhireTenants.json
INHIRE_ENRICH_DETAILS=false
INHIRE_DETAILS_MODE=ambiguous
INHIRE_DETAILS_CONCURRENCY=8
INHIRE_DETAILS_TIMEOUT_MS=10000
GREENHOUSE_ENABLED=true
GREENHOUSE_COMPANIES_FILE=./internal/interfaces/greenhouseCompanies.json
LEVER_ENABLED=false
LEVER_COMPANIES_FILE=./internal/interfaces/leverCompanies.json
LEVER_INCLUDE_ALL_JOBS=true

# OAuth credentials
GOOGLE_CLIENT_ID=
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ dist/
build/
output/
backend/output/
data/
tools/
npm-debug.log
yarn-error.log
yarn-debug.log
Expand Down
7 changes: 5 additions & 2 deletions BACKEND.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Módulos principais:
- `src/modules/users` — perfis e preferências do usuário (`UsersController`, `UsersService`).
- `src/modules/savedJobs` — CRUD de vagas salvas (`SavedJobsController`, `SavedJobsService`).
- `src/modules/notifications` — notificações do usuário autenticado.
- `src/modules/jobs` — regras de matching/score de vagas.
- `src/modules/jobs` — busca, parsing de filtros, fallback pós-filtro e regras de matching/score de vagas.
- `src/modules/admin` — usuários admin, permissões, scrapers, auditoria, dashboard e observabilidade.

Adaptadores externos:
Expand All @@ -81,8 +81,9 @@ Database / Schemas (Drizzle):

Cache & Indexes:

- `src/lib/cache.ts` — helpers para Redis/Valkey; usado por `jobs.routes` para obter ids e buscar vagas em memória.
- `src/lib/cache.ts` — helpers para Redis/Valkey; usado pelo módulo de jobs para obter ids e buscar vagas em memória.
- Busca por palavras-chave usa índices invertidos e interseção para eficiência.
- Filtros estruturados podem usar índices por família (`family`), tecnologia (`technology`), senioridade (`seniority`), localização, modelo e contrato.

## Módulo de E-mail

Expand Down Expand Up @@ -174,6 +175,7 @@ Base: `/`

- Jobs
- `GET /jobs/search?keywords=...` — busca vagas utilizando índices/Valkey/Redis. Retorna paginação e fonte (`source`).
- Filtros aceitos incluem `keywords`, `family`, `technology`, `seniority`, `level`, `location`, `country`, `state`, `city`, `type`/`model`, `contract`/`contractType`/`jobTypes` e `matchSort`.

- Keywords
- `GET /keywords` — lista keywords persistidas no banco.
Expand Down Expand Up @@ -247,6 +249,7 @@ Definidas/consumidas em `src/config.ts` e outros módulos:

- `goScraper.ts` faz POST em `${GO_SCRAPER_URL}/scrape` com `ScrapeParams` e valida `ScrapeResponse`.
- `goKeywords.ts` consulta e publica keywords via endpoints do serviço Go (`/api/keywords`).
- O backend lê os índices criados pelo scraper no Valkey, incluindo `scraper:jobs:keyword:*`, `scraper:jobs:family:*`, `scraper:jobs:technology:*` e `scraper:jobs:seniority:*`.

## Banco de dados

Expand Down
77 changes: 51 additions & 26 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Painel de Vagas
# <Cand!Date!>

> Novo no projeto? Comece por aqui: [LOCAL_DEVELOPMENT.md](LOCAL_DEVELOPMENT.md)

Expand All @@ -7,15 +7,26 @@
![Monorepo](https://img.shields.io/badge/architecture-monorepo-0A66C2)
![License ISC](https://img.shields.io/badge/license-ISC-lightgrey)

**Documentação**:
[README](README.md) |
[SCRAPER](SCRAPER.md) |
[BACKEND](BACKEND.md) |
[TESTING](TESTING.md) |
[CONTRIBUTING](contribuition.md) |
[ESCOPO](ESCOPO.md) |
[Frontend](frontend/README.md) |
[Frontend Architecture](frontend/ARCHITECTURE.md) |
[Front Admin](front_admin/README.md)

Plataforma de captura, agregação e consulta de vagas com arquitetura monorepo, composta por frontend web, API Node.js, scraper Go, painel administrativo e aplicação desktop com Electron.

O produto evoluiu para um modelo orientado a serviços (API + scraper Go + cache/índices), com autenticação, preferências de usuário e integração com banco de dados.

## Links oficiais

- Gestão de produto (Linear): https://linear.app/tatame/team/PAV/all
- Gestão de produto (Linear): <https://linear.app/tatame/team/PAV/all>
- Guia do usuário — Linear e integração com GitHub: [GUIA-LINEAR-GITHUB.md](GUIA-LINEAR-GITHUB.md)
- Design system oficial (Figma): https://www.figma.com/design/gollJBtK8PGkffNN4zk9t9/Painel-Dev---releitura?node-id=0-1&p=f&t=zU8zrFzPsNPxZ3qU-0
- Design system oficial (Figma): <https://www.figma.com/design/gollJBtK8PGkffNN4zk9t9/Painel-Dev---releitura?node-id=0-1&p=f&t=zU8zrFzPsNPxZ3qU-0>
- Documentação backend detalhada: [BACKEND.md](BACKEND.md)
- Documentação scraper Go: [SCRAPER.md](SCRAPER.md)
- Guia de testes: [TESTING.md](TESTING.md)
Expand Down Expand Up @@ -87,13 +98,13 @@ Objetivo de produto: fornecer uma base robusta para busca, filtragem e gestão d

Use este fluxo para subir Postgres, Valkey, scraper Go, backend, frontend e front_admin com a mesma rede Docker.

1. Instale as dependências locais:
1 - Instale as dependências locais:

```bash
npm install
```

2. Crie o `.env` da raiz a partir do exemplo versionado:
2 - Crie o `.env` da raiz a partir do exemplo versionado:

```bash
cp .env.example .env
Expand All @@ -105,27 +116,27 @@ No Windows PowerShell:
Copy-Item .env.example .env
```

3. Crie a rede Docker compartilhada, se ela ainda não existir:
3 - Crie a rede Docker compartilhada, se ela ainda não existir:

```bash
docker network create vagas-net
```

Se a rede já existir, o Docker vai avisar e você pode seguir para o próximo passo.

4. Suba Postgres, Valkey, scraper, backend, frontend e front_admin:
4 - Suba Postgres, Valkey, scraper, backend, frontend e front_admin:

```bash
docker compose -f docker-compose.infra.yml -f docker-compose.yml -f docker-compose.migrate.yml up --build -d
```

5. Acesse os serviços:
5 - Acesse os serviços:

- Frontend: http://localhost:5173
- Front admin: http://localhost:5174
- Backend health: http://localhost:3001/health
- Scraper health: http://localhost:8081/health
- Vagas salvas no scraper: http://localhost:8081/admin/jobs/count
- Frontend: <http://localhost:5173>
- Front admin: <http://localhost:5174>
- Backend health: <http://localhost:3001/health>
- Scraper health: <http://localhost:8081/health>
- Vagas salvas no scraper: <http://localhost:8081/admin/jobs/count>

### Desenvolvimento com Node local

Expand Down Expand Up @@ -272,6 +283,7 @@ Usuários:
Jobs:

- GET /jobs/search
- Busca vagas nos índices do Valkey e aceita filtros por `keywords`, `family`, `technology`, `seniority`, `level`, `location`, `country`, `type`/`model`, `contract` e ordenação por `matchSort`.

Keywords:

Expand Down Expand Up @@ -360,17 +372,17 @@ Por isso o `docker-compose.yml` e o `docker-compose.migrate.yml` sobrescrevem va

Serviços padrão:

- Frontend: http://localhost:5173
- Front admin: http://localhost:5174
- Backend: http://localhost:3001
- Scraper Go: http://localhost:8081
- Frontend: <http://localhost:5173>
- Front admin: <http://localhost:5174>
- Backend: <http://localhost:3001>
- Scraper Go: <http://localhost:8081>

Endpoints úteis do scraper:

- Health: http://localhost:8081/health
- Status da execução: http://localhost:8081/admin/scrape/status
- Contagem de vagas salvas: http://localhost:8081/admin/jobs/count
- Lista de vagas salvas: http://localhost:8081/admin/jobs
- Health: <http://localhost:8081/health>
- Status da execução: <http://localhost:8081/admin/scrape/status>
- Contagem de vagas salvas: <http://localhost:8081/admin/jobs/count>
- Lista de vagas salvas: <http://localhost:8081/admin/jobs>

## Desktop com Electron

Expand Down Expand Up @@ -431,6 +443,17 @@ Variáveis centrais de operação:
- WAIT_BETWEEN_SEARCHES_MS
- PAGE_TIMEOUT_MS
- MAX_PAGES_PER_KEYWORD
- LINKEDIN_KEYWORD_SLOT_SIZE
- ADZUNA_KEYWORD_SLOT_SIZE
- GUPY_ENABLED
- GUPY_RAW_DISCOVERY_ENABLED
- GUPY_FULL_SWEEP_ENABLED
- GUPY_FULL_REMOTE_SWEEP_ENABLED
- GUPY_QUERY_LIMIT
- INHIRE_ENABLED
- INHIRE_ENRICH_DETAILS
- GREENHOUSE_ENABLED
- LEVER_ENABLED
- CACHE_TTL_MS
- VITE_API_BASE_URL
- VITE_API_URL
Expand All @@ -443,6 +466,11 @@ Segurança operacional:
- Preferir acesso interno para banco/cache em VPS.
- Em ambiente externo, usar TLS para conexões de dados sempre que possível.

Observação operacional do scraper:

- O padrão atual privilegia resposta rápida e estabilidade. LinkedIn e Adzuna usam slots rotativos de keywords por execução, e Gupy limita a quantidade de queries expandidas por rodada. Isso reduz cobertura imediata por execução, mas evita milhares de requests em uma única rodada e distribui a coleta ao longo das próximas execuções.
- `tools/` e `data/` são ignorados pelo Git. Scripts versionados não devem depender de arquivos nessas pastas, a menos que sejam tratados como utilitários locais opcionais.

## Testes e qualidade

Estrutura:
Expand Down Expand Up @@ -489,7 +517,7 @@ Observação: o painel admin já possui testes e build próprios, mas ainda deve

Padrão oficial:

1. Abrir card no Linear: https://linear.app/tatame/team/PAV/all
1. Abrir card no Linear: <https://linear.app/tatame/team/PAV/all>
2. Criar branch de feature a partir de master
3. Desenvolver e testar localmente
4. Abrir PR da feature para develop
Expand All @@ -499,7 +527,7 @@ Padrão oficial:

Convenção recomendada de branch:

- feature/<id-do-card>-<descricao-curta>
- feature/{id-do-card}-{descricao-curta}

## Git Hooks e qualidade local

Expand Down Expand Up @@ -529,8 +557,6 @@ Observação importante:

- CI continua obrigatório e independente de hooks locais. Mesmo com bypass local, o pipeline valida cobertura/lint/build antes de merge.



## Roadmap técnico sugerido

### DX e onboarding
Expand All @@ -539,7 +565,6 @@ Observação importante:
- Adicionar verificação automática de scripts quebrados no CI.
- Padronizar comandos cross-platform (evitar dependência de sintaxe de variável de ambiente Unix em scripts críticos).


### Segurança

- Aplicar política de rotação de SESSION_SECRET e credenciais OAuth.
Expand Down
Loading
Loading