A fullstack CV sorting and job matching platform using Node.js, Express, PostgreSQL, React, and OpenAI.
- Backend: Node.js, Express, PostgreSQL (MVC + Repository pattern)
- Frontend: React (see
client/) - Shared Types: Zod/Drizzle schemas in
shared/
| Field | Type | Description |
|---|---|---|
| id | integer | Primary key |
| username | string | Unique, required |
| password | string | Hashed, required |
| isAdmin | boolean | Admin flag |
| name | string | Optional |
| string | Optional | |
| createdAt | timestamp | Auto, default now |
| Field | Type | Description |
|---|---|---|
| id | integer | Primary key |
| name | string | Required |
| string | Optional | |
| phone | string | Optional |
| position | string | Optional |
| experience | string | Optional |
| skills | string[] | Array of skills |
| education | Education[] | Array of education objects |
| workHistory | WorkExperience[] | Array of work objects |
| resumeText | string | Raw text |
| originalFileName | string | Original file name |
| matchScore | integer | Calculated match score |
| createdAt | timestamp | Auto, default now |
| userId | integer | FK to users |
| Field | Type |
|---|---|
| degree | string |
| institution | string |
| period | string |
| Field | Type |
|---|---|
| title | string |
| company | string |
| period | string |
| description | string |
| skills | string[] |
| Field | Type |
|---|---|
| id | integer |
| title | string |
| department | string |
| location | string |
| employmentType | string |
| description | string |
| responsibilities | string[] |
| requirements | string[] |
| requiredSkills | string[] |
| preferredSkills | string[] |
| minimumExperience | integer |
| preferredExperience | integer |
| educationRequirements | string[] |
| active | boolean |
| createdAt | timestamp |
| Field | Type |
|---|---|
| id | integer |
| candidateId | integer |
| jobDescriptionId | integer |
| overallScore | integer |
| skillsMatchScore | integer |
| experienceMatchScore | integer |
| educationMatchScore | integer |
| keyStrengths | string[] |
| developmentAreas | string[] |
| insights | string |
| rank | integer |
| assessmentDate | timestamp |
| Field | Type |
|---|---|
| id | integer |
| title | string |
| slug | string |
| content | string |
| summary | string |
| imageUrl | string |
| authorId | integer |
| authorName | string |
| tags | string[] |
| published | boolean |
| publishedAt | timestamp |
| createdAt | timestamp |
| updatedAt | timestamp |
| Method | Endpoint | Description |
|---|---|---|
| POST | /api/register | Register user |
| POST | /api/login | Login user |
| POST | /api/logout | Logout user |
| GET | /api/user | Get current user |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/candidates | List all candidates |
| GET | /api/candidates/:id | Get candidate by ID |
| POST | /api/candidates | Create new candidate |
| PUT | /api/candidates/:id | Update candidate by ID |
| DELETE | /api/candidates/:id | Delete candidate by ID |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/job-descriptions | List/search job descriptions |
| POST | /api/job-descriptions | Create new job description |
| GET | /api/job-descriptions/:id | Get job description by ID |
| PATCH | /api/job-descriptions/:id | Update job description by ID |
- All endpoints return JSON.
- Auth endpoints do not require authentication; all others do.
- See
shared/schema.tsfor full Zod/TypeScript types. - Follows MVC and repository pattern for backend structure.
- Install dependencies:
npm install - Configure your
.envfor PostgreSQL and OpenAI - Start the backend:
npm run dev(ornpm start) - Start the frontend:
cd client && npm install && npm run dev
MIT