# bobaurmom/hr-helper architecture

> Architecture diagram of the GitHub repository bobaurmom/hr-helper, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/bobaurmom/hr-helper
- Repository: https://github.com/bobaurmom/hr-helper

## Overview

This repository implements a recruiting platform: HR users create and manage application forms, review submissions and CV evaluations, and schedule interviews; candidates apply and book interview slots. The React app routes these workflows to a NestJS API, with a separate Python service for CV scoring. The graph preserves the major form, submission, file, authentication, email, interview, and scoring capabilities. Some frontend-to-API wiring and unsampled feature details are not shown, so those relationships are omitted or marked unverified.

Main entry points: [`frontend/src/services/api.js`](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/services/api.js) (API client), [`backend/src/prisma/prisma.service.ts`](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/prisma/prisma.service.ts) (Application database), [`frontend/src/App.jsx`](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/App.jsx) (Routes and workspace), [`backend/src/modules/form-submissions/form-submissions.service.ts`](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/form-submissions/form-submissions.service.ts) (Form submissions)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Web application"]
  node_app["Routes and workspace<br/>[App.jsx]"]
  node_formui["Form builder and manager<br/>[FormBuilder.jsx]"]
  node_applyui["Candidate application<br/>[ApplyForm.jsx]"]
  node_submissionsui["Submission review"]
  node_slotsui["Interview scheduling"]
  node_api["API client<br/>[api.js]"]
end

subgraph group_recruit["Recruiting workflows"]
  node_forms["Application forms<br/>[forms.service.ts]"]
  node_submissions["Form submissions"]
  node_slots["Interview slots"]
  node_email["Email sequences<br/>[email.service.ts]"]
end

subgraph group_platform["Platform services"]
  node_auth["Authentication<br/>[auth.service.ts]"]
  node_files["File records and uploads<br/>[files.service.ts]"]
  node_s3["Object storage<br/>[s3.service.ts]"]
  node_db[("Application database<br/>[prisma.service.ts]")]
end

subgraph group_scoring["CV scoring"]
  node_aiapi["Scoring API<br/>[ai.service.ts]"]
  node_aisvc["CV analysis<br/>[model_service.py]"]
  node_pythonrouter["Scoring routes<br/>[router.py]"]
  node_aiserver["AI service app<br/>[main.py]"]
end

node_hr(("HR user"))
node_candidate(("Candidate"))

node_hr -->|"uses"| node_app
node_candidate -->|"uses"| node_app
node_app -->|"routes to"| node_formui
node_app -->|"routes to"| node_applyui
node_app -->|"routes to"| node_submissionsui
node_app -->|"routes to"| node_slotsui
node_formui -->|"uses"| node_api
node_submissionsui -.->|"calls"| node_api
node_applyui -.->|"calls"| node_api
node_slotsui -.->|"calls"| node_api
node_api -.->|"requests"| node_forms
node_api -.->|"requests"| node_submissions
node_api -.->|"requests"| node_slots
node_forms -->|"reads and writes"| node_db
node_submissions -->|"reads and writes"| node_db
node_submissions -->|"reads"| node_forms
node_submissions -->|"requests scoring"| node_aiapi
node_aiapi -->|"gets file URL"| node_s3
node_aiapi -->|"updates evaluation"| node_db
node_aiapi -->|"calls HTTP API"| node_aiserver
node_aiserver -->|"routes requests"| node_pythonrouter
node_pythonrouter -->|"calls scoring"| node_aisvc
node_aisvc -.->|"downloads CV PDF"| node_candidate
node_slots -->|"reads and writes"| node_db
node_files -->|"uses storage"| node_s3
node_files -->|"reads and writes"| node_db
node_email -->|"reads"| node_db
node_auth -->|"reads and writes"| node_db

click node_app "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/App.jsx"
click node_formui "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/components/form-builder/FormBuilder.jsx"
click node_applyui "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/ApplyForm.jsx"
click node_submissionsui "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/SubmissionsView.jsx"
click node_slotsui "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/InterviewScheduling.jsx"
click node_api "https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/services/api.js"
click node_auth "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/auth/auth.service.ts"
click node_forms "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/forms/forms.service.ts"
click node_submissions "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/form-submissions/form-submissions.service.ts"
click node_files "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/files/files.service.ts"
click node_s3 "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/s3/s3.service.ts"
click node_slots "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/interview-slots/interview-slots.service.ts"
click node_email "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/email/email.service.ts"
click node_aiapi "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/ai/ai.service.ts"
click node_aisvc "https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/services/model_service.py"
click node_db "https://github.com/bobaurmom/hr-helper/blob/main/backend/src/prisma/prisma.service.ts"
click node_pythonrouter "https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/api/router.py"
click node_aiserver "https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/main.py"

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_formui,node_applyui,node_submissionsui,node_slotsui,node_api,node_hr toneBlue
class node_forms,node_submissions,node_slots,node_email toneAmber
class node_auth,node_files,node_s3,node_db toneMint
class node_aiapi,node_aisvc,node_pythonrouter,node_aiserver toneRose
class node_candidate toneIndigo
```

## Components

### Web application

- [Routes and workspace](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Form builder and manager](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/components/form-builder/FormBuilder.jsx): `frontend/src/components/form-builder/FormBuilder.jsx`
- [Candidate application](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/ApplyForm.jsx): `frontend/src/pages/ApplyForm.jsx`
- [Submission review](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/SubmissionsView.jsx): `frontend/src/pages/SubmissionsView.jsx`
- [Interview scheduling](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/pages/InterviewScheduling.jsx): `frontend/src/pages/InterviewScheduling.jsx`
- [API client](https://github.com/bobaurmom/hr-helper/blob/main/frontend/src/services/api.js): `frontend/src/services/api.js`

### Recruiting workflows

- [Application forms](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/forms/forms.service.ts): `backend/src/modules/forms/forms.service.ts`
- [Form submissions](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/form-submissions/form-submissions.service.ts): `backend/src/modules/form-submissions/form-submissions.service.ts`
- [Interview slots](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/interview-slots/interview-slots.service.ts): `backend/src/modules/interview-slots/interview-slots.service.ts`
- [Email sequences](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/email/email.service.ts): `backend/src/modules/email/email.service.ts`

### Platform services

- [Authentication](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/auth/auth.service.ts): `backend/src/modules/auth/auth.service.ts`
- [File records and uploads](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/files/files.service.ts): `backend/src/modules/files/files.service.ts`
- [Object storage](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/s3/s3.service.ts): `backend/src/modules/s3/s3.service.ts`
- [Application database](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/prisma/prisma.service.ts): `backend/src/prisma/prisma.service.ts`

### CV scoring

- [Scoring API](https://github.com/bobaurmom/hr-helper/blob/main/backend/src/modules/ai/ai.service.ts): `backend/src/modules/ai/ai.service.ts`
- [CV analysis](https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/services/model_service.py): `ai-service/app/services/model_service.py`
- [Scoring routes](https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/api/router.py): `ai-service/app/api/router.py`
- [AI service app](https://github.com/bobaurmom/hr-helper/blob/main/ai-service/app/main.py): `ai-service/app/main.py`

### Other components

- **HR user**
- **Candidate**

## Connections

- HR user → Routes and workspace: uses
- Candidate → Routes and workspace: uses
- Routes and workspace → Form builder and manager: routes to (evidence: `frontend/src/App.jsx`)
- Routes and workspace → Candidate application: routes to (evidence: `frontend/src/App.jsx`)
- Routes and workspace → Submission review: routes to (evidence: `frontend/src/App.jsx`)
- Routes and workspace → Interview scheduling: routes to (evidence: `frontend/src/App.jsx`)
- Form builder and manager → API client: uses
- Submission review → API client: calls
- Candidate application → API client: calls
- Interview scheduling → API client: calls
- API client → Application forms: requests
- API client → Form submissions: requests
- API client → Interview slots: requests
- Application forms → Application database: reads and writes (evidence: `backend/src/modules/forms/forms.service.ts`)
- Form submissions → Application database: reads and writes (evidence: `backend/src/modules/form-submissions/form-submissions.service.ts`)
- Form submissions → Application forms: reads (evidence: `backend/src/modules/form-submissions/form-submissions.service.ts`)
- Form submissions → Scoring API: requests scoring (evidence: `backend/src/modules/form-submissions/form-submissions.service.ts`)
- Scoring API → Object storage: gets file URL (evidence: `backend/src/modules/ai/ai.service.ts`)
- Scoring API → Application database: updates evaluation (evidence: `backend/src/modules/ai/ai.service.ts`)
- Scoring API → AI service app: calls HTTP API (evidence: `backend/src/modules/ai/ai.service.ts`)
- AI service app → Scoring routes: routes requests (evidence: `ai-service/app/main.py`)
- Scoring routes → CV analysis: calls scoring (evidence: `ai-service/app/api/router.py`)
- CV analysis → Candidate: downloads CV PDF
- Interview slots → Application database: reads and writes (evidence: `backend/src/modules/interview-slots/interview-slots.service.ts`)
- File records and uploads → Object storage: uses storage (evidence: `backend/src/modules/files/files.service.ts`)
- File records and uploads → Application database: reads and writes (evidence: `backend/src/modules/files/files.service.ts`)
- Email sequences → Application database: reads (evidence: `backend/src/modules/email/email.service.ts`)
- Authentication → Application database: reads and writes (evidence: `backend/src/modules/auth/auth.service.ts`)
