# aisha-jawed/ai-reviewer architecture

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

- Interactive diagram: https://gitdiagram.com/aisha-jawed/ai-reviewer
- Repository: https://github.com/aisha-jawed/ai-reviewer

## Overview

InterviewAI turns a candidate’s resume or self-description and a target job description into a personalized preparation report, then lets them revisit reports or export a tailored resume PDF. The graph follows the documented frontend-to-API workflow and sampled controller/service calls. Report history, authentication, and PDF export are included; frontend page wiring and some backend configuration details are represented only where the tree or README supports them.

Main entry points: [`Backend/src/controllers/interview.controller.js`](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/controllers/interview.controller.js) (Report handlers), [`Frontend/src/app.routes.jsx`](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/app.routes.jsx) (Page routing), [`Backend/src/routes/interview.routes.js`](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/routes/interview.routes.js) (Interview routes), [`Backend/src/services/ai.service.js`](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/services/ai.service.js) (Report and resume generation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web client"]
  node_app["Application shell<br/>[App.jsx]"]
  node_router["Page routing<br/>[app.routes.jsx]"]
  node_authui["Login and register"]
  node_authstate["Auth state<br/>[useAuth.js]"]
  node_interviewui["Prep dashboard<br/>[Home.jsx]"]
  node_reportui["Report view<br/>[Interview.jsx]"]
  node_interviewstate["Interview state<br/>[useInterview.js]"]
  node_authclient["Auth API<br/>[auth.api.js]"]
  node_interviewclient["Interview API<br/>[interview.api.js]"]
  node_http["HTTP client<br/>[apiClient.js]"]
end

subgraph group_api["Backend API"]
  node_server["Express app<br/>[app.js]"]
  node_authroutes["Auth routes<br/>[auth.routes.js]"]
  node_interviewroutes["Interview routes"]
  node_authcontroller["Auth handlers<br/>[auth.controller.js]"]
  node_interviewcontroller["Report handlers"]
  node_authmiddleware["JWT authorization<br/>[auth.middleware.js]"]
  node_upload["Resume upload<br/>[file.middleware.js]"]
  node_pdfparse["PDF text extraction"]
end

subgraph group_data["Persistence"]
  node_users[("User records<br/>[user.model.js]")]
  node_blacklist[("Token blacklist<br/>[blacklist.model.js]")]
  node_reports[("Interview reports")]
end

subgraph group_generation["AI generation"]
  node_aiservice["Report and resume generation<br/>[ai.service.js]"]
end

node_candidate(("Candidate"))
node_mongodb[("MongoDB")]
node_gemini["Google Gemini"]
node_puppeteer["PDF rendering"]

node_candidate -->|"uses"| node_app
node_app -->|"renders"| node_router
node_router -->|"routes"| node_authui
node_router -->|"routes"| node_interviewui
node_router -->|"routes"| node_reportui
node_authui -->|"uses"| node_authstate
node_interviewui -->|"uses"| node_interviewstate
node_reportui -->|"uses"| node_interviewstate
node_authstate -->|"requests"| node_authclient
node_interviewstate -->|"requests"| node_interviewclient
node_authclient -->|"sends"| node_http
node_interviewclient -->|"sends"| node_http
node_http -->|"calls API"| node_server
node_server -->|"mounts"| node_authroutes
node_server -->|"mounts"| node_interviewroutes
node_authroutes -->|"dispatches"| node_authcontroller
node_authroutes -->|"authorizes"| node_authmiddleware
node_interviewroutes -->|"authorizes"| node_authmiddleware
node_interviewroutes -->|"accepts file"| node_upload
node_interviewroutes -->|"dispatches"| node_interviewcontroller
node_authcontroller -->|"reads/writes"| node_users
node_authcontroller -->|"blacklists token"| node_blacklist
node_authmiddleware -->|"checks token"| node_blacklist
node_interviewcontroller -->|"extracts text"| node_pdfparse
node_interviewcontroller -->|"generates report"| node_aiservice
node_interviewcontroller -->|"reads/writes"| node_reports
node_interviewcontroller -->|"requests resume PDF"| node_aiservice
node_aiservice -.->|"generates content"| node_gemini
node_aiservice -.->|"renders PDF"| node_puppeteer
node_users -->|"persists"| node_mongodb
node_blacklist -->|"persists"| node_mongodb
node_reports -->|"persists"| node_mongodb

click node_app "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/App.jsx"
click node_router "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/app.routes.jsx"
click node_authui "https://github.com/aisha-jawed/ai-reviewer/tree/main/Frontend/src/features/auth/pages"
click node_authstate "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/auth/hooks/useAuth.js"
click node_interviewui "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/pages/Home.jsx"
click node_reportui "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/pages/Interview.jsx"
click node_interviewstate "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/hooks/useInterview.js"
click node_authclient "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/auth/services/auth.api.js"
click node_interviewclient "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/services/interview.api.js"
click node_http "https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/lib/apiClient.js"
click node_server "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/app.js"
click node_authroutes "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/routes/auth.routes.js"
click node_interviewroutes "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/routes/interview.routes.js"
click node_authcontroller "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/controllers/auth.controller.js"
click node_interviewcontroller "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/controllers/interview.controller.js"
click node_authmiddleware "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/middlewares/auth.middleware.js"
click node_upload "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/middlewares/file.middleware.js"
click node_users "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/user.model.js"
click node_blacklist "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/blacklist.model.js"
click node_reports "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/interviewReport.model.js"
click node_aiservice "https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/services/ai.service.js"

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_app,node_router,node_authui,node_authstate,node_interviewui,node_reportui,node_interviewstate,node_authclient,node_interviewclient,node_http toneBlue
class node_server,node_authroutes,node_interviewroutes,node_authcontroller,node_interviewcontroller,node_authmiddleware,node_upload,node_pdfparse,node_mongodb toneAmber
class node_users,node_blacklist,node_reports toneMint
class node_aiservice toneRose
class node_candidate,node_gemini,node_puppeteer toneIndigo
```

## Components

### Web client

- [Application shell](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/App.jsx): `Frontend/src/App.jsx`
- [Page routing](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/app.routes.jsx): `Frontend/src/app.routes.jsx`
- [Login and register](https://github.com/aisha-jawed/ai-reviewer/tree/main/Frontend/src/features/auth/pages): `Frontend/src/features/auth/pages`
- [Auth state](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/auth/hooks/useAuth.js): `Frontend/src/features/auth/hooks/useAuth.js`
- [Prep dashboard](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/pages/Home.jsx): `Frontend/src/features/interview/pages/Home.jsx`
- [Report view](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/pages/Interview.jsx): `Frontend/src/features/interview/pages/Interview.jsx`
- [Interview state](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/hooks/useInterview.js): `Frontend/src/features/interview/hooks/useInterview.js`
- [Auth API](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/auth/services/auth.api.js): `Frontend/src/features/auth/services/auth.api.js`
- [Interview API](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/features/interview/services/interview.api.js): `Frontend/src/features/interview/services/interview.api.js`
- [HTTP client](https://github.com/aisha-jawed/ai-reviewer/blob/main/Frontend/src/lib/apiClient.js): `Frontend/src/lib/apiClient.js`

### Backend API

- [Express app](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/app.js): `Backend/src/app.js`
- [Auth routes](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/routes/auth.routes.js): `Backend/src/routes/auth.routes.js`
- [Interview routes](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/routes/interview.routes.js): `Backend/src/routes/interview.routes.js`
- [Auth handlers](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/controllers/auth.controller.js): `Backend/src/controllers/auth.controller.js`
- [Report handlers](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/controllers/interview.controller.js): `Backend/src/controllers/interview.controller.js`
- [JWT authorization](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/middlewares/auth.middleware.js): `Backend/src/middlewares/auth.middleware.js`
- [Resume upload](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/middlewares/file.middleware.js): `Backend/src/middlewares/file.middleware.js`
- **PDF text extraction**

### Persistence

- [User records](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/user.model.js): `Backend/src/models/user.model.js`
- [Token blacklist](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/blacklist.model.js): `Backend/src/models/blacklist.model.js`
- [Interview reports](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/models/interviewReport.model.js): `Backend/src/models/interviewReport.model.js`

### AI generation

- [Report and resume generation](https://github.com/aisha-jawed/ai-reviewer/blob/main/Backend/src/services/ai.service.js): `Backend/src/services/ai.service.js`

### Other components

- **Candidate**
- **MongoDB**
- **Google Gemini**
- **PDF rendering**

## Connections

- Candidate → Application shell: uses
- Application shell → Page routing: renders
- Page routing → Login and register: routes
- Page routing → Prep dashboard: routes
- Page routing → Report view: routes
- Login and register → Auth state: uses
- Prep dashboard → Interview state: uses
- Report view → Interview state: uses
- Auth state → Auth API: requests
- Interview state → Interview API: requests
- Auth API → HTTP client: sends
- Interview API → HTTP client: sends
- HTTP client → Express app: calls API
- Express app → Auth routes: mounts
- Express app → Interview routes: mounts
- Auth routes → Auth handlers: dispatches
- Auth routes → JWT authorization: authorizes
- Interview routes → JWT authorization: authorizes
- Interview routes → Resume upload: accepts file
- Interview routes → Report handlers: dispatches
- Auth handlers → User records: reads/writes
- Auth handlers → Token blacklist: blacklists token
- JWT authorization → Token blacklist: checks token
- Report handlers → PDF text extraction: extracts text
- Report handlers → Report and resume generation: generates report
- Report handlers → Interview reports: reads/writes
- Report handlers → Report and resume generation: requests resume PDF
- Report and resume generation → Google Gemini: generates content
- Report and resume generation → PDF rendering: renders PDF
- User records → MongoDB: persists
- Token blacklist → MongoDB: persists
- Interview reports → MongoDB: persists
