A modern, full-stack job portal connecting job seekers with recruiters
Features โข Quick Start โข Architecture โข API Docs โข Contributing
- Overview
- Features
- Tech Stack
- Architecture
- Getting Started
- Project Structure
- User Roles & Permissions
- Core Functionality
- API Documentation
- Database Schema
- Deployment
- Testing
- Contributing
- License
Skills Careers is a comprehensive job portal platform built with Next.js 15, designed to streamline the hiring process by connecting talented job seekers with top recruiters. The platform offers a seamless experience with role-based access control, real-time job search, application tracking, and an intuitive admin portal.
- ๐ Multi-role Authentication: Job Seekers, Recruiters, and Admins with distinct permissions
- ๐ Advanced Job Search: Real-time search with filters (location, category, experience, job type)
- ๐ Analytics Dashboard: Comprehensive insights for admins and recruiters
- ๐ CV Management: Automated CV generation with PDF export
- ๐ OAuth Integration: Google & LinkedIn authentication
- ๐ฑ Responsive Design: Mobile-first, optimized for all devices
- ๐ Performance: Server-side rendering, optimized images, and cached connections
- โ Create and manage professional profiles
- โ Upload and manage CVs with automatic PDF generation
- โ Search and filter jobs by location, category, experience
- โ Apply to jobs with one-click application
- โ Track application status (Pending, Approved, Declined)
- โ Receive application notifications
- โ View recruiter company profiles
- โ Bookmark favorite jobs
- โ Create company profiles with branding
- โ Post and manage job listings
- โ Publish/unpublish jobs
- โ View and manage applications
- โ Filter candidates by status
- โ Mark candidates as favorites
- โ Track hiring metrics and analytics
- โ Manage company information
- โ Access candidate profiles and CVs
- โ Complete platform oversight dashboard
- โ Manage users, recruiters, and job seekers
- โ Moderate job postings
- โ View platform analytics (jobs, applications, users)
- โ Manage press releases and announcements
- โ Handle inquiries and support tickets
- โ Restrict/unrestrict accounts
- โ Create new admin accounts
- ๐ Smart Search: Real-time job search with MongoDB regex queries
- ๐ง Email Notifications: Automated emails via Nodemailer
- ๐บ๏ธ Interactive Maps: Location-based job viewing with Leaflet
- ๐ Data Visualization: Charts and analytics with Chart.js
- ๐จ Modern UI: Beautiful interface with Tailwind CSS
- ๐ Security: Bcrypt password hashing, secure sessions
- ๐ Internationalization: Multi-language support ready
- โฟ Accessibility: WCAG compliant components
- Framework: Next.js 15.5.7 (App Router)
- UI Library: React 18.3.1
- Styling: Tailwind CSS 3.4.1
- Icons: React Icons, FontAwesome
- Forms: React Hook Form (via custom components)
- Maps: React Leaflet 4.2.1
- Charts: React Chart.js 2 5.3.0
- Animations: Swiper 11.2.0
- UI Components: Material-UI 6.1.7
- Notifications: SweetAlert2 11.15.10
- Runtime: Node.js
- Framework: Next.js API Routes
- Database: MongoDB 6.12.0
- ODM: Native MongoDB Driver
- Authentication: NextAuth.js 4.24.10
- Password Hashing: Bcrypt.js 2.4.3
- Email: Nodemailer 7.0.11
- File Storage: Cloudinary 2.5.1
- PDF Generation: jsPDF 3.0.0
- Deployment: Netlify (with Next.js plugin)
- Version Control: Git
- Linting: ESLint 8
- Package Manager: npm
- Environment: dotenv 16.4.7
- Search Engine: Elasticsearch (setup scripts included)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Client Layer โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โโโโโโโโโโโโ โ
โ โJob Seekerโ โ Recruiterโ โ Admin โ โ Public โ โ
โ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โโโโโโฌโโโโโโ โ
โโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโโโโผโโโโโโโโโโโ
โ โ โ โ
โโโโโโโโโโโโโโโดโโโโโโโโโโโโโโดโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Next.js Frontend (SSR) โ
โ - App Router โ
โ - React Components โ
โ - Tailwind CSS โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ API Routes (Backend) โ
โ - /api/auth/* โ
โ - /api/job/* โ
โ - /api/users/* โ
โ - /api/applications/* โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Authentication Layer โ
โ - NextAuth.js โ
โ - JWT Sessions โ
โ - OAuth Providers โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Business Logic Layer โ
โ - /lib/* utilities โ
โ - Data validation โ
โ - PDF Generation โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ Data Access Layer โ
โ - MongoDB Connection โ
โ - Cached Connections โ
โ - Query Optimization โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโ
โ External Services โ
โ - Cloudinary (Images) โ
โ - Nodemailer (Email) โ
โ - OAuth Providers โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโ
โ Users โ โ Recruiters โ โ Job Seekers โ
โโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโค
โ _id (PK) โโโโโ โ _id (PK) โ โโโโบโ _id (PK) โ
โ firstName โ โ โ userId (FK) โโโโโ โ userId (FK) โ
โ lastName โ โโโโโค recruiterNameโ โ email โ
โ email โ โ category โ โ experience โ
โ password โ โ email โ โ education โ
โ role โ โ contactNum โ โ skills โ
โ profileImg โ โ logo โ โโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ
โ โ
โโโโโโโผโโโโโโโโโ โโโโโโโโผโโโโโโโ
โ Jobs โ โApplications โ
โโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโค
โ _id (PK) โโโโโโโโโค jobId (FK) โ
โ recruiterId โ โ jobseekerId โ
โ jobTitle โ โ status โ
โ location โ โ appliedAt โ
โ category โ โ isFavourite โ
โ experience โ โโโโโโโโโโโโโโโ
โ jobTypes โ
โ isPublished โ
โโโโโโโโโโโโโโโโ
Before you begin, ensure you have the following installed:
- Node.js (v18.x or higher)
- npm or yarn
- MongoDB (v6.x or higher)
- Git
Optional:
- Elasticsearch (v8.x) - for advanced search features
- Clone the repository
git clone https://github.com/yourusername/skills-careers-web-final.git
cd skills-careers-web-final- Install dependencies
npm install- Set up environment variables
Create a .env.local file in the root directory:
cp .env.example .env.localEdit .env.local and add your credentials (see Environment Variables section)
- Set up MongoDB
Ensure MongoDB is running locally or have a MongoDB Atlas connection string ready.
# For local MongoDB
mongod --dbpath /path/to/data/directory
# Or use MongoDB Atlas connection string in .env.localCreate a .env.local file with the following variables:
# Database
MONGODB_URI=mongodb://localhost:27017/skillscareers
# Or for MongoDB Atlas:
# MONGODB_URI=mongodb+srv://username:password@cluster.mongodb.net/skillscareers
# NextAuth Configuration
NEXTAUTH_SECRET=your_nextauth_secret_here
# Generate with: openssl rand -base64 32
NEXTAUTH_URL=http://localhost:3000
# Google OAuth (Optional)
GOOGLE_CLIENT_ID=your_google_client_id
GOOGLE_CLIENT_SECRET=your_google_client_secret
# LinkedIn OAuth (Optional)
LINKEDIN_CLIENT_ID=your_linkedin_client_id
LINKEDIN_CLIENT_SECRET=your_linkedin_client_secret
# Cloudinary (for image uploads)
CLOUDINARY_CLOUD_NAME=your_cloud_name
CLOUDINARY_API_KEY=your_api_key
CLOUDINARY_API_SECRET=your_api_secret
# Email Configuration (Nodemailer)
EMAIL_USER=your_email@example.com
EMAIL_PASS=your_email_app_password
# Optional: Elasticsearch
ELASTICSEARCH_URL=http://localhost:9200
ELASTIC_CLOUD_ID=your_elastic_cloud_id
ELASTIC_API_KEY=your_elastic_api_key
# Optional: Base URL
NEXT_PUBLIC_BASE_URL=http://localhost:3000npm run devOpen http://localhost:3000 in your browser.
# Build the application
npm run build
# Start the production server
npm startnpm run lint- Create Admin Account
Once the app is running, you can create an admin account through the API:
POST /api/auth/adminsignup
Content-Type: application/json
{
"firstName": "Admin",
"lastName": "User",
"email": "admin@skillscareers.com",
"contactNumber": "+1234567890",
"password": "SecurePassword123!",
"confirmPassword": "SecurePassword123!"
}- Configure OAuth (Optional)
- Set up Google OAuth credentials in Google Cloud Console
- Set up LinkedIn OAuth credentials in LinkedIn Developer Portal
- Add authorized redirect URIs:
http://localhost:3000/api/auth/callback/googleandhttp://localhost:3000/api/auth/callback/linkedin
- Set up Elasticsearch (Optional)
# Run the setup script
node scripts/setup-elasticsearch.js
# Sync data
node scripts/sync-elasticsearch.jsskills-careers-web-final/
โโโ app/ # Next.js App Router pages
โ โโโ (signup)/ # Auth group routes
โ โ โโโ jobseekersignup/ # Job seeker registration
โ โ โโโ recruitersignup/ # Recruiter registration
โ โโโ Portal/ # Dashboard (protected routes)
โ โ โโโ analytics/ # Analytics dashboard
โ โ โโโ annoucements/ # Announcements management
โ โ โโโ bookingRecord/ # Booking/ticket records
โ โ โโโ candidates/ # Candidate management
โ โ โโโ dashboard/ # Main dashboard
โ โ โโโ inquiries/ # Support inquiries
โ โ โโโ jobApplications/ # Application management
โ โ โโโ jobsAdmin/ # Admin job management
โ โ โโโ jobsRecruiter/ # Recruiter job management
โ โ โโโ pressrelease/ # Press release management
โ โ โโโ profile/ # User profiles
โ โ โโโ recruiter/ # Recruiter management
โ โ โโโ settings/ # User settings
โ โ โโโ tickets/ # Ticket system
โ โโโ api/ # API routes
โ โ โโโ analytics/ # Analytics endpoints
โ โ โโโ announcement/ # Announcement CRUD
โ โ โโโ applications/ # Application endpoints
โ โ โโโ auth/ # Authentication
โ โ โ โโโ [...nextauth]/ # NextAuth handler
โ โ โ โโโ adminsignup/ # Admin registration
โ โ โ โโโ jobseekersignup/# Job seeker registration
โ โ โ โโโ recruitersignup/# Recruiter registration
โ โ โ โโโ forgotPassword/ # Password reset request
โ โ โ โโโ resetPassword/ # Password reset
โ โ โโโ job/ # Job CRUD operations
โ โ โโโ jobapplication/ # Job application CRUD
โ โ โโโ jobseekerdetails/ # Job seeker profile
โ โ โโโ recruiterdetails/ # Recruiter profile
โ โ โโโ users/ # User management
โ โ โโโ ... # Other endpoints
โ โโโ about/ # About page
โ โโโ applications/ # Public applications view
โ โโโ categoryPage/ # Job categories
โ โโโ contact/ # Contact page
โ โโโ dashboard/ # Recruiter dashboard (legacy)
โ โโโ jobs/ # Job listings
โ โ โโโ [jobid]/ # Job detail page
โ โโโ jobseeker/ # Job seeker profiles
โ โ โโโ [jobseekerid]/ # Job seeker detail
โ โโโ login/ # Login page
โ โโโ pressRelease/ # Press releases
โ โโโ profile/ # User profile
โ โ โโโ edit/ # Profile editing
โ โโโ recruiters/ # Recruiter directory
โ โ โโโ [recruiterid]/ # Recruiter profile
โ โโโ register/ # Registration page
โ โโโ startingpage/ # Landing page
โ โโโ tickets/ # Public tickets
โ โโโ layout.js # Root layout
โ โโโ page.js # Home page
โ โโโ Providers.js # Context providers
โ
โโโ components/ # Reusable React components
โ โโโ PortalComponents/ # Portal-specific components
โ โ โโโ PortalHeader.js # Dashboard header
โ โ โโโ PortalSidebar.js # Dashboard sidebar
โ โ โโโ dashboardStats.js # Statistics cards
โ โ โโโ dashboardCharts.js# Analytics charts
โ โ โโโ ... # Other portal components
โ โโโ StartingPageComponents/# Landing page components
โ โโโ Button.js # Reusable button
โ โโโ CategoryComponent.js # Category display
โ โโโ Footer.js # Site footer
โ โโโ jobCard.js # Job listing card
โ โโโ jobForm.js # Job posting form
โ โโโ jobSearch.js # Job search component
โ โโโ navBar.js # Navigation bar
โ โโโ newsletter.js # Newsletter signup
โ โโโ PhoneInput.js # Phone number input
โ โโโ ... # Other components
โ
โโโ lib/ # Utility libraries
โ โโโ auth.js # Authentication helpers
โ โโโ authOptions.js # NextAuth configuration
โ โโโ categories.js # Job categories data
โ โโโ cloudinary.js # Cloudinary integration
โ โโโ countries.js # Countries data
โ โโโ db.js # MongoDB connection
โ โโโ elasticsearch-utils.js# Elasticsearch utilities
โ โโโ faq.js # FAQ data
โ โโโ GenerateCV.js # PDF CV generation
โ โโโ handlers.js # Event handlers
โ โโโ mailer.js # Email sending
โ โโโ mongodb.js # MongoDB helpers
โ โโโ news.js # News data
โ โโโ successStory.js # Success stories data
โ
โโโ public/ # Static assets
โ โโโ catagory/ # Category images
โ โโโ images/ # General images
โ โโโ landing/ # Landing page assets
โ โโโ portal-dashboard/ # Dashboard assets
โ โโโ sidebar/ # Sidebar icons
โ
โโโ scripts/ # Utility scripts
โ โโโ setup-elasticsearch.js # ES index setup
โ โโโ sync-elasticsearch.js # ES data sync
โ
โโโ data/ # Static data files
โ โโโ jobCategories.json # Job categories list
โ โโโ jobExperiences.json # Experience levels
โ
โโโ .env.example # Environment variables template
โโโ .env.local # Local environment variables (gitignored)
โโโ .eslintrc.json # ESLint configuration
โโโ .gitignore # Git ignore rules
โโโ jsconfig.json # JavaScript configuration
โโโ next.config.mjs # Next.js configuration
โโโ package.json # Dependencies
โโโ postcss.config.mjs # PostCSS configuration
โโโ tailwind.config.js # Tailwind CSS configuration
โโโ README.md # This file
Admin (Full Access)
โโโ Platform Management
โโโ User Management
โโโ Content Moderation
โโโ Analytics Access
Recruiter
โโโ Company Profile Management
โโโ Job Posting & Management
โโโ Application Management
โโโ Candidate Viewing
โโโ Recruiter Analytics
Job Seeker
โโโ Profile Management
โโโ Job Search & Application
โโโ Application Tracking
โโโ CV Management
| Feature | Admin | Recruiter | Job Seeker | Public |
|---|---|---|---|---|
| View Jobs | โ | โ | โ | โ |
| Apply to Jobs | โ | โ | โ | โ |
| Post Jobs | โ | โ | โ | โ |
| Manage Applications | โ | โ | โ | โ |
| View Candidate Profiles | โ | โ | โ | โ |
| Edit Own Profile | โ | โ | โ | โ |
| Platform Analytics | โ | โ | โ | โ |
| Recruiter Analytics | โ | โ | โ | โ |
| User Management | โ | โ | โ | โ |
| Content Moderation | โ | โ | โ | โ |
| Press Release Management | โ | โ | โ | โ |
| Support Ticket Management | โ | โ | โ | โ |
User Registration
โโโ Job Seeker โ Create User + Job Seeker Profile
โโโ Recruiter โ Create User + Recruiter Profile
โโโ Admin โ Create User + Admin Profile (admin only)
Login Methods
โโโ Email/Password (Credentials)
โโโ Google OAuth
โโโ LinkedIn OAuth
Session Management
โโโ JWT-based sessions
โโโ Secure HTTP-only cookies
โโโ Role-based access control
1. Job Seeker browses jobs
โ
2. Applies to job with one click
โ
3. Application created with status: "Pending"
โ
4. Recruiter receives application notification
โ
5. Recruiter reviews application
โ
6. Recruiter updates status:
- Approve โ Status: "Approved"
- Decline โ Status: "Declined"
- Favorite โ isFavourited: true
โ
7. Job Seeker receives notification
โ
8. Job Seeker can track all applications
1. Recruiter creates job posting
โ
2. Job saved with isPublished: false
โ
3. Recruiter reviews/edits job
โ
4. Recruiter publishes job
โ
5. Job appears in public listings
โ
6. Admin can moderate/unpublish
โ
7. Recruiter can unpublish/edit/delete
POST /api/auth/jobseekersignup
Content-Type: application/json
{
"firstName": "John",
"lastName": "Doe",
"email": "john@example.com",
"contactNumber": "+1234567890",
"password": "SecurePass123!",
"confirmPassword": "SecurePass123!"
}
Response: 201 Created
{
"message": "User and jobseeker created!"
}POST /api/auth/recruitersignup
Content-Type: application/json
{
"firstName": "Jane",
"lastName": "Smith",
"recruiterName": "Tech Corp",
"category": "Information Technology",
"employeeRange": "50-100",
"email": "jane@techcorp.com",
"contactNumber": "+1234567890",
"password": "SecurePass123!",
"confirmPassword": "SecurePass123!"
}
Response: 201 Created
{
"message": "User and recruiter created!"
}POST /api/auth/signin
Content-Type: application/json
{
"email": "user@example.com",
"password": "password"
}
Response: 200 OK
{
"user": {
"id": "...",
"email": "user@example.com",
"role": "jobseeker"
}
}GET /api/job/all?showAll=false&recruiterId=123
Response: 200 OK
{
"jobs": [...],
"count": 42
}GET /api/job/[id]
Response: 200 OK
{
"job": {
"_id": "...",
"jobTitle": "Software Engineer",
"location": "New York",
...
}
}POST /api/job/add
Authorization: Bearer <token>
Content-Type: application/json
{
"jobTitle": "Senior Developer",
"location": "San Francisco",
"jobCategory": "IT & Software",
"jobExperience": "5-7 Years",
"jobTypes": ["Full-Time", "Remote"],
"jobDescription": "...",
"keyResponsibilities": "...",
"shortDescription": "..."
}
Response: 201 Created
{
"message": "Job created successfully",
"jobId": "..."
}PUT /api/job/update
Authorization: Bearer <token>
Content-Type: application/json
{
"jobId": "...",
"jobTitle": "Updated Title",
...
}
Response: 200 OK
{
"message": "Job updated successfully"
}PATCH /api/job/[id]/publish
Authorization: Bearer <token>
Content-Type: application/json
{
"isPublished": true
}
Response: 200 OK
{
"message": "Job published successfully"
}GET /api/job/search?query=developer
Response: 200 OK
{
"jobs": [...]
}GET /api/job/filter?jobCategory=IT&jobExperience=3-5%20Years
Response: 200 OK
{
"jobs": [...]
}POST /api/jobapplication/add
Authorization: Bearer <token>
Content-Type: application/json
{
"jobId": "...",
"jobseekerId": "..."
}
Response: 201 Created
{
"message": "Application submitted successfully",
"applicationId": "..."
}GET /api/jobapplication/all?recruiterId=123
Response: 200 OK
{
"applications": [...],
"count": 15
}PUT /api/jobapplication/update
Authorization: Bearer <token>
Content-Type: application/json
{
"applicationId": "...",
"status": "Approved",
"isFavourited": true
}
Response: 200 OK
{
"message": "Application updated successfully"
}GET /api/users/get?id=123
Response: 200 OK
{
"user": {
"_id": "...",
"firstName": "John",
"email": "john@example.com",
"role": "jobseeker"
}
}PUT /api/users/update
Authorization: Bearer <token>
Content-Type: application/json
{
"userId": "...",
"firstName": "John",
"lastName": "Updated"
}
Response: 200 OK
{
"message": "User updated successfully"
}POST /api/users/uploadimage
Authorization: Bearer <token>
Content-Type: multipart/form-data
image: <file>
Response: 200 OK
{
"message": "Image uploaded successfully",
"imageUrl": "https://..."
}{
_id: ObjectId,
firstName: String,
lastName: String,
email: String (unique, indexed),
password: String (hashed),
profileImage: String (URL),
role: String ("admin" | "recruiter" | "jobseeker"),
createdAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
email: String,
contactNumber: String,
dob: Date,
nationality: String,
languages: [String],
address: String,
age: Number,
maritalStatus: String,
religion: String,
ethnicity: String,
coverImage: String,
createdAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
recruiterName: String,
category: String,
email: String,
employeeRange: String,
contactNumber: String,
website: String,
companyDescription: String,
industry: String,
location: String,
logo: String (URL),
coverImage: String,
facebook: String,
instagram: String,
linkedin: String,
x: String,
createdAt: Date
}{
_id: ObjectId,
recruiterId: ObjectId (ref: recruiters),
jobTitle: String (indexed),
location: String (indexed),
jobCategory: String (indexed),
jobExperience: String,
jobTypes: [String],
jobDescription: String (text),
keyResponsibilities: String (text),
shortDescription: String,
isPublished: Boolean (default: false, indexed),
createdAt: Date,
updatedAt: Date
}{
_id: ObjectId,
jobId: ObjectId (ref: jobs),
jobseekerId: ObjectId (ref: jobseekers),
recruiterId: ObjectId (ref: recruiters),
status: String ("Pending" | "Approved" | "Declined"),
isFavourited: Boolean (default: false),
appliedAt: Date,
updatedAt: Date
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
jobTitle: String,
companyName: String,
country: String,
city: String,
startDate: Date,
endDate: Date,
description: String
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
institutionName: String,
degree: String,
fieldOfStudy: String,
startDate: Date,
endDate: Date,
description: String
}{
_id: ObjectId,
jobseekerId: ObjectId (ref: jobseekers),
certificationName: String,
issuingOrganization: String,
receivedDate: Date,
expiryDate: Date,
credentialId: String
}{
_id: ObjectId,
userId: ObjectId (ref: users),
firstName: String,
lastName: String,
contactNumber: String,
email: String,
password: String (hashed),
profileImage: String,
createdAt: Date
}{
_id: ObjectId,
title: String,
description: String,
createdAt: Date,
updatedAt: Date
}{
_id: ObjectId,
userId: ObjectId (ref: users),
name: String,
email: String,
subject: String,
message: String,
status: String,
createdAt: Date
}{
_id: ObjectId,
title: String,
description: String,
image: String,
createdAt: Date
}{
_id: ObjectId,
recruiterId: ObjectId (ref: recruiters),
title: String,
description: String,
location: String,
date: Date,
time: String,
capacity: Number,
createdAt: Date
}{
_id: ObjectId,
ticketId: ObjectId (ref: tickets),
jobseekerId: ObjectId (ref: jobseekers),
enrolledAt: Date
}// Performance optimization indexes
db.users.createIndex({ email: 1 }, { unique: true });
db.jobs.createIndex({ isPublished: 1, createdAt: -1 });
db.jobs.createIndex({
jobTitle: "text",
jobCategory: "text",
location: "text",
});
db.jobapplications.createIndex({ jobId: 1, jobseekerId: 1 }, { unique: true });
db.jobapplications.createIndex({ recruiterId: 1, status: 1 });Netlify configuration has been removed; use Vercel or Docker for current deployments.
# Install Vercel CLI
npm install -g vercel
# Deploy
vercel
# Production deployment
vercel --prodCreate Dockerfile:
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]Build and run:
docker build -t skills-careers .
docker run -p 3000:3000 --env-file .env.local skills-careers- Job seeker registration
- Recruiter registration
- Login with credentials
- Google OAuth login
- LinkedIn OAuth login
- Password reset flow
- Session persistence
- Profile creation/editing
- CV upload and generation
- Job search and filtering
- Job application submission
- Application tracking
- Recruiter profile viewing
- Company profile setup
- Job posting creation
- Job publishing/unpublishing
- Application management
- Candidate profile viewing
- Analytics dashboard
- User management
- Job moderation
- Platform analytics
- Press release management
- Announcement management
- Support ticket management
# Install testing tools
npm install -g lighthouse
# Run Lighthouse audit
lighthouse http://localhost:3000 --viewWe welcome contributions! Please follow these guidelines:
- Fork the repository
- Create a feature branch
git checkout -b feature/amazing-feature
- Commit your changes
git commit -m 'Add amazing feature' - Push to the branch
git push origin feature/amazing-feature
- Open a Pull Request
- Follow ESLint configuration
- Use Tailwind CSS for styling
- Write meaningful commit messages
- Add comments for complex logic
- Test your changes thoroughly
- Describe your changes clearly
- Reference any related issues
- Ensure all tests pass
- Update documentation if needed
This project is licensed under the MIT License - see the LICENSE file for details.
- Lead Developer: CodeZela Technologies
- Contributors: Diluksha Namal, Shamal Rajapaksha
- Next.js team for the amazing framework
- MongoDB for reliable database solutions
- All open-source contributors
- Documentation: Wiki
- Issues: GitHub Issues
- Email: support@skillscareers.lk
- Website: skillscareers.lk
- โ Core authentication system
- โ Job posting and management
- โ Application tracking
- โ Admin dashboard
- โ CV generation
- ๐ Real-time notifications
- ๐ Advanced analytics
- ๐ AI-powered job recommendations
- ๐ Calendar integration
- ๐ Skills assessment tests
- ๐ Company reviews
- ๐ Dark mode
Made with โค๏ธ by the Skills Careers Team