- Guard against null response from chatApi.listConversations()
- Use fallback empty array for conversations state
- Prevents 'Cannot read properties of null' errors
- Reduced form from 3 steps to 2 steps
- Step 1 now contains both company and job data with visual separator
- Step 2 is confirmation only
- Updated progress indicators and card headers
- Fixed navigation button references
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
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
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
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.
When Appwrite is not configured:
- Shows friendly 'Service not configured' message
- Displays icon and helpful description
- Links to dashboard and settings
- Shows technical details in collapsible section
- Prevents client-side crash
- Added formatDescription helper to parse JSON and display as formatted list
- Shows tagline, stores, employees, motto etc as labeled fields
- Falls back to plain text if not JSON
- Created /register/job page with same layout as company registration
- Split panel design: info panel on left, form on right
- Two-step form: job details, then salary & company selection
- Uses same styling and animations as company registration
- Added modal dialog to view company details when clicking eye icon
- Fixed createdAt field name (was created_at, Go returns camelCase)
- Expanded AdminCompany type to include all company fields
- Modal shows: status badges, contact info, description, timestamps
- Added update() and delete() methods to jobsApi in api.ts
- Fixed handleDeleteJob to call jobsApi.delete() instead of just local state
- Fixed handleSaveEdit to call jobsApi.update() instead of being commented out
- Added console logging to all CRUD operations for debugging
- Replaced 6-step wizard (673 lines) with single-page form (290 lines)
- Removed billing/payment steps for now
- All fields visible with clear section headers
- Save as Draft and Publish buttons
- handleDeleteJob: compare string IDs directly instead of parseInt
- handleSaveEdit: use string ID for future update logic
- IDs are now UUIDs (strings) after migration
- 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
- Replace job.company with job.companyName
- Replace job.type with job.employmentType
- Replace job.postedAt with job.createdAt
- Add getSalaryDisplay helper for salaryMin/salaryMax
- Fixed type compatibility with ApiJob interface
Frontend changes:
- Add applicationsApi with create() and getByJob() in api.ts
- Update apply/page.tsx to fetch job from API and submit to backend
- Fix job detail page requirements null check
- Use ApiJob type instead of mock Job type
- Replace job.company with job.companyName throughout
Note: Backend has type mismatch issues that need fixing:
- jobs endpoint: varchar vs integer comparison
- applications: null id constraint
Backend fixes:
- Fix FK violation in candidate registration by creating company first
- Add CompanyRepository to RegisterCandidateUseCase
- Add handler integration tests for validation
Frontend improvements:
- Add registerCompany function in auth.ts
- Connect company registration form to backend API
- Replace mockJobs with API call in job detail page
- Add loading/error states to job detail page
- Add Jest tests for auth module
- impl(frontend): server-side pagination for jobs listing
- impl(frontend): standardized api error handling and sonner integration
- test(frontend): added unit tests for JobCard
- impl(backend): added SanitizeMiddleware for XSS protection
- test(backend): added table-driven tests for JobService
- docs: updated READMES, created ROADMAP.md and DATABASE.md
- fix(routing): redirected landing page buttons to /jobs
- Add is_featured column to jobs table (migration)
- Update Job model and Service to support featured jobs
- Update JobHandler to expose featured jobs API
- Support filtering by featured status in GET /jobs
- Frontend: Fetch and display featured jobs from API
- Frontend: Update Job type definition
- frontend/.env.example: Add SEEDER_API_URL
- seeder-api/.env.example: Expand with server config and backend URL
- job-scraper-multisite/.env.example: New file with scraping config
- Update gitignore files to allow .env.example tracking
- Update frontend/.gitignore to allow .env.example
- Create frontend/.env.example with correct API_URL format (/api/v1 suffix)
- Document production URL: https://api-dev.gohorsejobs.com/api/v1
Backend:
- Add Swagger annotations to all job handlers (GET, POST, PUT, DELETE)
- Clean up job handler code
Frontend:
- Expand api.ts with ApiJob types, pagination, and transform function
- Update footer with 'Vagas por Tecnologia' SEO links
- Add robots.txt with crawler directives
- Add sitemap.xml with main pages and job URLs
- Change branding to GoHorse Jobs