# farooqpersonal12/resume-screener architecture

> Architecture diagram of the GitHub repository farooqpersonal12/resume-screener, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/farooqpersonal12/resume-screener
- Repository: https://github.com/farooqpersonal12/resume-screener

## Overview

Smart Resume Screener is a Spring Boot backend for managing candidates, jobs, and resumes, then producing explainable candidate–job evaluations and score-based shortlists. The primary workflow creates a candidate and job, uploads their documents, extracts resume text and job-description text, requests semantic evaluation from Gemini, and stores the resulting score, skills, and justification for retrieval or shortlisting. The graph follows documented capabilities and sampled service/controller calls; several CRUD service implementations were not sampled, so their detailed wiring is not expanded.

Main entry points: [`src/main/java/com/resumescreener/resume_screener/service/MatchResultService.java`](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/MatchResultService.java) (Matching / Shortlisting), [`src/main/java/com/resumescreener/resume_screener/service/ResumeService.java`](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/ResumeService.java) (Resume Management), [`src/main/java/com/resumescreener/resume_screener/repository/CandidateRepository.java`](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/CandidateRepository.java) (Candidate Repository), [`src/main/java/com/resumescreener/resume_screener/service/LLMMatchingService.java`](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/LLMMatchingService.java) (LLM Matching Client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["REST API"]
  node_candidate_api["Candidate API"]
  node_job_api["Job API<br/>[JobController.java]"]
  node_resume_api["Resume API"]
  node_match_api["Match API"]
  node_api_dtos["Request / Response DTOs"]
end

subgraph group_workflow["Screening Workflows"]
  node_candidate_service["Candidate Management"]
  node_job_service["Job Management<br/>[JobService.java]"]
  node_resume_service["Resume Management<br/>[ResumeService.java]"]
  node_match_service["Matching / Shortlisting"]
  node_pdf_extract["PDF Text Extraction"]
  node_resume_parse["Resume Field Parsing"]
  node_llm_service["LLM Matching Client"]
  node_llm_result["LLM Match Result DTO"]
end

subgraph group_data["Persistence"]
  node_candidate_repo["Candidate Repository"]
  node_job_repo["Job Repository<br/>[JobRepository.java]"]
  node_resume_repo["Resume Repository"]
  node_match_repo["Match Repository"]
  node_entities["Persistent Entities"]
end

subgraph group_integration["External Integration"]
  node_mysql[("MySQL Database")]
  node_gemini["Gemini API"]
end

node_recruiter(("Recruiter / Client"))

node_recruiter -->|"manages candidates"| node_candidate_api
node_recruiter -->|"manages jobs"| node_job_api
node_recruiter -->|"uploads resumes"| node_resume_api
node_recruiter -->|"requests screening"| node_match_api
node_candidate_api -->|"dispatches"| node_candidate_service
node_job_api -->|"dispatches"| node_job_service
node_resume_api -->|"dispatches"| node_resume_service
node_match_api -->|"dispatches"| node_match_service
node_candidate_api -->|"uses"| node_api_dtos
node_job_api -->|"uses"| node_api_dtos
node_resume_api -->|"uses"| node_api_dtos
node_match_api -->|"uses"| node_api_dtos
node_candidate_service -->|"reads / writes"| node_candidate_repo
node_job_service -->|"reads / writes"| node_job_repo
node_job_service -->|"extracts JD text"| node_pdf_extract
node_resume_service -->|"loads candidate"| node_candidate_repo
node_resume_service -->|"extracts resume text"| node_pdf_extract
node_resume_service -->|"parses resume fields"| node_resume_parse
node_resume_service -->|"stores resume"| node_resume_repo
node_match_service -->|"loads candidate"| node_candidate_repo
node_match_service -->|"loads job"| node_job_repo
node_match_service -->|"loads latest resume"| node_resume_repo
node_match_service -->|"sends resume and JD"| node_llm_service
node_llm_service -->|"requests evaluation"| node_gemini
node_gemini -->|"returns evaluation"| node_llm_service
node_llm_service -->|"parses response"| node_llm_result
node_match_service -->|"stores / queries matches"| node_match_repo
node_candidate_repo -->|"persists entities"| node_mysql
node_job_repo -->|"persists entities"| node_mysql
node_resume_repo -->|"persists entities"| node_mysql
node_match_repo -->|"persists entities"| node_mysql
node_candidate_repo -->|"maps candidate"| node_entities
node_job_repo -->|"maps job"| node_entities
node_resume_repo -->|"maps resume"| node_entities
node_match_repo -->|"maps match result"| node_entities

click node_candidate_api "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/CandidateController.java"
click node_job_api "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/JobController.java"
click node_resume_api "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/ResumeController.java"
click node_match_api "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/MatchResultController.java"
click node_api_dtos "https://github.com/farooqpersonal12/resume-screener/tree/main/src/main/java/com/resumescreener/resume_screener/DTOs"
click node_candidate_service "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/CandidateService.java"
click node_job_service "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/JobService.java"
click node_resume_service "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/ResumeService.java"
click node_match_service "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/MatchResultService.java"
click node_pdf_extract "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/PdfExtractionService.java"
click node_resume_parse "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/ResumeParsingService.java"
click node_llm_service "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/LLMMatchingService.java"
click node_llm_result "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/DTOs/LLMMatchResponseDTO.java"
click node_candidate_repo "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/CandidateRepository.java"
click node_job_repo "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/JobRepository.java"
click node_resume_repo "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/ResumeRepository.java"
click node_match_repo "https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/MatchResultRepository.java"
click node_entities "https://github.com/farooqpersonal12/resume-screener/tree/main/src/main/java/com/resumescreener/resume_screener/entity"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_candidate_api,node_job_api,node_resume_api,node_match_api,node_api_dtos,node_recruiter toneBlue
class node_candidate_service,node_job_service,node_resume_service,node_match_service,node_pdf_extract,node_resume_parse,node_llm_service,node_llm_result toneAmber
class node_candidate_repo,node_job_repo,node_resume_repo,node_match_repo,node_entities toneMint
class node_mysql,node_gemini toneRose
```

## Components

### REST API

- [Candidate API](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/CandidateController.java): `src/main/java/com/resumescreener/resume_screener/Controller/CandidateController.java`
- [Job API](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/JobController.java): `src/main/java/com/resumescreener/resume_screener/Controller/JobController.java`
- [Resume API](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/ResumeController.java): `src/main/java/com/resumescreener/resume_screener/Controller/ResumeController.java`
- [Match API](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/Controller/MatchResultController.java): `src/main/java/com/resumescreener/resume_screener/Controller/MatchResultController.java`
- [Request / Response DTOs](https://github.com/farooqpersonal12/resume-screener/tree/main/src/main/java/com/resumescreener/resume_screener/DTOs): `src/main/java/com/resumescreener/resume_screener/DTOs`

### Screening Workflows

- [Candidate Management](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/CandidateService.java): `src/main/java/com/resumescreener/resume_screener/service/CandidateService.java`
- [Job Management](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/JobService.java): `src/main/java/com/resumescreener/resume_screener/service/JobService.java`
- [Resume Management](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/ResumeService.java): `src/main/java/com/resumescreener/resume_screener/service/ResumeService.java`
- [Matching / Shortlisting](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/MatchResultService.java): `src/main/java/com/resumescreener/resume_screener/service/MatchResultService.java`
- [PDF Text Extraction](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/PdfExtractionService.java): `src/main/java/com/resumescreener/resume_screener/service/PdfExtractionService.java`
- [Resume Field Parsing](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/ResumeParsingService.java): `src/main/java/com/resumescreener/resume_screener/service/ResumeParsingService.java`
- [LLM Matching Client](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/service/LLMMatchingService.java): `src/main/java/com/resumescreener/resume_screener/service/LLMMatchingService.java`
- [LLM Match Result DTO](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/DTOs/LLMMatchResponseDTO.java): `src/main/java/com/resumescreener/resume_screener/DTOs/LLMMatchResponseDTO.java`

### Persistence

- [Candidate Repository](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/CandidateRepository.java): `src/main/java/com/resumescreener/resume_screener/repository/CandidateRepository.java`
- [Job Repository](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/JobRepository.java): `src/main/java/com/resumescreener/resume_screener/repository/JobRepository.java`
- [Resume Repository](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/ResumeRepository.java): `src/main/java/com/resumescreener/resume_screener/repository/ResumeRepository.java`
- [Match Repository](https://github.com/farooqpersonal12/resume-screener/blob/main/src/main/java/com/resumescreener/resume_screener/repository/MatchResultRepository.java): `src/main/java/com/resumescreener/resume_screener/repository/MatchResultRepository.java`
- [Persistent Entities](https://github.com/farooqpersonal12/resume-screener/tree/main/src/main/java/com/resumescreener/resume_screener/entity): `src/main/java/com/resumescreener/resume_screener/entity`

### External Integration

- **MySQL Database**
- **Gemini API**

### Other components

- **Recruiter / Client**

## Connections

- Recruiter / Client → Candidate API: manages candidates
- Recruiter / Client → Job API: manages jobs
- Recruiter / Client → Resume API: uploads resumes
- Recruiter / Client → Match API: requests screening
- Candidate API → Candidate Management: dispatches
- Job API → Job Management: dispatches
- Resume API → Resume Management: dispatches
- Match API → Matching / Shortlisting: dispatches
- Candidate API → Request / Response DTOs: uses
- Job API → Request / Response DTOs: uses
- Resume API → Request / Response DTOs: uses
- Match API → Request / Response DTOs: uses
- Candidate Management → Candidate Repository: reads / writes
- Job Management → Job Repository: reads / writes
- Job Management → PDF Text Extraction: extracts JD text
- Resume Management → Candidate Repository: loads candidate
- Resume Management → PDF Text Extraction: extracts resume text
- Resume Management → Resume Field Parsing: parses resume fields
- Resume Management → Resume Repository: stores resume
- Matching / Shortlisting → Candidate Repository: loads candidate
- Matching / Shortlisting → Job Repository: loads job
- Matching / Shortlisting → Resume Repository: loads latest resume
- Matching / Shortlisting → LLM Matching Client: sends resume and JD
- LLM Matching Client → Gemini API: requests evaluation
- Gemini API → LLM Matching Client: returns evaluation
- LLM Matching Client → LLM Match Result DTO: parses response
- Matching / Shortlisting → Match Repository: stores / queries matches
- Candidate Repository → MySQL Database: persists entities
- Job Repository → MySQL Database: persists entities
- Resume Repository → MySQL Database: persists entities
- Match Repository → MySQL Database: persists entities
- Candidate Repository → Persistent Entities: maps candidate
- Job Repository → Persistent Entities: maps job
- Resume Repository → Persistent Entities: maps resume
- Match Repository → Persistent Entities: maps match result
