# subhamsahu-25/course-companion architecture

> Architecture diagram of the GitHub repository subhamsahu-25/course-companion, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-10-30). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/subhamsahu-25/course-companion
- Repository: https://github.com/subhamsahu-25/course-companion

## Overview

Course Companion supports role-based course administration and a student Q&A workflow: course material is uploaded and ingested, questions are checked against course-scoped and TA-verified knowledge, new drafts enter TA review, and approved answers return to students. The backend owns authentication, course access, persistence, uploads, and the authenticated RAG boundary; the separate RAG service owns retrieval, generation, and its review queue. The README documents service-level integrations and capabilities; several subsystem details below rely on that documentation because their implementation was not sampled.

Main entry points: [`frontend/src/App.jsx`](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/App.jsx) (Role-based UI), [`backend/src/app.js`](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/app.js) (HTTP API), [`rag/routes/review.js`](https://github.com/subhamsahu-25/course-companion/blob/main/rag/routes/review.js) (Question and review routes), [`backend/src/models`](https://github.com/subhamsahu-25/course-companion/tree/main/backend/src/models) (Course and user data)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Frontend"]
  node_role_ui["Role-based UI<br/>[App.jsx]"]
  node_ask_ui["Ask and history<br/>[Ask.jsx]"]
  node_review_ui["Review queue UI<br/>[ReviewQueue.jsx]"]
  node_admin_ui["Course management UI<br/>[Modules.jsx]"]
  node_api_client["API client<br/>[client.js]"]
end

subgraph group_backend["Backend"]
  node_http_api["HTTP API<br/>[app.js]"]
  node_auth["Authentication<br/>[auth.controller.js]"]
  node_course_ops["Course and access"]
  node_documents["Document uploads"]
  node_qa_ops["Q&amp;A orchestration<br/>[qa.controller.js]"]
  node_backend_data[("Course and user data")]
  node_file_store["File storage<br/>[cloudinary.js]"]
  node_mail["Email notifications<br/>[mail.js]"]
  node_rag_proxy["RAG service client<br/>[rag.service.js]"]
end

subgraph group_rag["RAG service"]
  node_ingestion["PDF ingestion<br/>[ingest-logic.js]"]
  node_vector_store[("Vector search store<br/>[qdrant.js]")]
  node_review_routes["Question and review routes<br/>[review.js]"]
  node_retrieval["Scoped retrieval<br/>[retrieval.js]"]
  node_drafting["Answer drafting<br/>[answers.js]"]
  node_queue_data[("Review queue<br/>[ReviewQueueItem.js]")]
end

node_student(("Student"))
node_ta(("TA"))
node_instructor(("Instructor"))
node_admin(("Admin"))
node_gemini(("Gemini API"))
node_mongodb[("MongoDB")]
node_qdrant[("Qdrant")]

node_student -->|"uses"| node_role_ui
node_ta -->|"uses"| node_role_ui
node_instructor -->|"uses"| node_role_ui
node_admin -->|"uses"| node_role_ui
node_role_ui -->|"renders"| node_ask_ui
node_role_ui -->|"renders"| node_review_ui
node_role_ui -->|"renders"| node_admin_ui
node_ask_ui -->|"requests"| node_api_client
node_review_ui -->|"requests"| node_api_client
node_admin_ui -->|"requests"| node_api_client
node_api_client -->|"calls"| node_http_api
node_http_api -->|"routes"| node_auth
node_http_api -->|"routes"| node_course_ops
node_http_api -->|"routes"| node_documents
node_http_api -->|"routes"| node_qa_ops
node_auth -->|"reads and writes"| node_backend_data
node_course_ops -->|"reads and writes"| node_backend_data
node_documents -->|"reads and writes"| node_backend_data
node_documents -->|"stores files"| node_file_store
node_documents -->|"requests ingestion"| node_rag_proxy
node_qa_ops -->|"submits and reviews"| node_rag_proxy
node_qa_ops -->|"checks access"| node_backend_data
node_qa_ops -.->|"notifies"| node_mail
node_rag_proxy -->|"calls"| node_review_routes
node_review_routes -->|"checks verified matches"| node_retrieval
node_review_routes -->|"generates drafts"| node_drafting
node_review_routes -->|"persists queue"| node_queue_data
node_drafting -->|"uses context"| node_retrieval
node_retrieval -->|"searches vectors"| node_vector_store
node_ingestion -->|"writes chunks"| node_vector_store
node_ingestion -.->|"embeds and captions"| node_gemini
node_drafting -.->|"generates text"| node_gemini
node_vector_store -->|"stores vectors"| node_qdrant
node_queue_data -->|"persists queue"| node_mongodb
node_backend_data -->|"persists records"| node_mongodb
node_ingestion -->|"adds approved goldens"| node_review_routes

click node_role_ui "https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/App.jsx"
click node_ask_ui "https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/student/Ask.jsx"
click node_review_ui "https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/ta/ReviewQueue.jsx"
click node_admin_ui "https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/admin/Modules.jsx"
click node_api_client "https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/api/client.js"
click node_http_api "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/app.js"
click node_auth "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/auth.controller.js"
click node_course_ops "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/course.controller.js"
click node_documents "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/document.controller.js"
click node_qa_ops "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/qa.controller.js"
click node_backend_data "https://github.com/subhamsahu-25/course-companion/tree/main/backend/src/models"
click node_file_store "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/utils/cloudinary.js"
click node_mail "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/utils/mail.js"
click node_rag_proxy "https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/services/rag.service.js"
click node_ingestion "https://github.com/subhamsahu-25/course-companion/blob/main/rag/ingest-logic.js"
click node_vector_store "https://github.com/subhamsahu-25/course-companion/blob/main/rag/qdrant.js"
click node_review_routes "https://github.com/subhamsahu-25/course-companion/blob/main/rag/routes/review.js"
click node_retrieval "https://github.com/subhamsahu-25/course-companion/blob/main/rag/services/retrieval.js"
click node_drafting "https://github.com/subhamsahu-25/course-companion/blob/main/rag/services/answers.js"
click node_queue_data "https://github.com/subhamsahu-25/course-companion/blob/main/rag/models/ReviewQueueItem.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_role_ui,node_ask_ui,node_review_ui,node_admin_ui,node_api_client toneBlue
class node_http_api,node_auth,node_course_ops,node_documents,node_qa_ops,node_backend_data,node_file_store,node_mail,node_rag_proxy,node_mongodb,node_qdrant toneAmber
class node_ingestion,node_vector_store,node_review_routes,node_retrieval,node_drafting,node_queue_data,node_gemini toneMint
class node_student,node_ta,node_instructor,node_admin toneIndigo
```

## Components

### Frontend

- [Role-based UI](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/App.jsx): `frontend/src/App.jsx`
- [Ask and history](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/student/Ask.jsx): `frontend/src/pages/student/Ask.jsx`
- [Review queue UI](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/ta/ReviewQueue.jsx): `frontend/src/pages/ta/ReviewQueue.jsx`
- [Course management UI](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/pages/admin/Modules.jsx): `frontend/src/pages/admin/Modules.jsx`
- [API client](https://github.com/subhamsahu-25/course-companion/blob/main/frontend/src/api/client.js): `frontend/src/api/client.js`

### Backend

- [HTTP API](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/app.js): `backend/src/app.js`
- [Authentication](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/auth.controller.js): `backend/src/controllers/auth.controller.js`
- [Course and access](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/course.controller.js): `backend/src/controllers/course.controller.js`
- [Document uploads](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/document.controller.js): `backend/src/controllers/document.controller.js`
- [Q&A orchestration](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/controllers/qa.controller.js): `backend/src/controllers/qa.controller.js`
- [Course and user data](https://github.com/subhamsahu-25/course-companion/tree/main/backend/src/models): `backend/src/models`
- [File storage](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/utils/cloudinary.js): `backend/src/utils/cloudinary.js`
- [Email notifications](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/utils/mail.js): `backend/src/utils/mail.js`
- [RAG service client](https://github.com/subhamsahu-25/course-companion/blob/main/backend/src/services/rag.service.js): `backend/src/services/rag.service.js`

### RAG service

- [PDF ingestion](https://github.com/subhamsahu-25/course-companion/blob/main/rag/ingest-logic.js): `rag/ingest-logic.js`
- [Vector search store](https://github.com/subhamsahu-25/course-companion/blob/main/rag/qdrant.js): `rag/qdrant.js`
- [Question and review routes](https://github.com/subhamsahu-25/course-companion/blob/main/rag/routes/review.js): `rag/routes/review.js`
- [Scoped retrieval](https://github.com/subhamsahu-25/course-companion/blob/main/rag/services/retrieval.js): `rag/services/retrieval.js`
- [Answer drafting](https://github.com/subhamsahu-25/course-companion/blob/main/rag/services/answers.js): `rag/services/answers.js`
- [Review queue](https://github.com/subhamsahu-25/course-companion/blob/main/rag/models/ReviewQueueItem.js): `rag/models/ReviewQueueItem.js`

### Other components

- **Student**
- **TA**
- **Instructor**
- **Admin**
- **Gemini API**
- **MongoDB**
- **Qdrant**

## Connections

- Student → Role-based UI: uses
- TA → Role-based UI: uses
- Instructor → Role-based UI: uses
- Admin → Role-based UI: uses
- Role-based UI → Ask and history: renders (evidence: `frontend/src/App.jsx`)
- Role-based UI → Review queue UI: renders (evidence: `frontend/src/App.jsx`)
- Role-based UI → Course management UI: renders (evidence: `frontend/src/App.jsx`)
- Ask and history → API client: requests (evidence: `frontend/src/pages/student/Ask.jsx`)
- Review queue UI → API client: requests (evidence: `frontend/src/pages/ta/ReviewQueue.jsx`)
- Course management UI → API client: requests (evidence: `frontend/src/pages/admin/Modules.jsx`)
- API client → HTTP API: calls
- HTTP API → Authentication: routes (evidence: `backend/src/app.js`)
- HTTP API → Course and access: routes (evidence: `backend/src/app.js`)
- HTTP API → Document uploads: routes (evidence: `backend/src/app.js`)
- HTTP API → Q&A orchestration: routes (evidence: `backend/src/app.js`)
- Authentication → Course and user data: reads and writes (evidence: `backend/src/controllers/auth.controller.js`)
- Course and access → Course and user data: reads and writes (evidence: `backend/src/controllers/course.controller.js`)
- Document uploads → Course and user data: reads and writes (evidence: `backend/src/controllers/document.controller.js`)
- Document uploads → File storage: stores files (evidence: `backend/src/controllers/document.controller.js`)
- Document uploads → RAG service client: requests ingestion (evidence: `backend/src/controllers/document.controller.js`)
- Q&A orchestration → RAG service client: submits and reviews (evidence: `backend/src/controllers/qa.controller.js`)
- Q&A orchestration → Course and user data: checks access (evidence: `backend/src/controllers/qa.controller.js`)
- Q&A orchestration → Email notifications: notifies (evidence: `backend/src/controllers/qa.controller.js`)
- RAG service client → Question and review routes: calls
- Question and review routes → Scoped retrieval: checks verified matches (evidence: `rag/routes/review.js`)
- Question and review routes → Answer drafting: generates drafts (evidence: `rag/routes/review.js`)
- Question and review routes → Review queue: persists queue (evidence: `rag/routes/review.js`)
- Answer drafting → Scoped retrieval: uses context (evidence: `rag/services/answers.js`)
- Scoped retrieval → Vector search store: searches vectors (evidence: `rag/services/retrieval.js`)
- PDF ingestion → Vector search store: writes chunks (evidence: `rag/ingest-logic.js`)
- PDF ingestion → Gemini API: embeds and captions
- Answer drafting → Gemini API: generates text
- Vector search store → Qdrant: stores vectors
- Review queue → MongoDB: persists queue
- Course and user data → MongoDB: persists records
- PDF ingestion → Question and review routes: adds approved goldens (evidence: `rag/routes/review.js`)
