# devsoc-unsw/unilectives architecture

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

- Interactive diagram: https://gitdiagram.com/devsoc-unsw/unilectives
- Repository: https://github.com/devsoc-unsw/unilectives

## Overview

Unilectives is a UNSW course and elective review website. A typical user searches the course catalogue, opens a course, reads reviews and ratings, and can submit or interact with reviews when authenticated. The frontend is a Next.js application backed by an Express API; domain services coordinate course, review, user, and report operations with repositories, Prisma-backed storage, and Redis caching. The excerpts confirm course search and several review operations; broader user, report, and frontend capabilities are represented from the README and tree, with uncertain internal links omitted.

Main entry points: [`backend/src/App.ts`](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/App.ts) (API application), [`frontend/src/utils/request.ts`](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/utils/request.ts) (API request utility), [`backend/src/services/review.service.ts`](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/review.service.ts) (Review operations), [`backend/src/controllers/review.controller.ts`](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/review.controller.ts) (Review routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_course_search["Course search"]
  node_course_pages["Course pages<br/>[page.tsx]"]
  node_review_ui["Review interactions<br/>[ReviewModal.tsx]"]
  node_user_pages["User pages<br/>[page.tsx]"]
  node_admin_ui["Admin interface<br/>[page.tsx]"]
  node_frontend_request["API request utility<br/>[request.ts]"]
end

subgraph group_api["HTTP API"]
  node_api_app["API application<br/>[App.ts]"]
  node_course_controller["Course routes"]
  node_review_controller["Review routes"]
  node_user_controller["User routes<br/>[user.controller.ts]"]
  node_report_controller["Report routes"]
  node_error_middleware["Error handling<br/>[errorHandler.ts]"]
end

subgraph group_domain["Domain and data"]
  node_course_service["Course operations<br/>[course.service.ts]"]
  node_review_service["Review operations<br/>[review.service.ts]"]
  node_user_service["User operations<br/>[user.service.ts]"]
  node_report_service["Report operations<br/>[report.service.ts]"]
  node_repositories["Data repositories"]
end

subgraph group_runtime["Runtime integrations"]
  node_postgres[("PostgreSQL")]
  node_redis[("Redis cache<br/>[redis.ts]")]
end

node_visitor(("Website visitor"))
node_auth["Authentication provider"]

node_visitor -->|"searches courses"| node_course_search
node_visitor -->|"opens course"| node_course_pages
node_visitor -->|"writes review"| node_review_ui
node_course_search -->|"requests results"| node_frontend_request
node_frontend_request -->|"calls search API"| node_course_controller
node_course_controller -->|"calls"| node_course_service
node_course_service -->|"queries courses"| node_repositories
node_repositories -->|"reads and writes"| node_postgres
node_course_pages -->|"loads course data"| node_frontend_request
node_review_ui -->|"submits review"| node_frontend_request
node_frontend_request -->|"calls review API"| node_review_controller
node_review_controller -->|"calls"| node_review_service
node_review_service -->|"reads and writes"| node_repositories
node_review_service -->|"reads and refreshes"| node_redis
node_user_pages -->|"loads user data"| node_frontend_request
node_admin_ui -->|"requests admin data"| node_frontend_request
node_frontend_request -->|"calls user API"| node_user_controller
node_frontend_request -->|"calls report API"| node_report_controller
node_api_app -->|"registers"| node_course_controller
node_api_app -->|"registers"| node_review_controller
node_api_app -->|"registers"| node_user_controller
node_api_app -->|"registers"| node_report_controller
node_api_app -->|"constructs"| node_course_service
node_api_app -->|"constructs"| node_review_service
node_api_app -->|"constructs"| node_user_service
node_api_app -->|"constructs"| node_report_service
node_api_app -->|"constructs"| node_repositories
node_auth -.->|"authenticates requests"| node_review_controller
node_auth -.->|"authenticates requests"| node_user_controller
node_error_middleware -->|"formats API errors"| node_api_app

click node_course_search "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/components/ReviewSearchBar/ReviewSearchBar.tsx"
click node_course_pages "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/course/%5Bid%5D/page.tsx"
click node_review_ui "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/components/ReviewModal/ReviewModal.tsx"
click node_user_pages "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/user/%5Bzid%5D/page.tsx"
click node_admin_ui "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/admin/page.tsx"
click node_frontend_request "https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/utils/request.ts"
click node_api_app "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/App.ts"
click node_course_controller "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/course.controller.ts"
click node_review_controller "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/review.controller.ts"
click node_user_controller "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/user.controller.ts"
click node_report_controller "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/report.controller.ts"
click node_error_middleware "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/api/middlewares/errorHandler.ts"
click node_course_service "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/course.service.ts"
click node_review_service "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/review.service.ts"
click node_user_service "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/user.service.ts"
click node_report_service "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/report.service.ts"
click node_repositories "https://github.com/devsoc-unsw/unilectives/tree/main/backend/src/repositories"
click node_redis "https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/modules/redis.ts"

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_course_search,node_course_pages,node_review_ui,node_user_pages,node_admin_ui,node_frontend_request toneBlue
class node_api_app,node_course_controller,node_review_controller,node_user_controller,node_report_controller,node_error_middleware toneAmber
class node_course_service,node_review_service,node_user_service,node_report_service,node_repositories toneMint
class node_postgres,node_redis toneRose
class node_visitor,node_auth toneIndigo
```

## Components

### Web experience

- [Course search](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/components/ReviewSearchBar/ReviewSearchBar.tsx): `frontend/src/components/ReviewSearchBar/ReviewSearchBar.tsx`
- [Course pages](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/course/%5Bid%5D/page.tsx): `frontend/src/app/course/[id]/page.tsx`
- [Review interactions](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/components/ReviewModal/ReviewModal.tsx): `frontend/src/components/ReviewModal/ReviewModal.tsx`
- [User pages](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/user/%5Bzid%5D/page.tsx): `frontend/src/app/user/[zid]/page.tsx`
- [Admin interface](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/app/admin/page.tsx): `frontend/src/app/admin/page.tsx`
- [API request utility](https://github.com/devsoc-unsw/unilectives/blob/main/frontend/src/utils/request.ts): `frontend/src/utils/request.ts`

### HTTP API

- [API application](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/App.ts): `backend/src/App.ts`
- [Course routes](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/course.controller.ts): `backend/src/controllers/course.controller.ts`
- [Review routes](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/review.controller.ts): `backend/src/controllers/review.controller.ts`
- [User routes](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/user.controller.ts): `backend/src/controllers/user.controller.ts`
- [Report routes](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/controllers/report.controller.ts): `backend/src/controllers/report.controller.ts`
- [Error handling](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/api/middlewares/errorHandler.ts): `backend/src/api/middlewares/errorHandler.ts`

### Domain and data

- [Course operations](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/course.service.ts): `backend/src/services/course.service.ts`
- [Review operations](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/review.service.ts): `backend/src/services/review.service.ts`
- [User operations](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/user.service.ts): `backend/src/services/user.service.ts`
- [Report operations](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/services/report.service.ts): `backend/src/services/report.service.ts`
- [Data repositories](https://github.com/devsoc-unsw/unilectives/tree/main/backend/src/repositories): `backend/src/repositories`

### Runtime integrations

- **PostgreSQL**
- [Redis cache](https://github.com/devsoc-unsw/unilectives/blob/main/backend/src/modules/redis.ts): `backend/src/modules/redis.ts`

### Other components

- **Website visitor**
- **Authentication provider**

## Connections

- Website visitor → Course search: searches courses
- Website visitor → Course pages: opens course
- Website visitor → Review interactions: writes review
- Course search → API request utility: requests results
- API request utility → Course routes: calls search API
- Course routes → Course operations: calls
- Course operations → Data repositories: queries courses
- Data repositories → PostgreSQL: reads and writes
- Course pages → API request utility: loads course data
- Review interactions → API request utility: submits review
- API request utility → Review routes: calls review API
- Review routes → Review operations: calls
- Review operations → Data repositories: reads and writes
- Review operations → Redis cache: reads and refreshes
- User pages → API request utility: loads user data
- Admin interface → API request utility: requests admin data
- API request utility → User routes: calls user API
- API request utility → Report routes: calls report API
- API application → Course routes: registers
- API application → Review routes: registers
- API application → User routes: registers
- API application → Report routes: registers
- API application → Course operations: constructs
- API application → Review operations: constructs
- API application → User operations: constructs
- API application → Report operations: constructs
- API application → Data repositories: constructs
- Authentication provider → Review routes: authenticates requests
- Authentication provider → User routes: authenticates requests
- Error handling → API application: formats API errors
