Commit graph

53 commits

Author SHA1 Message Date
Tiago Yamamoto
8ee0d59a61 feat: fix seeder password hashing, add custom questions, navbar/footer on register, payment handler
- fix(seeder): add PASSWORD_PEPPER to all bcrypt hashes (admin + candidates/recruiters)
- fix(seeder): add created_by field to jobs INSERT (was causing NOT NULL violation)
- feat(backend): add custom job questions support in applications
- feat(backend): add payment handler and Stripe routes
- feat(frontend): add navbar and footer to /register and /register/user pages
- feat(frontend): add custom question answers to job apply page
- feat(frontend): update home page hero section and navbar buttons
- feat(frontend): update auth/api lib with new endpoints
- chore(db): add migration 045 for application answers

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 20:26:49 -06:00
Tiago Yamamoto
74afffa4a9 feat: add category field to tickets system 2026-02-23 15:43:35 -06:00
Tiago Yamamoto
89358acc13 refactor(auth): remove hash hardcoded da migration, seeder gera em runtime
Antes: 010_seed_super_admin.sql tinha hash bcrypt fixo amarrado a um pepper
específico. Qualquer mudança no PASSWORD_PEPPER quebrava todos os logins
silenciosamente após reset do banco.

Agora:
- migration 010: insere superadmin com placeholder inválido + force_change_password.
  ON CONFLICT DO NOTHING preserva o hash se o seeder já rodou.
- seeder users.js: faz upsert de 'lol' com bcrypt(senha + env.PASSWORD_PEPPER)
  em runtime. Mudar o pepper e re-rodar o seeder é suficiente para atualizar
  as credenciais sem tocar em nenhuma migration.
- docs/AGENTS.md: atualiza gotcha #1 explicando o novo fluxo migrate → seed
- docs/DEVOPS.md: fix opção 1 do troubleshooting inclui re-deploy do seeder

Fluxo correto após reset do banco (coberto pelo start.sh opções 2, 6, 8):
  npm run migrate  →  superadmin criado, hash = placeholder
  npm run seed     →  hash recalculado com PEPPER do ambiente, status = active

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 12:05:54 -06:00
Tiago Yamamoto
fcf960381c fix(auth): corrige hash seed e documenta alinhamento do PASSWORD_PEPPER
- Atualiza hash hardcoded em 010_seed_super_admin.sql para hash válido
  gerado com pepper=gohorse-pepper (o antigo hash estava inválido e causava
  AUTH_INVALID_CREDENTIALS em qualquer reset do banco)
- Corrige valor de PASSWORD_PEPPER e CORS_ORIGINS no DEVOPS.md para
  refletir os valores reais do Coolify DEV
- Adiciona seção de troubleshooting no DEVOPS.md com diagnóstico e fix
  passo-a-passo para mismatch de pepper
- Adiciona seção "Known Gotchas" no AGENTS.md documentando:
  * Regra do PASSWORD_PEPPER (deve ser gohorse-pepper em todos ambientes)
  * Campo de login é email no DTO, não identifier
  * Hashes bcrypt em SQL devem usar arquivo -f, nunca -c ($ é expandido)
  * Credenciais de teste do ambiente DEV

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-22 11:43:35 -06:00
Tiago Yamamoto
6fbd1f5ffc feat: implement full auth system with HTTPOnly cookies + JWT, fix migrations to UUID v7, remove mock data from frontend
Backend:
- Fix migrations 037-041 to use UUID v7 (uuid_generate_v7)
- Fix CORS defaults to include localhost:8963
- Fix FRONTEND_URL default to localhost:8963
- Update superadmin password hash with pepper
- Add PASSWORD_PEPPER environment variable

Frontend:
- Replace mockJobs with real API calls in home page
- Replace mockNotifications with notificationsApi in context
- Replace mockApplications with applicationsApi in dashboard
- Fix register/user page to call real registerCandidate API
- Fix hardcoded values in backoffice and messages pages

Auth:
- Support both HTTPOnly cookie and Bearer token authentication
- Login returns token + sets HTTPOnly cookie
- Logout clears HTTPOnly cookie
- Token valid for 24h
2026-02-16 05:20:46 -06:00
Tiago Yamamoto
fb5aba4ed7 backend: suportar workMode em vagas e reforçar schema 2026-02-15 13:36:32 -03:00
GoHorse Deploy
694f6c3313 chore: commit pending changes 2026-02-15 16:03:40 +00:00
GoHorse Deploy
a3c2a18e61 Merge branch 'dev' of github.com:rede5/gohorsejobs into dev 2026-02-15 14:20:28 +00:00
Tiago Yamamoto
d7be83f1f0 feat(backend): add missing storage routes and job datePosted support 2026-02-14 21:16:12 -03:00
GoHorse Deploy
2a66e2888a Merge branch 'main' of github.com:rede5/gohorsejobs into dev 2026-02-14 21:58:08 +00:00
GoHorse Deploy
ae475e41a9 feat: implement careerjet gap analysis improvements
- Video Interview system (backend + frontend)
- Date Posted filter (24h, 7d, 30d)
- Company filter in jobs listing
- Recent searches persistence (LocalStorage)
- Job Alerts with email confirmation
- Favorite jobs with API
- Company followers system
- Careerjet URL compatibility (s/l aliases)
2026-02-14 19:37:25 +00:00
GoHorse Deploy
ed982caccc merge: resolve conflicts by accepting dev changes 2026-02-14 17:38:47 +00:00
Tiago Yamamoto
2fe7280600
Merge pull request #44 from rede5/claude/claude-md-mljq7u1y78t7vtbx-Oz1po
Add candidate profile management, password reset, and support features
2026-02-12 14:34:16 -03:00
GoHorse Deploy
1c29e469a7 fix: make migration 032 idempotent and fix UUID type in credentials bootstrap
- Migration 032: add NOT EXISTS check to avoid duplicate key violation
- CredentialsBootstrap: use NULLIF for updated_by UUID column, pass empty string instead of system_bootstrap
2026-02-07 17:22:15 +00:00
Marcus Bohessef
40e7cce971 Ajuste nas migrations 2026-02-07 10:48:42 -03:00
Marcus Bohessef
4253f49cbf Ajuste nas migrations 2026-02-07 10:41:16 -03:00
NANDO9322
c97aeacf3b Merge branch 'dev' 2026-01-17 18:23:41 -03:00
NANDO9322
9a1fca0c36 feat: (TASK: Mudança na forma de operar os usuarios)
refatoração fluxo de vagas e correção login automático
- Frontend:
  - Implementa componente JobFormBuilder para perguntas dinâmicas
  - Atualiza página /post-job com fluxo de 3 etapas e integração do builder
  - Corrige payload de registro (auth.ts) enviando campo password corretamente
  - Implementa auto-login após cadastro da empresa (redirecionamento e token)
  - Remove páginas obsoletas de registro de candidato
- Backend:
  - Atualiza CreateCompanyUseCase para retornar token JWT
  - Ajusta JobService para persistência correta de campos JSON (Questions, Benefits)
  - Atualiza DTOs de Job e Company para refletir novas estruturas
  - Adiciona migração (033) para novas colunas de refatoração
  - Ajustes nos repositórios para suporte aos novos modelos
Ref: #refactor-jobs #fix-auth
2026-01-17 17:07:35 -03:00
Yamamoto
c8d4ff2726 fix: resolve migration 032 column size, update credentials, silence auth logs 2026-01-03 11:04:56 -03:00
Yamamoto
3cd52accfb feat: infrastructure updates, storage verification, and superadmin reset
1. Auth: Implemented forced password reset for SuperAdmin and updated login logic.

2. Infra: Switched backend to internal Postgres and updated .drone.yml.

3. Storage: Added Test Connection endpoint and UI in Backoffice.

4. CI/CD: Updated Forgejo deploy pipeline to include Seeder and use Internal Registry.
2026-01-02 16:36:31 -03:00
Tiago Yamamoto
9d19751acb Resolve merge conflicts in backend, backoffice, and frontend 2025-12-27 21:45:48 -03:00
Tiago Yamamoto
b23393bf35 feat: implement stripe subscriptions, google analytics, and user crud
- Backend:
  - Add Stripe subscription fields to companies (migration 019)
  - Implement Stripe Checkout and Webhook handlers
  - Add Metrics API (view count, recording)
  - Update Company and Job models
- Frontend:
  - Add Google Analytics component
  - Implement User CRUD in Backoffice (Dashboard)
  - Add 'Featured' badge to JobCard
- Docs: Update Roadmap and artifacts
2025-12-27 12:06:54 -03:00
Tiago Yamamoto
63023b922f feat(notifications): implementar sistema de notificações e FCM
- Migration 017: tabelas notifications e fcm_tokens
- Models: Notification, FCMToken
- NotificationService: CRUD, push notifications helper
- FCMService: Firebase Cloud Messaging integration
- NotificationHandler: endpoints REST
- Rotas autenticadas: /api/v1/notifications/*

Endpoints:
- GET /api/v1/notifications
- GET /api/v1/notifications/unread-count
- PUT /api/v1/notifications/read-all
- PUT /api/v1/notifications/{id}/read
- DELETE /api/v1/notifications/{id}
- POST /api/v1/notifications/fcm-token
- DELETE /api/v1/notifications/fcm-token
2025-12-27 11:24:27 -03:00
Tiago Yamamoto
9ee9f6855c feat: implementar múltiplas features
Backend:
- Password reset flow (forgot/reset endpoints, tokens table)
- Profile management (PUT /users/me, skills, experience, education)
- Tickets system (CRUD, messages, stats)
- Activity logs (list, stats)
- Document validator (CNPJ, CPF, EIN support)
- Input sanitizer (XSS prevention)
- Full-text search em vagas (plainto_tsquery)
- Filtros avançados (location, salary, workMode)
- Ordenação (date, salary, relevance)

Frontend:
- Forgot/Reset password pages
- Candidate profile edit page
- Sanitize utilities (sanitize.ts)

Backoffice:
- TicketsModule proxy
- ActivityLogsModule proxy
- Dockerfile otimizado (multi-stage, non-root, healthcheck)

Migrations:
- 013: Profile fields to users
- 014: Password reset tokens
- 015: Tickets table
- 016: Activity logs table
2025-12-27 11:19:47 -03:00
Tiago Yamamoto
249081554d feat: add company profile fields
Backend:
- Created migration 031 for employee_count and founded_year
- Updated Company model with EmployeeCount and FoundedYear
- Updated core DTO with website, employeeCount, foundedYear, description

Frontend:
- Added website input field to company form
- Added employee count dropdown (1-10, 11-50, etc.)
- Added founded year input
- Added 'About Company' rich text editor
- Updated API payload to send new fields
2025-12-26 15:48:13 -03:00
Tiago Yamamoto
d6bb579260 feat: add salary options with toggle and candidate proposal
Backend:
- Added migration 030_add_salary_negotiable.sql
- Added SalaryNegotiable field to Job model

Frontend:
- Updated PostJobPage with salary mode toggle (fixed/range)
- Added 'Candidato envia proposta' checkbox to hide salary
- Updated job submission logic and confirmation display
2025-12-26 15:23:22 -03:00
Tiago Yamamoto
fb79e987bb feat: add location selector and contract types
Backend:
- Created LocationHandler, LocationService, LocationRepository
- Added endpoints: GET /api/v1/locations/countries, states, cities, search
- Added migration 029_expand_employment_types.sql with new contract types (permanent, training, temporary, voluntary)
- Fixed .gitignore to allow internal/api folder

Frontend:
- Created LocationPicker component with country dropdown and city/state autocomplete search
- Integrated LocationPicker into PostJobPage
- Updated contract type options in job form (Permanent, Contract, Training, Temporary, Voluntary)
- Added locationsApi with search functionality to api.ts
2025-12-26 15:18:16 -03:00
Tiago Yamamoto
841b1d780c feat: Email System, Avatar Upload, Email Templates UI, and Public Job Posting
- Backend: Email producer (LavinMQ), EmailService interface
- Backend: CRUD API for email_templates and email_settings
- Backend: avatar_url field in users table + UpdateMyProfile support
- Backend: StorageService for pre-signed URLs
- NestJS: Email consumer with Nodemailer and Handlebars
- Frontend: Email Templates admin pages (list/edit)
- Frontend: Updated profileApi.uploadAvatar with pre-signed URL flow
- Frontend: New /post-job public page (company registration + job creation wizard)
- Migrations: 027_create_email_system.sql, 028_add_avatar_url_to_users.sql
2025-12-26 12:21:34 -03:00
Tiago Yamamoto
b1639dbcd8 Implement secure Stripe credential management using RSA encryption 2025-12-26 11:03:52 -03:00
Tiago Yamamoto
722e72cdbd Implement FCM Token Management (DB, Backend, Frontend, Backoffice) 2025-12-26 10:41:50 -03:00
Tiago Yamamoto
858df02a1d feat(seeder): optimize city loading with bulk inserts and fix migration order 2025-12-24 18:19:03 -03:00
Tiago Yamamoto
617bb5ab39 fix(rbac): add migration to fix seeded users roles and patch notifications store 2025-12-24 18:14:35 -03:00
Tiago Yamamoto
861128571a fix(migrations): add migration to fix superadmin role and users e2e test 2025-12-24 18:06:49 -03:00
Tiago Yamamoto
41d7d9ee70 fix: update superadmin hash to match deployed PASSWORD_PEPPER
Uses pepper: some-random-string-for-password-hashing
Password: Admin@2025!
2025-12-24 17:14:50 -03:00
Tiago Yamamoto
d3c06f5564 feat: expand testing, add fast seeder options, hardcode superadmin
- start.sh: Add options 8 (Seed LITE - skip cities) and 9 (Run All Tests)
- seeder: Add seed:lite, seed:fast scripts and --skip-locations flag
- seeder: Remove superadmin creation (now via backend migration)
- backend: Update 010_seed_super_admin.sql with hardcoded hash (Admin@2025! + pepper)
- backend: Expand jwt_service_test.go with 5 new tests (+10% coverage)
- frontend: Fix api.test.ts URL duplication bug, add error handling tests
- seeder: Add SQL data files to .gitignore
2025-12-24 17:07:45 -03:00
Tiago Yamamoto
1018da8036 feat(location): add comprehensive geographic hierarchy (continents, countries, states, cities)
- Add migration 021_location_hierarchy.sql with new table structure
- Add location-loader.js seeder to import SQL dumps
- Update all seeder files to use country_id instead of region_id
- Rename companies.region_id to country_id
2025-12-24 15:04:21 -03:00
Tiago Yamamoto
c1078563df refactor(roles): rename companyAdmin->admin and jobSeeker->candidate 2025-12-24 13:30:50 -03:00
Tiago Yamamoto
1b4f1d1555 refactor: migrate core tables to UUID v7 and update roadmap 2025-12-24 12:30:49 -03:00
Tiago Yamamoto
e6fb6dd8cd fix: uuid_generate_v7 integer overflow and seeder role constraint
Migration 009:
- Simplified uuid_generate_v7() to avoid integer overflow on bit shifts
- Uses double precision for timestamp then converts to hex

Seeder:
- Changed roles from 'admin','company' to 'companyAdmin'
- Matches users table CHECK constraint: superadmin, companyAdmin, recruiter, jobSeeker
2025-12-24 11:56:31 -03:00
Tiago Yamamoto
5f3430bd98 fix: reorder uuid_generate_v7 migration to run before tables that use it
- Rename 021_create_uuid_v7_function.sql to 009_create_uuid_v7_function.sql
- Add CREATE EXTENSION IF NOT EXISTS pgcrypto for gen_random_bytes()
- Remove obsolete 022_migrate_to_uuid_v7.sql (already handled by table def)

This fixes the error where migration 017 tried to use uuid_generate_v7()
before it was created.
2025-12-24 11:52:44 -03:00
Tiago Yamamoto
568b4ebb88 refactor: clean up legacy UUID v4, use UUID v7 everywhere
Migrations:
- 016, 017, 019: Replace gen_random_uuid() with uuid_generate_v7()
- All UUID tables now use custom uuid_generate_v7() function

Backend:
- Create internal/utils/uuid/uuid.go with V7() function (RFC 9562)
- Update storage_handler.go to use internal uuid.V7()
- Remove dependency on google/uuid for file naming

All new UUIDs in the system are now UUID v7 (time-ordered)
2025-12-24 11:29:55 -03:00
Tiago Yamamoto
ae4a3e5e63 feat: migrate from UUID v4 to UUID v7
Migrations:
- Fix 010_seed_super_admin.sql: only use columns from migration 001
- Add 021_create_uuid_v7_function.sql: PostgreSQL uuid_generate_v7() function
- Add 022_migrate_to_uuid_v7.sql: update notifications, tickets, job_payments to use v7

Seeder:
- Create seeder-api/src/utils/uuid.js with uuidv7() function
- Update notifications.js to use uuidv7() instead of randomUUID()

Docs:
- Update DATABASE.md with UUID v7 section and benefits

UUID v7 benefits:
- Time-ordered (sortable by creation time)
- Better index performance than v4
- RFC 9562 compliant
2025-12-24 11:19:26 -03:00
Tiago Yamamoto
7d99e77468 refactor: unify schema - eliminate core_* tables
BREAKING CHANGE: Removed core_companies, core_users, core_user_roles tables

Migrations:
- Create 020_unify_schema.sql: adds tenant_id, email, name to users table
- Create user_roles table (replaces core_user_roles)
- Disable 009_create_core_tables.sql (renamed to .disabled)
- Update 010_seed_super_admin.sql to use unified tables

Backend Repositories:
- company_repository.go: use companies table with INT id
- user_repository.go: use users/user_roles with INT id conversion

Seeders:
- All seeders now use companies/users/user_roles tables
- Removed all core_* table insertions
- Query companies by slug to get SERIAL id

This eliminates the redundancy between core_* and legacy tables.
2025-12-24 11:06:31 -03:00
Tiago Yamamoto
254d7c3216 fix(migrations): change job_payments FK types from UUID to INT
- job_id changed from UUID to INT to match jobs.id SERIAL
- user_id changed from UUID to INT to match users.id SERIAL
- Added user_id FK to users table
2025-12-24 10:49:33 -03:00
Tiago Yamamoto
340911b4d1 feat(auth): add cookie parsing and JWT auth guard to backoffice
- Add JWT auth guard with Bearer token and cookie support
- Update .env.example files with PASSWORD_PEPPER documentation
- Update seeder to use PASSWORD_PEPPER for password hashing
- Update seeder README with hash verification examples
- Fix frontend auth and page components
- Update backend JWT service and seed migration
2025-12-24 10:27:04 -03:00
Tiago Yamamoto
9f7d8e9ca5 feat: add 6-step job wizard with Preview, Billing, Payment steps and Stripe integration preparation 2025-12-23 23:00:17 -03:00
Tiago Yamamoto
42e9f81f48 feat: enhance job form with currency, salary periods, contract types, and add ER diagram docs 2025-12-23 22:49:33 -03:00
Tiago Yamamoto
78ce341370 feat: Implement Ticket System, Profile Page integration, and fix migrations 2025-12-23 19:22:55 -03:00
Tiago Yamamoto
e71fc361ac Add dynamic candidate management data 2025-12-22 19:18:15 -03:00
Tiago Yamamoto
58cfd76675 Add admin backoffice routes and dashboard 2025-12-22 16:37:05 -03:00