Skip to content

kunald08/RevHire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

8 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

RevHire β€” Console-Based Job Portal

A role-based recruitment system built with Java SE, JDBC, and MySQL.
Job seekers can search for jobs, build a resume, manage their profile, and track applications.
Employers can manage company profiles, post jobs, manage applicants, and view hiring statistics β€” all from the terminal.


Features

Job Seeker

Feature Description
Registration Separate seeker flow with optional profile fields (phone, education, skills, certifications)
Login & Password Reset Email-based auth with security Q&A for password reset
Profile Management Update phone, education, work experience, skills, certifications anytime
Profile Completion Percentage tracker (5 profile fields, 20% each)
Resume Create and update a structured resume (objective, education, experience, skills, projects)
Job Search Browse all jobs or filter by title, location, type, experience, company name, salary range
View Job Details Full details: description, skills required, education req, salary range, deadline
Apply Apply with optional cover letter; validates resume exists and no duplicates
Applications View status, job title, company, date, employer comments; APPLIED/SHORTLISTED/REJECTED/WITHDRAWN
Withdraw Confirmation prompt with optional reason; sets status to WITHDRAWN (preserves record)
Notifications In-app alerts with unread count badge; mark as read individually or all at once

Employer

Feature Description
Registration Separate employer flow; prompted to create company after login
Company Profile Create, view, and update company profile (name, industry, size, website, description, location)
Job Management Post (with description, skills required, education req, salary range, deadline), edit, close, reopen, delete jobs
Applicant View View all applicants per job with formatted tables
Filter Applicants Filter by skills, education, experience, application date
Actions Shortlist / reject individually or in bulk with notifications to each applicant
Comments Add review comments on application (triggers notification to applicant)
Statistics View applied / shortlisted / rejected / withdrawn counts per job
Resume View View any applicant's resume by application ID
Notifications View notifications with unread badge, mark all as read

Tech Stack

Layer Technology
Language Java 17+
Database MySQL 8+
Persistence JDBC (PreparedStatement)
Build Maven
Logging Log4j 2 (console + rolling file)
Testing JUnit 5

Project Structure

src/main/java/com/revhire/
β”œβ”€β”€ app/            Main.java          β€” Console UI, menus, input helpers
β”œβ”€β”€ config/         DBConfig.java      β€” DB connection constants
β”œβ”€β”€ util/           DBUtil.java        β€” JDBC connection factory
β”œβ”€β”€ model/          User, Job, Company, Application, Resume, Notification
β”œβ”€β”€ dao/            Interfaces (UserDao, JobDao, etc.)
β”‚   └── impl/       JDBC implementations
└── service/        AuthService, JobSeekerService, EmployerService

src/test/java/com/revhire/service/
β”œβ”€β”€ AuthServiceTest.java
β”œβ”€β”€ EmployerServiceTest.java
└── JobSeekerServiceTest.java

sql/
└── schema.sql      β€” Complete DB schema (6 tables)

Architecture Diagram

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                    PRESENTATION LAYER                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€-────────────┐ β”‚
β”‚  β”‚                   Main.java                        β”‚ β”‚
β”‚  β”‚  β€’ Welcome Menu (Register Seeker / Employer / Login) β”‚
β”‚  β”‚  β€’ Job Seeker Menu (15 options)                    β”‚ β”‚
β”‚  β”‚  β€’ Employer Menu (21 options)                      β”‚ β”‚
β”‚  β”‚  β€’ Input validation & display formatting           β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                    SERVICE LAYER                        β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚AuthServiceβ”‚  β”‚JobSeekerSvc  β”‚  β”‚  EmployerService β”‚  β”‚
β”‚  β”‚β€’ register β”‚  β”‚β€’ searchJobs  β”‚  β”‚β€’ postJob         β”‚  β”‚
β”‚  β”‚β€’ login    β”‚  β”‚β€’ applyJob    β”‚  β”‚β€’ bulkShortlist   β”‚  β”‚
β”‚  β”‚β€’ password β”‚  β”‚β€’ createResumeβ”‚  β”‚β€’ filterApplicantsβ”‚  β”‚
β”‚  β”‚β€’ profile  β”‚  β”‚β€’ withdraw    β”‚  β”‚β€’ deleteJob       β”‚  β”‚
β”‚  β”‚β€’ getUserByβ”‚  β”‚β€’ notificationsβ”‚ β”‚β€’ updateCompany   β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                   DAO LAYER (Interfaces)                β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚  β”‚UserDao β”‚ β”‚JobDaoβ”‚ β”‚ResumeDaoβ”‚ β”‚CompanyDaoβ”‚           β”‚
β”‚  β””β”€β”€β”€β”¬β”€β”€β”€β”€β”˜ β””β”€β”€β”¬β”€β”€β”€β”˜ β””β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜           β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚
β”‚  β”‚ApplicationDaoβ”‚ β”‚NotificationDaoβ”‚             β”‚       β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜               β”‚       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”‚
β”‚                DAO IMPL LAYER                    β”‚      β”‚
β”‚  β€’ PreparedStatement for all queries             β”‚      β”‚
β”‚  β€’ Transaction management (delete job)           β”‚      β”‚
β”‚  β€’ Dynamic WHERE clause building (search/filter) β”‚      β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€      β”‚
β”‚               DATABASE (MySQL 8+)                β”‚      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”‚      β”‚
β”‚  β”‚users β”‚ β”‚jobsβ”‚ β”‚resumesβ”‚ β”‚applications β”‚       β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜       β”‚      β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                    β”‚      β”‚
β”‚  β”‚companiesβ”‚ β”‚notifications β”‚                    β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β”‚      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚

Design principles:

  • Interface-driven DAO layer (easy to swap implementations)
  • Service layer enforces business rules (resume-before-apply, no duplicate applications, ownership checks)
  • PreparedStatements prevent SQL injection
  • Log4j 2 logs every action to console + logs/revhire.log
  • Notifications sent automatically on: apply, shortlist, reject, bulk actions, comments
  • Profile completion tracking calculated dynamically

ERD (Entity-Relationship Diagram)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚           USERS              β”‚       β”‚           COMPANIES             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€       β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ PK  id            INT AUTO   β”‚       β”‚ PK  id            INT AUTO     β”‚
β”‚     name          VARCHAR    β”‚       β”‚ FK  employer_id   INT (UNIQUE) │──┐
β”‚     email         VARCHAR UQ β”‚       β”‚     name          VARCHAR      β”‚  β”‚
β”‚     password      VARCHAR    β”‚       β”‚     industry      VARCHAR      β”‚  β”‚
β”‚     role          ENUM       β”‚       β”‚     size          VARCHAR      β”‚  β”‚
β”‚     phone         VARCHAR    β”‚       β”‚     description   TEXT         β”‚  β”‚
β”‚     education     TEXT       β”‚       β”‚     website       VARCHAR      β”‚  β”‚
β”‚     work_experience TEXT     β”‚       β”‚     location      VARCHAR      β”‚  β”‚
β”‚     skills        TEXT       β”‚       β”‚     created_at    TIMESTAMP    β”‚  β”‚
β”‚     certifications TEXT      β”‚       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β”‚     security_question VARCHARβ”‚                                           β”‚
β”‚     security_answer VARCHAR  β”‚                                           β”‚
β”‚     created_at    TIMESTAMP  β”‚                                           β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                           β”‚
           β”‚                                                               β”‚
           β”‚  1:1                                                   1:1    β”‚
           β”‚                                                               β”‚
           β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚  1:N                   1:N
           β”‚                         β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚        RESUMES          β”‚     β”‚              JOBS                   β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€     β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ PK  id        INT AUTO  β”‚     β”‚ PK  id              INT AUTO        β”‚
    β”‚ FK  user_id   INT (UQ)  β”‚     β”‚ FK  employer_id     INT             β”‚
    β”‚     objective TEXT      β”‚     β”‚     title           VARCHAR         β”‚
    β”‚     education TEXT      β”‚     β”‚     description     TEXT            β”‚
    β”‚     experience TEXT     β”‚     β”‚     company         VARCHAR         β”‚
    β”‚     skills    TEXT      β”‚     β”‚     location        VARCHAR         β”‚
    β”‚     projects  TEXT      β”‚     β”‚     experience      INT             β”‚
    β”‚     created_at TIMESTAMPβ”‚     β”‚     salary_min      DECIMAL         β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β”‚     salary_max      DECIMAL         β”‚
                                    β”‚     job_type        ENUM            β”‚
                                    β”‚     skills_required TEXT            β”‚
           β”‚                        β”‚     education_req   VARCHAR         β”‚
           β”‚                        β”‚     deadline        DATE            β”‚
           β”‚                        β”‚     status          ENUM            β”‚
           β”‚                        β”‚     created_at      TIMESTAMP       β”‚
           β”‚                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚                                   β”‚
           β”‚  1:N                              β”‚  1:N
           β”‚                                   β”‚
           β”‚    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
           β”‚    β”‚                APPLICATIONS                        β”‚
           β”‚    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
           β”‚    β”‚ PK  id              INT AUTO                       β”‚
           β”‚    β”‚ FK  user_id         INT    ──── USERS.id           β”‚
           β”‚    β”‚ FK  job_id          INT    ──── JOBS.id            β”‚
           β”‚    β”‚     status          ENUM (APPLIED/SHORTLISTED/     β”‚
           β”‚    β”‚                          REJECTED/WITHDRAWN)       β”‚
           β”‚    β”‚     cover_letter    TEXT                           β”‚
           β”‚    β”‚     withdraw_reason VARCHAR                        β”‚
           β”‚    β”‚     comment         TEXT                           β”‚
           β”‚    β”‚     applied_at      TIMESTAMP                      β”‚
           β”‚    β”‚     UNIQUE(user_id, job_id)                        β”‚
           β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
           β”‚
           β”‚  1:N
           β”‚
    β”Œβ”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
    β”‚              NOTIFICATIONS                       β”‚
    β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
    β”‚ PK  id              INT AUTO                     β”‚
    β”‚ FK  user_id         INT    ──── USERS.id         β”‚
    β”‚     message         TEXT                         β”‚
    β”‚     is_read         BOOLEAN (DEFAULT FALSE)      β”‚
    β”‚     created_at      TIMESTAMP                    β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Relationships:
  USERS  1 ──── 1  RESUMES      (one resume per job seeker)
  USERS  1 ──── 1  COMPANIES    (one company per employer)
  USERS  1 ──── N  JOBS         (employer posts many jobs)
  USERS  1 ──── N  APPLICATIONS (seeker applies to many jobs)
  JOBS   1 ──── N  APPLICATIONS (one job has many applicants)
  USERS  1 ──── N  NOTIFICATIONS (one user gets many notifications)

Database Schema

Six tables with foreign keys and constraints:

Table Purpose Key Columns
users Accounts with role (JOB_SEEKER / EMPLOYER) and profile phone, education, work_experience, skills, certifications
jobs Listings with full details description, skills_required, education_req, salary_min/max, deadline
resumes One resume per user (UNIQUE constraint) objective, education, experience, skills, projects
applications User→Job with status tracking cover_letter, withdraw_reason, status (4 states), comment
companies One company profile per employer size, website, industry, description
notifications Alerts for status changes, comments, etc. is_read, created_at

Setup & Run

Prerequisites

  • Java 17 or higher
  • MySQL 8+
  • Maven 3.8+

1. Create the database

mysql -u root -p < sql/schema.sql

2. Configure connection

Edit src/main/java/com/revhire/config/DBConfig.java:

public static final String URL  = "jdbc:mysql://localhost:3306/revhire";
public static final String USER = "root";
public static final String PASS = "your_password";

3. Build

mvn clean compile

4. Run (from IntelliJ IDEA)

Open the project in IntelliJ β†’ run Main.java (right-click β†’ Run).

Or from terminal:

mvn -q exec:java -Dexec.mainClass="com.revhire.app.Main"

5. Run tests

mvn test

Note: Tests are integration tests that require a running MySQL instance with the revhire database.


Business Rules

  • Separate registration flows β€” Job Seekers provide profile fields; Employers are prompted to create a company
  • Profile completion tracking β€” 5 profile fields (phone, education, work experience, skills, certifications); percentage shown in menu
  • Resume required β€” job seekers must create a resume before applying
  • No duplicate applications β€” enforced at both service and DB level (UNIQUE constraint)
  • Cover letter support β€” optional cover letter submitted with each application
  • Withdraw with reason β€” confirmation prompt; sets status to WITHDRAWN (preserves audit trail)
  • Role-based access β€” job seekers and employers see completely different menus
  • Employer ownership β€” employers can only edit/close/delete their own jobs
  • Delete job β€” cascading delete removes all associated applications (with confirmation)
  • Notifications β€” automatic alerts on: apply, shortlist, reject, bulk actions, comments
  • Unread badge β€” notification count shown in menu header
  • Salary range β€” jobs specify min/max salary; search supports range filtering
  • Password security β€” change password requires old password; reset requires security Q&A

Application Statuses

Status Description
APPLIED Initial state when seeker applies
SHORTLISTED Employer moved applicant forward
REJECTED Employer declined the application
WITHDRAWN Seeker withdrew their application (with optional reason)

Logging

All actions are logged via Log4j 2:

  • Console β€” compact format (HH:mm:ss LEVEL Class β€” message)
  • File β€” detailed format in logs/revhire.log (rolling)
  • Events logged: registration, login, job posting, applications, status changes, bulk actions, errors

License

This project is for educational purposes.

About

a console-based job portal application built using Java & MySQL

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages