# ddpl-work/maven-qr architecture

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

- Interactive diagram: https://gitdiagram.com/ddpl-work/maven-qr
- Repository: https://github.com/ddpl-work/maven-qr

## Overview

This repository provides a company/job recruiting and QR promotion product: CRM staff create a company profile and openings, generate a QR redirect and downloadable PDF, while public visitors use a separate landing-page app. The server also exposes authentication, company, job, and CRM APIs. The main creation flow is evidenced directly in the QR controller; the tree supports the other subsystems, but their specific wiring and visitor/application behavior were not sampled, so those links are intentionally limited.

Main entry points: [`server/src/app.js`](https://github.com/ddpl-work/maven-qr/blob/main/server/src/app.js) (HTTP application), [`server/src/controllers/qr.controller.js`](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/qr.controller.js) (QR generation), [`server/src/routes/company.routes.js`](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/company.routes.js) (Company routes), [`server/src/routes/job.routes.js`](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/job.routes.js) (Job routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["CRM console"]
  node_crmapp["CRM app<br/>[App.jsx]"]
  node_crmrouter["CRM routes<br/>[routes.jsx]"]
  node_qrform["Company QR form"]
  node_cristate["CRM state<br/>[qrSlice.js]"]
  node_crithunks["QR requests<br/>[qrThunks.js]"]
  node_crmapi["CRM API client<br/>[api.js]"]
end

subgraph group_landing["Public landing"]
  node_landingapp["Landing app<br/>[App.jsx]"]
  node_landinghome["Company landing<br/>[Home.jsx]"]
  node_landingstate["Landing state<br/>[landingSlice.js]"]
  node_landingthunks["Landing requests<br/>[landingThunks.js]"]
  node_landingapi["Landing API client<br/>[api.js]"]
end

subgraph group_server["Recruiting API"]
  node_apiapp["HTTP application<br/>[app.js]"]
  node_authroutes["Authentication routes<br/>[auth.routes.js]"]
  node_authcontroller["Authentication<br/>[auth.controller.js]"]
  node_companyroutes["Company routes<br/>[company.routes.js]"]
  node_jobroutes["Job routes<br/>[job.routes.js]"]
  node_qrroutes["QR routes<br/>[qr.routes.js]"]
  node_crmroute["CRM routes<br/>[crm.routes.js]"]
  node_landingroute["Landing routes<br/>[landing.routes.js]"]
  node_qrcontroller["QR generation<br/>[qr.controller.js]"]
  node_pdfservice["PDF generation<br/>[pdf.service.js]"]
  node_qrservice["QR service<br/>[qr.service.js]"]
  node_companycontroller["Company management"]
  node_jobcontroller["Job management<br/>[job.controller.js]"]
  node_landingcontroller["Landing data"]
  node_crmcontroller["CRM operations<br/>[crm.controller.js]"]
  node_authmiddleware["Access control<br/>[auth.middleware.js]"]
end

subgraph group_data["Product records"]
  node_companies[("Companies<br/>[Company.js]")]
  node_jobs[("Job openings<br/>[Job.js]")]
  node_qrcodes[("QR records<br/>[QRCode.js]")]
  node_users[("Accounts<br/>[User.js]")]
end

node_crmuser(("CRM staff"))
node_visitor(("QR visitor"))
node_cloudinary["PDF hosting<br/>[cloudinary.js]"]

node_crmuser -->|"uses"| node_crmapp
node_crmapp -->|"renders"| node_crmrouter
node_crmrouter -->|"routes"| node_qrform
node_qrform -->|"dispatches"| node_crithunks
node_crithunks -->|"requests"| node_crmapi
node_crmapi -->|"calls API"| node_apiapp
node_apiapp -->|"mounts"| node_qrroutes
node_qrroutes -->|"protects"| node_authmiddleware
node_qrroutes -->|"dispatches"| node_qrcontroller
node_qrcontroller -->|"creates"| node_companies
node_qrcontroller -->|"creates and reads"| node_jobs
node_qrcontroller -->|"generates PDF"| node_pdfservice
node_pdfservice -.->|"fetches images"| node_cloudinary
node_qrcontroller -->|"uploads PDF"| node_cloudinary
node_qrcontroller -->|"creates and reads"| node_qrcodes
node_visitor -->|"opens"| node_landingapp
node_landingapp -->|"routes"| node_landinghome
node_landinghome -->|"dispatches"| node_landingthunks
node_landingthunks -->|"requests"| node_landingapi
node_landingapi -->|"calls API"| node_apiapp
node_apiapp -->|"mounts"| node_landingroute
node_landingroute -->|"dispatches"| node_landingcontroller
node_landingcontroller -->|"reads"| node_companies
node_landingcontroller -->|"reads"| node_jobs
node_apiapp -->|"mounts"| node_authroutes
node_authroutes -->|"dispatches"| node_authcontroller
node_authcontroller -->|"reads and creates"| node_users
node_apiapp -->|"mounts"| node_companyroutes
node_companyroutes -->|"dispatches"| node_companycontroller
node_companyroutes -->|"protects"| node_authmiddleware
node_apiapp -->|"mounts"| node_jobroutes
node_jobroutes -->|"dispatches"| node_jobcontroller
node_jobroutes -->|"protects"| node_authmiddleware
node_apiapp -->|"mounts"| node_crmroute
node_crmroute -->|"dispatches"| node_crmcontroller

click node_crmapp "https://github.com/ddpl-work/maven-qr/blob/main/client/src/App.jsx"
click node_crmrouter "https://github.com/ddpl-work/maven-qr/blob/main/client/src/routes/routes.jsx"
click node_qrform "https://github.com/ddpl-work/maven-qr/blob/main/client/src/pages/CRMPanel/CreateCompanyQR.jsx"
click node_cristate "https://github.com/ddpl-work/maven-qr/blob/main/client/src/Redux/slices/qrSlice.js"
click node_crithunks "https://github.com/ddpl-work/maven-qr/blob/main/client/src/Redux/thunks/qrThunks.js"
click node_crmapi "https://github.com/ddpl-work/maven-qr/blob/main/client/src/services/api.js"
click node_landingapp "https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/App.jsx"
click node_landinghome "https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/pages/Home.jsx"
click node_landingstate "https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/Redux/slices/landingSlice.js"
click node_landingthunks "https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/Redux/thunks/landingThunks.js"
click node_landingapi "https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/services/api.js"
click node_apiapp "https://github.com/ddpl-work/maven-qr/blob/main/server/src/app.js"
click node_authroutes "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/auth.routes.js"
click node_authcontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/auth.controller.js"
click node_companyroutes "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/company.routes.js"
click node_jobroutes "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/job.routes.js"
click node_qrroutes "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/qr.routes.js"
click node_crmroute "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/crm.routes.js"
click node_landingroute "https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/landing.routes.js"
click node_qrcontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/qr.controller.js"
click node_pdfservice "https://github.com/ddpl-work/maven-qr/blob/main/server/src/services/pdf.service.js"
click node_qrservice "https://github.com/ddpl-work/maven-qr/blob/main/server/src/services/qr.service.js"
click node_companycontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/company.controller.js"
click node_jobcontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/job.controller.js"
click node_landingcontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/landing.controller.js"
click node_crmcontroller "https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/crm.controller.js"
click node_authmiddleware "https://github.com/ddpl-work/maven-qr/blob/main/server/src/middleware/auth.middleware.js"
click node_cloudinary "https://github.com/ddpl-work/maven-qr/blob/main/server/src/config/cloudinary.js"
click node_companies "https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/Company.js"
click node_jobs "https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/Job.js"
click node_qrcodes "https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/QRCode.js"
click node_users "https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/User.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_crmapp,node_crmrouter,node_qrform,node_cristate,node_crithunks,node_crmapi toneBlue
class node_landingapp,node_landinghome,node_landingstate,node_landingthunks,node_landingapi toneAmber
class node_apiapp,node_authroutes,node_authcontroller,node_companyroutes,node_jobroutes,node_qrroutes,node_crmroute,node_landingroute,node_qrcontroller,node_pdfservice,node_qrservice,node_companycontroller,node_jobcontroller,node_landingcontroller,node_crmcontroller,node_authmiddleware toneMint
class node_companies,node_jobs,node_qrcodes,node_users toneRose
class node_crmuser,node_visitor toneIndigo
class node_cloudinary toneTeal
```

## Components

### CRM console

- [CRM app](https://github.com/ddpl-work/maven-qr/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [CRM routes](https://github.com/ddpl-work/maven-qr/blob/main/client/src/routes/routes.jsx): `client/src/routes/routes.jsx`
- [Company QR form](https://github.com/ddpl-work/maven-qr/blob/main/client/src/pages/CRMPanel/CreateCompanyQR.jsx): `client/src/pages/CRMPanel/CreateCompanyQR.jsx`
- [CRM state](https://github.com/ddpl-work/maven-qr/blob/main/client/src/Redux/slices/qrSlice.js): `client/src/Redux/slices/qrSlice.js`
- [QR requests](https://github.com/ddpl-work/maven-qr/blob/main/client/src/Redux/thunks/qrThunks.js): `client/src/Redux/thunks/qrThunks.js`
- [CRM API client](https://github.com/ddpl-work/maven-qr/blob/main/client/src/services/api.js): `client/src/services/api.js`

### Public landing

- [Landing app](https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/App.jsx): `qr-landing-page/src/App.jsx`
- [Company landing](https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/pages/Home.jsx): `qr-landing-page/src/pages/Home.jsx`
- [Landing state](https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/Redux/slices/landingSlice.js): `qr-landing-page/src/Redux/slices/landingSlice.js`
- [Landing requests](https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/Redux/thunks/landingThunks.js): `qr-landing-page/src/Redux/thunks/landingThunks.js`
- [Landing API client](https://github.com/ddpl-work/maven-qr/blob/main/qr-landing-page/src/services/api.js): `qr-landing-page/src/services/api.js`

### Recruiting API

- [HTTP application](https://github.com/ddpl-work/maven-qr/blob/main/server/src/app.js): `server/src/app.js`
- [Authentication routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/auth.routes.js): `server/src/routes/auth.routes.js`
- [Authentication](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/auth.controller.js): `server/src/controllers/auth.controller.js`
- [Company routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/company.routes.js): `server/src/routes/company.routes.js`
- [Job routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/job.routes.js): `server/src/routes/job.routes.js`
- [QR routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/qr.routes.js): `server/src/routes/qr.routes.js`
- [CRM routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/crm.routes.js): `server/src/routes/crm.routes.js`
- [Landing routes](https://github.com/ddpl-work/maven-qr/blob/main/server/src/routes/landing.routes.js): `server/src/routes/landing.routes.js`
- [QR generation](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/qr.controller.js): `server/src/controllers/qr.controller.js`
- [PDF generation](https://github.com/ddpl-work/maven-qr/blob/main/server/src/services/pdf.service.js): `server/src/services/pdf.service.js`
- [QR service](https://github.com/ddpl-work/maven-qr/blob/main/server/src/services/qr.service.js): `server/src/services/qr.service.js`
- [Company management](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/company.controller.js): `server/src/controllers/company.controller.js`
- [Job management](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/job.controller.js): `server/src/controllers/job.controller.js`
- [Landing data](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/landing.controller.js): `server/src/controllers/landing.controller.js`
- [CRM operations](https://github.com/ddpl-work/maven-qr/blob/main/server/src/controllers/crm.controller.js): `server/src/controllers/crm.controller.js`
- [Access control](https://github.com/ddpl-work/maven-qr/blob/main/server/src/middleware/auth.middleware.js): `server/src/middleware/auth.middleware.js`

### Product records

- [Companies](https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/Company.js): `server/src/models/Company.js`
- [Job openings](https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/Job.js): `server/src/models/Job.js`
- [QR records](https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/QRCode.js): `server/src/models/QRCode.js`
- [Accounts](https://github.com/ddpl-work/maven-qr/blob/main/server/src/models/User.js): `server/src/models/User.js`

### Other components

- **CRM staff**
- **QR visitor**
- [PDF hosting](https://github.com/ddpl-work/maven-qr/blob/main/server/src/config/cloudinary.js): `server/src/config/cloudinary.js`

## Connections

- CRM staff → CRM app: uses
- CRM app → CRM routes: renders
- CRM routes → Company QR form: routes
- Company QR form → QR requests: dispatches
- QR requests → CRM API client: requests
- CRM API client → HTTP application: calls API
- HTTP application → QR routes: mounts
- QR routes → Access control: protects
- QR routes → QR generation: dispatches
- QR generation → Companies: creates
- QR generation → Job openings: creates and reads
- QR generation → PDF generation: generates PDF
- PDF generation → PDF hosting: fetches images
- QR generation → PDF hosting: uploads PDF
- QR generation → QR records: creates and reads
- QR visitor → Landing app: opens
- Landing app → Company landing: routes
- Company landing → Landing requests: dispatches
- Landing requests → Landing API client: requests
- Landing API client → HTTP application: calls API
- HTTP application → Landing routes: mounts
- Landing routes → Landing data: dispatches
- Landing data → Companies: reads
- Landing data → Job openings: reads
- HTTP application → Authentication routes: mounts
- Authentication routes → Authentication: dispatches
- Authentication → Accounts: reads and creates
- HTTP application → Company routes: mounts
- Company routes → Company management: dispatches
- Company routes → Access control: protects
- HTTP application → Job routes: mounts
- Job routes → Job management: dispatches
- Job routes → Access control: protects
- HTTP application → CRM routes: mounts
- CRM routes → CRM operations: dispatches
