Skip to content

comprehensive job portal platform built with Next.js 15, designed to streamline the hiring process by connecting talented job seekers with top recruiters

Notifications You must be signed in to change notification settings

codezelat/skills-careers-web-final

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

404 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Skills Careers

Next.js React MongoDB TailwindCSS License

A modern, full-stack job portal connecting job seekers with recruiters

Features β€’ Quick Start β€’ Architecture β€’ API Docs β€’ Contributing


πŸ“‹ Table of Contents


🎯 Overview

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.

Key Highlights

  • πŸ” 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

✨ Features

For Job Seekers

  • βœ… 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

For Recruiters

  • βœ… 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

For Administrators

  • βœ… 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

Platform Features

  • πŸ” 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

πŸ› οΈ Tech Stack

Frontend

  • 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

Backend

  • 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

DevOps & Tools

  • Deployment: Netlify (with Next.js plugin)
  • Version Control: Git
  • Linting: ESLint 8
  • Package Manager: npm
  • Environment: dotenv 16.4.7

Optional/Future

  • Search Engine: Elasticsearch (setup scripts included)

πŸ—οΈ Architecture

System Design

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        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         β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Database Design

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚    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  β”‚
                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸš€ Getting Started

Prerequisites

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

Installation

  1. Clone the repository
git clone https://github.com/yourusername/skills-careers-web-final.git
cd skills-careers-web-final
  1. Install dependencies
npm install
  1. Set up environment variables

Create a .env.local file in the root directory:

cp .env.example .env.local

Edit .env.local and add your credentials (see Environment Variables section)

  1. 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.local

Environment Variables

Create a .env.local file with the following variables:

# Database
MONGODB_URI=mongodb://localhost:27017/skillscareers
# Or for MongoDB Atlas:
# MONGODB_URI=mongodb+srv://username:[email protected]/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=[email protected]
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:3000

Running the Application

Development Mode

npm run dev

Open http://localhost:3000 in your browser.

Production Build

# Build the application
npm run build

# Start the production server
npm start

Linting

npm run lint

Initial Setup

  1. 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": "[email protected]",
  "contactNumber": "+1234567890",
  "password": "SecurePassword123!",
  "confirmPassword": "SecurePassword123!"
}
  1. 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/google and http://localhost:3000/api/auth/callback/linkedin
  1. Set up Elasticsearch (Optional)
# Run the setup script
node scripts/setup-elasticsearch.js

# Sync data
node scripts/sync-elasticsearch.js

πŸ“ Project Structure

skills-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

πŸ‘₯ User Roles & Permissions

Role Hierarchy

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

Access Control Matrix

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 βœ… βœ… βœ… ❌

πŸ”§ Core Functionality

Authentication Flow

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

Job Application Workflow

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

Job Posting Workflow

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

πŸ“š API Documentation

Authentication Endpoints

Register Job Seeker

POST /api/auth/jobseekersignup
Content-Type: application/json

{
  "firstName": "John",
  "lastName": "Doe",
  "email": "[email protected]",
  "contactNumber": "+1234567890",
  "password": "SecurePass123!",
  "confirmPassword": "SecurePass123!"
}

Response: 201 Created
{
  "message": "User and jobseeker created!"
}

Register Recruiter

POST /api/auth/recruitersignup
Content-Type: application/json

{
  "firstName": "Jane",
  "lastName": "Smith",
  "recruiterName": "Tech Corp",
  "category": "Information Technology",
  "employeeRange": "50-100",
  "email": "[email protected]",
  "contactNumber": "+1234567890",
  "password": "SecurePass123!",
  "confirmPassword": "SecurePass123!"
}

Response: 201 Created
{
  "message": "User and recruiter created!"
}

Login

POST /api/auth/signin
Content-Type: application/json

{
  "email": "[email protected]",
  "password": "password"
}

Response: 200 OK
{
  "user": {
    "id": "...",
    "email": "[email protected]",
    "role": "jobseeker"
  }
}

Job Endpoints

Get All Jobs

GET /api/job/all?showAll=false&recruiterId=123

Response: 200 OK
{
  "jobs": [...],
  "count": 42
}

Get Single Job

GET /api/job/[id]

Response: 200 OK
{
  "job": {
    "_id": "...",
    "jobTitle": "Software Engineer",
    "location": "New York",
    ...
  }
}

Create Job

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": "..."
}

Update Job

PUT /api/job/update
Authorization: Bearer <token>
Content-Type: application/json

{
  "jobId": "...",
  "jobTitle": "Updated Title",
  ...
}

Response: 200 OK
{
  "message": "Job updated successfully"
}

Publish/Unpublish Job

PATCH /api/job/[id]/publish
Authorization: Bearer <token>
Content-Type: application/json

{
  "isPublished": true
}

Response: 200 OK
{
  "message": "Job published successfully"
}

Search Jobs

GET /api/job/search?query=developer

Response: 200 OK
{
  "jobs": [...]
}

Filter Jobs

GET /api/job/filter?jobCategory=IT&jobExperience=3-5%20Years

Response: 200 OK
{
  "jobs": [...]
}

Application Endpoints

Apply to Job

POST /api/jobapplication/add
Authorization: Bearer <token>
Content-Type: application/json

{
  "jobId": "...",
  "jobseekerId": "..."
}

Response: 201 Created
{
  "message": "Application submitted successfully",
  "applicationId": "..."
}

Get Applications

GET /api/jobapplication/all?recruiterId=123

Response: 200 OK
{
  "applications": [...],
  "count": 15
}

Update Application Status

PUT /api/jobapplication/update
Authorization: Bearer <token>
Content-Type: application/json

{
  "applicationId": "...",
  "status": "Approved",
  "isFavourited": true
}

Response: 200 OK
{
  "message": "Application updated successfully"
}

User Management Endpoints

Get User Profile

GET /api/users/get?id=123

Response: 200 OK
{
  "user": {
    "_id": "...",
    "firstName": "John",
    "email": "[email protected]",
    "role": "jobseeker"
  }
}

Update User

PUT /api/users/update
Authorization: Bearer <token>
Content-Type: application/json

{
  "userId": "...",
  "firstName": "John",
  "lastName": "Updated"
}

Response: 200 OK
{
  "message": "User updated successfully"
}

Upload Profile Image

POST /api/users/uploadimage
Authorization: Bearer <token>
Content-Type: multipart/form-data

image: <file>

Response: 200 OK
{
  "message": "Image uploaded successfully",
  "imageUrl": "https://..."
}

πŸ—„οΈ Database Schema

Collections

users

{
  _id: ObjectId,
  firstName: String,
  lastName: String,
  email: String (unique, indexed),
  password: String (hashed),
  profileImage: String (URL),
  role: String ("admin" | "recruiter" | "jobseeker"),
  createdAt: Date
}

jobseekers

{
  _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
}

recruiters

{
  _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
}

jobs

{
  _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
}

jobapplications

{
  _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
}

experiences

{
  _id: ObjectId,
  jobseekerId: ObjectId (ref: jobseekers),
  jobTitle: String,
  companyName: String,
  country: String,
  city: String,
  startDate: Date,
  endDate: Date,
  description: String
}

educations

{
  _id: ObjectId,
  jobseekerId: ObjectId (ref: jobseekers),
  institutionName: String,
  degree: String,
  fieldOfStudy: String,
  startDate: Date,
  endDate: Date,
  description: String
}

certifications

{
  _id: ObjectId,
  jobseekerId: ObjectId (ref: jobseekers),
  certificationName: String,
  issuingOrganization: String,
  receivedDate: Date,
  expiryDate: Date,
  credentialId: String
}

admins

{
  _id: ObjectId,
  userId: ObjectId (ref: users),
  firstName: String,
  lastName: String,
  contactNumber: String,
  email: String,
  password: String (hashed),
  profileImage: String,
  createdAt: Date
}

announcements

{
  _id: ObjectId,
  title: String,
  description: String,
  createdAt: Date,
  updatedAt: Date
}

inquiries

{
  _id: ObjectId,
  userId: ObjectId (ref: users),
  name: String,
  email: String,
  subject: String,
  message: String,
  status: String,
  createdAt: Date
}

pressreleases

{
  _id: ObjectId,
  title: String,
  description: String,
  image: String,
  createdAt: Date
}

tickets

{
  _id: ObjectId,
  recruiterId: ObjectId (ref: recruiters),
  title: String,
  description: String,
  location: String,
  date: Date,
  time: String,
  capacity: Number,
  createdAt: Date
}

ticketenrollments

{
  _id: ObjectId,
  ticketId: ObjectId (ref: tickets),
  jobseekerId: ObjectId (ref: jobseekers),
  enrolledAt: Date
}

Indexes

// 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 });

🚒 Deployment

Netlify configuration has been removed; use Vercel or Docker for current deployments.

Vercel Deployment

# Install Vercel CLI
npm install -g vercel

# Deploy
vercel

# Production deployment
vercel --prod

Docker Deployment

Create 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

πŸ§ͺ Testing

Manual Testing Checklist

Authentication

  • Job seeker registration
  • Recruiter registration
  • Login with credentials
  • Google OAuth login
  • LinkedIn OAuth login
  • Password reset flow
  • Session persistence

Job Seeker Features

  • Profile creation/editing
  • CV upload and generation
  • Job search and filtering
  • Job application submission
  • Application tracking
  • Recruiter profile viewing

Recruiter Features

  • Company profile setup
  • Job posting creation
  • Job publishing/unpublishing
  • Application management
  • Candidate profile viewing
  • Analytics dashboard

Admin Features

  • User management
  • Job moderation
  • Platform analytics
  • Press release management
  • Announcement management
  • Support ticket management

Performance Testing

# Install testing tools
npm install -g lighthouse

# Run Lighthouse audit
lighthouse http://localhost:3000 --view

🀝 Contributing

We welcome contributions! Please follow these guidelines:

Development Workflow

  1. Fork the repository
  2. Create a feature branch
    git checkout -b feature/amazing-feature
  3. Commit your changes
    git commit -m 'Add amazing feature'
  4. Push to the branch
    git push origin feature/amazing-feature
  5. Open a Pull Request

Coding Standards

  • Follow ESLint configuration
  • Use Tailwind CSS for styling
  • Write meaningful commit messages
  • Add comments for complex logic
  • Test your changes thoroughly

Pull Request Guidelines

  • Describe your changes clearly
  • Reference any related issues
  • Ensure all tests pass
  • Update documentation if needed

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ‘¨β€πŸ’» Authors & Acknowledgments

Development Team

Special Thanks

  • Next.js team for the amazing framework
  • MongoDB for reliable database solutions
  • All open-source contributors

πŸ“ž Support & Contact


πŸ—ΊοΈ Roadmap

Current Version (v1.0.0)

  • βœ… Core authentication system
  • βœ… Job posting and management
  • βœ… Application tracking
  • βœ… Admin dashboard
  • βœ… CV generation

Upcoming Features (v1.1.0)

  • πŸ”„ Real-time notifications
  • πŸ”„ Advanced analytics
  • πŸ”„ AI-powered job recommendations

Future Enhancements

  • πŸ“… Calendar integration
  • πŸ“… Skills assessment tests
  • πŸ“… Company reviews
  • πŸ“… Dark mode

Made with ❀️ by the Skills Careers Team

⬆ Back to Top

About

comprehensive job portal platform built with Next.js 15, designed to streamline the hiring process by connecting talented job seekers with top recruiters

Topics

Resources

Stars

Watchers

Forks

Contributors 8