Commit graph

87 commits

Author SHA1 Message Date
Tiago Yamamoto
91e4417c95 feat: add working hours and salary negotiable logic
Backend:
- Updated DTOs to include SalaryNegotiable and WorkingHours
- Updated JobService to map and persist these fields (CREATE, GET, UPDATE)
- Ensure DB queries include new columns

Frontend:
- Added 'Working Hours' (Jornada de Trabalho) dropdown to PostJobPage
- Updated state and submit logic
- Improved salary display in confirmation step

Seeder:
- Updated jobs seeder to include salary_negotiable and valid working_hours
2025-12-26 15:29:51 -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
e5d0cd483a feat: Implement Dynamic Credentials Management
Backend:
- Added GET /api/v1/system/credentials to list configured services
- Added DELETE /api/v1/system/credentials/{service}
- Updated CredentialsService to support listing without revealing secrets

Frontend:
- Updated Settings page with Tabs
- Added 'Integrations' tab to manage credentials
- Allows Configuring (Update) and Deleting credentials
- Lists status of Appwrite, Stripe, Firebase, etc.
2025-12-26 14:43:35 -03:00
Tiago Yamamoto
90a5f7b2a6 fix: Add /api/v1/auth/register/company route for public job posting
Added route aliases:
- POST /api/v1/auth/register/candidate
- POST /api/v1/auth/register/company

These maintain consistency with the /post-job frontend page
2025-12-26 12:54:37 -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
7a1d0417bc Fix ListUsers 500 query error (use tenant_id instead of company_id) 2025-12-26 10:48:11 -03:00
Tiago Yamamoto
722e72cdbd Implement FCM Token Management (DB, Backend, Frontend, Backoffice) 2025-12-26 10:41:50 -03:00
Tiago Yamamoto
ee5a680468 Add missing CRUD routes: Companies GET by ID, Support Tickets 2025-12-26 10:20:38 -03:00
Tiago Yamamoto
fb98016afc Refactor RBAC: Admin sees only their company data, Superadmin sees all 2025-12-26 10:05:57 -03:00
Tiago Yamamoto
f9c9293a19 Fix undefined middleware.GetRequestID in backend 2025-12-26 09:58:33 -03:00
Tiago Yamamoto
e0b16e5b29 Fix profile 404/500 and user deletion 403 2025-12-26 09:55:19 -03:00
Tiago Yamamoto
f51a8dd99c fix: resolved user profile 500 error, fixed frontend build types, enhanced logging, increases test coverage 2025-12-26 01:35:34 -03:00
Tiago Yamamoto
3fa875ed98 feat: implemented delete application endpoint and dashboard action 2025-12-26 01:29:31 -03:00
Tiago Yamamoto
7b76b62490 feat(backoffice): implemented edit and delete company functionality 2025-12-26 01:23:01 -03:00
Tiago Yamamoto
43c0719664 feat(users): add company selection and status to create user modal 2025-12-26 01:18:14 -03:00
Tiago Yamamoto
6ab7e357fb fix(users): resolve 403 on update and enable role/status editing 2025-12-26 01:14:18 -03:00
Tiago Yamamoto
eae3df7f38 fix(cors): add PATCH to allowed methods
Without PATCH in CORS headers, user update was failing with:
'Method PATCH is not allowed by Access-Control-Allow-Methods'
2025-12-26 00:59:04 -03:00
Tiago Yamamoto
73967ca52b fix(users): allow superadmin to list all users without tenant restriction
- Modified ListUsers handler to check for admin/superadmin role
- Superadmins can now list all users across tenants
- Added ListUsers method to AdminService
- Added Status field to dto.User

Fixes 403 error when superadmin tries to access /api/v1/users
2025-12-26 00:51:54 -03:00
Tiago Yamamoto
f396acfb72 debug: add RBAC logging to RequireRoles middleware 2025-12-26 00:42:55 -03:00
Tiago Yamamoto
01aca8971b fix(auth): include legacy role column in getRoles query
The superadmin role was stored in users.role column but getRoles()
only checked user_roles table. Updated to use UNION query that
combines both sources for backward compatibility.

Fixes 403 Forbidden on /api/v1/users for admin users.
2025-12-25 23:20:22 -03:00
Tiago Yamamoto
930c57a9c7 debug(backend): add console logging to job creation endpoint
- Added debug logging to job_handler.go CreateJob
- Added debug logging to job_service.go CreateJob
- Tracks request data, userID extraction, SQL execution, and errors
2025-12-25 22:34:24 -03:00
Tiago Yamamoto
151d1f4347 test(backend): add UpdateCompanyStatus tests for admin service
- Added 3 test cases: updates active status, updates verified status, and error when company not found
- All tests passing
2025-12-25 22:08:02 -03:00
Tiago Yamamoto
59df524ed5 test: add admin, notification, audit service tests (+30% coverage increase) 2025-12-24 20:01:54 -03:00
Tiago Yamamoto
49fdcd0168 fix(router): allow public access to tags api for recruiters 2025-12-24 19:51:52 -03:00
Tiago Yamamoto
4eae018a25 fix(backoffice): use string IDs for companies/jobs/users, fix audit log, ensure real tags support 2025-12-24 19:43:49 -03:00
Tiago Yamamoto
9784e959e4 feat: add profile page, dynamic dashboard, and backend integration tests 2025-12-24 19:38:11 -03:00
Tiago Yamamoto
cc5ac7c73c feat: add profile page, dynamic dashboard, and fix candidate 500 error 2025-12-24 19:22:14 -03:00
Tiago Yamamoto
9b389e1c9f fix(services): initialize all list slices to empty array to prevent null json response 2025-12-24 18:11:17 -03:00
Tiago Yamamoto
06ed927ef4 fix(services): initialize slices to empty array to prevent null json response 2025-12-24 17:52:13 -03:00
Tiago Yamamoto
bb970f4a74 fix(backend): resolve 500 errors on jobs, notifications and secure routes
- Fix CreateJob 500 error by extracting user ID correctly
- Secure Create/Update/Delete Job routes with AuthGuard
- Fix Notifications/Tickets/Profile 500 error (UUID vs Int mismatch)
- Add E2E test for CreateJob
2025-12-24 17:48:06 -03:00
Tiago Yamamoto
3fc701a98c fix(backend): use 'states' table instead of removed 'regions' in ListJobs
Resolves 500 Internal Server Error in GetJobs endpoint caused by migration 021 schema changes.
2025-12-24 17:21:32 -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
052f5169c5 test(auth): add comprehensive auth tests with 98.6% coverage
Backend Tests Added:
- auth_middleware_test.go: 25+ tests for HeaderAuthGuard, OptionalHeaderAuthGuard, RequireRoles, TenantGuard, ExtractRoles, hasRole (100% coverage)
- cors_middleware_test.go: 7 tests for CORS origin validation (100% coverage)
- jwt_service_test.go: expanded with expiration parsing, wrong signing method tests (94.4% coverage)

Features:
- Maximum console.log/fmt.Printf output for debugging
- Tests for JWT from header and cookie fallback
- Tests for role-based access (case-insensitive)
- Tests for tenant enforcement
- Tests for token expiration parsing (7d, 2h, invalid formats)

Total backend auth coverage: 98.6%
2025-12-24 16:20:56 -03:00
Tiago Yamamoto
ac84571c55 debug(auth): add detailed logging to HeaderAuthGuard middleware 2025-12-24 15:14:46 -03:00
Tiago Yamamoto
bc7b8f53f4 fix(auth): make login status check case-insensitive 2025-12-24 14:53:29 -03:00
Tiago Yamamoto
7e0a58feb4 chore: add detailed debug logs for login flow 2025-12-24 14:26:09 -03:00
Tiago Yamamoto
1d79276e13 fix(backend): consolidated duplicate routes, fixed E2E tests for UUIDs and paths 2025-12-24 13:42:45 -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
38a94bcbce feat: implement high priority features
1. Advanced Search (backend)
   - Add salaryMin, salaryMax, currency, sortBy to JobFilterQuery
   - Add 5+ filters: visa, salary range, currency, language level
   - Add 4 sort options: recent, salary_asc, salary_desc, relevance

2. Email Service (backend)
   - Create Resend API integration (email_service.go)
   - 3 HTML email templates: welcome, password_reset, application_received
   - Add RESEND_API_KEY, EMAIL_FROM, APP_URL env vars

3. i18n (frontend)
   - Create 4 language files: pt-BR, en-US, es-ES, ja-JP
   - 100+ translation keys per language
   - Covers: common, nav, auth, jobs, profile, company, footer

4. Stripe Integration (backend)
   - Create payment_handler.go with checkout session creation
   - Webhook handler with signature verification
   - Support for checkout.session.completed, payment_intent events
2025-12-24 11:40:53 -03:00
Tiago Yamamoto
7310627bee refactor: remove google/uuid from register_candidate.go
- IDs are now auto-generated by DB SERIAL columns
- No need to generate UUID in application code
- Let repository handle ID assignment from DB response
- Removed unused import
2025-12-24 11:31:57 -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
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
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
02f35b46b6 feat: implement dynamic dashboard, auth hardening (pepper/httponly) and backend tests 2025-12-24 01:30:33 -03:00
Tiago Yamamoto
0f2aae3073 fix(backoffice): force 0.0.0.0 binding to resolve deployment crash
refactor(backend): consolidate admin routes and implement RBAC

feat(frontend): update api client to use consolidated routes
2025-12-24 00:59:33 -03:00
Tiago Yamamoto
72174b5232 docs(backend): update Swagger annotations for admin and core handlers 2025-12-24 00:45:48 -03:00
Tiago Yamamoto
6bb90bdd1c fix: add missing /api/v1/notifications route to router 2025-12-23 23:46:18 -03:00