gohorsejobs/docs/DATABASE.md

279 lines
7.6 KiB
Markdown

# Database Schema Documentation
This document outlines the database schema for the GoHorseJobs platform.
## Entity Relationship Diagram
```mermaid
erDiagram
users {
int id PK
varchar identifier UK
varchar password_hash
varchar role
varchar full_name
varchar language
boolean active
timestamp created_at
timestamp updated_at
timestamp last_login_at
}
companies {
int id PK
varchar name
varchar slug UK
varchar type
varchar document
varchar address
int region_id FK
int city_id FK
varchar phone
varchar email
varchar website
varchar logo_url
text description
boolean active
boolean verified
timestamp created_at
timestamp updated_at
}
jobs {
int id PK
int company_id FK
int created_by FK
varchar title
text description
decimal salary_min
decimal salary_max
varchar salary_type
varchar currency
varchar employment_type
varchar work_mode
varchar working_hours
varchar location
int region_id FK
int city_id FK
jsonb requirements
jsonb benefits
boolean visa_support
varchar language_level
varchar status
boolean is_featured
timestamp created_at
timestamp updated_at
}
applications {
int id PK
int job_id FK
int user_id FK
varchar name
varchar email
varchar phone
varchar line_id
varchar whatsapp
text message
varchar resume_url
jsonb documents
varchar status
text notes
timestamp created_at
timestamp updated_at
}
regions {
int id PK
varchar name
varchar country_code
varchar code
}
cities {
int id PK
int region_id FK
varchar name
}
user_companies {
int id PK
int user_id FK
int company_id FK
varchar role
jsonb permissions
}
favorite_jobs {
int id PK
int user_id FK
int job_id FK
}
users ||--o{ user_companies : "belongs to"
companies ||--o{ user_companies : "has members"
companies ||--o{ jobs : "posts"
users ||--o{ jobs : "creates"
jobs ||--o{ applications : "receives"
users ||--o{ applications : "submits"
regions ||--o{ cities : "contains"
regions ||--o{ companies : "located in"
cities ||--o{ companies : "located in"
regions ||--o{ jobs : "located in"
cities ||--o{ jobs : "located in"
users ||--o{ favorite_jobs : "saves"
jobs ||--o{ favorite_jobs : "saved by"
```
## Core Tables
### Users (`users`)
Represents system users including Candidates, Recruiters, and Admins.
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| identifier | VARCHAR | Unique, Email or Username |
| password_hash | VARCHAR | Bcrypt hash |
| role | VARCHAR | `superadmin`, `companyAdmin`, `recruiter`, `jobSeeker` |
| full_name | VARCHAR | Display name |
| language | VARCHAR | Default: 'pt' |
| active | BOOLEAN | Account status |
| created_at | TIMESTAMP | Creation time |
| updated_at | TIMESTAMP | Last update |
| last_login_at | TIMESTAMP | Last login |
---
### Companies (`companies`)
Represents employer organizations.
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| name | VARCHAR | Company name |
| slug | VARCHAR | URL-friendly identifier |
| type | VARCHAR | Company type |
| document | VARCHAR | Houjin Bangou / CNPJ |
| address | VARCHAR | Physical address |
| region_id | INTEGER | FK → regions.id |
| city_id | INTEGER | FK → cities.id |
| phone, email, website | VARCHAR | Contact info |
| logo_url | VARCHAR | Logo image URL |
| description | TEXT | Company description |
| active | BOOLEAN | Active status |
| verified | BOOLEAN | Verification status |
---
### Jobs (`jobs`)
Represents job postings.
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| company_id | INTEGER | FK → companies.id |
| created_by | INTEGER | FK → users.id |
| title | VARCHAR | Job title |
| description | TEXT | Full job description |
| salary_min | DECIMAL | Minimum salary |
| salary_max | DECIMAL | Maximum salary |
| salary_type | VARCHAR | `hourly`, `daily`, `weekly`, `monthly`, `yearly` |
| currency | VARCHAR | `BRL`, `USD`, `EUR`, `GBP`, `JPY` |
| employment_type | VARCHAR | `full-time`, `part-time`, `contract`, `temporary`, `training`, `voluntary`, `permanent`, `dispatch` |
| work_mode | VARCHAR | `onsite`, `hybrid`, `remote` |
| working_hours | VARCHAR | e.g. "9:00-18:00" |
| location | VARCHAR | Location string |
| region_id | INTEGER | FK → regions.id |
| city_id | INTEGER | FK → cities.id |
| requirements | JSONB | Skills/requirements array |
| benefits | JSONB | Benefits array |
| visa_support | BOOLEAN | Visa sponsorship |
| language_level | VARCHAR | `N5`, `N4`, `N3`, `N2`, `N1`, `beginner`, `none` |
| status | VARCHAR | `draft`, `open`, `closed`, `published`, `paused`, `expired`, `archived`, `reported`, `review` |
| is_featured | BOOLEAN | Featured job flag |
---
### Applications (`applications`)
Represents job applications.
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| job_id | INTEGER | FK → jobs.id |
| user_id | INTEGER | FK → users.id (nullable for guests) |
| name | VARCHAR | Applicant name |
| email | VARCHAR | Contact email |
| phone | VARCHAR | Phone number |
| line_id | VARCHAR | LINE ID |
| whatsapp | VARCHAR | WhatsApp number |
| message | TEXT | Cover message |
| resume_url | VARCHAR | Resume file URL |
| documents | JSONB | Additional documents |
| status | VARCHAR | `pending`, `reviewed`, `shortlisted`, `rejected`, `hired` |
| notes | TEXT | Recruiter notes |
---
## Reference Tables
### Regions (`regions`)
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| name | VARCHAR | Region name |
| country_code | VARCHAR | e.g. "JP", "BR" |
| code | VARCHAR | Region code |
### Cities (`cities`)
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| region_id | INTEGER | FK → regions.id |
| name | VARCHAR | City name |
---
## Junction Tables
### User Companies (`user_companies`)
Maps users to companies (N:M relationship).
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| user_id | INTEGER | FK → users.id |
| company_id | INTEGER | FK → companies.id |
| role | VARCHAR | `companyAdmin`, `recruiter` |
| permissions | JSONB | Custom permissions |
### Favorite Jobs (`favorite_jobs`)
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| user_id | INTEGER | FK → users.id |
| job_id | INTEGER | FK → jobs.id |
---
## Audit Tables
### Login Audits (`login_audits`)
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| user_id | VARCHAR | User identifier |
| identifier | VARCHAR | Login identifier used |
| ip_address | VARCHAR | Client IP |
| user_agent | VARCHAR | Browser/client info |
| created_at | TIMESTAMP | Login time |
### Password Resets (`password_resets`)
| Column | Type | Description |
|--------|------|-------------|
| id | INTEGER | Primary key |
| user_id | INTEGER | FK → users.id |
| token | VARCHAR | Reset token |
| expires_at | TIMESTAMP | Token expiry |
| used | BOOLEAN | Token used status |