# chloeg-rowan/course-planner architecture

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

- Interactive diagram: https://gitdiagram.com/chloeg-rowan/course-planner
- Repository: https://github.com/chloeg-rowan/course-planner

## Overview

Course Planner is a single-user academic planning application: a browser user creates a local account, organizes courses by semester, optionally assigns courses to degree requirements, and reviews credit, GPA, and progress summaries. The REST controllers route requests to authentication, planning, and dashboard services; repositories persist user-scoped entities through JPA. The README documents the browser UI and protected session-backed API, but UI-to-endpoint wiring and database configuration details were not sampled, so those links are not expanded beyond documented behavior.

Main entry points: [`src/main/resources/static/index.html`](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/resources/static/index.html) (Browser UI), [`src/main/java/com/garvey/course_planner/repository/UserRepository.java`](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/UserRepository.java) (User repository), [`src/main/java/com/garvey/course_planner/service/CourseService.java`](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/CourseService.java) (Course management), [`src/main/java/com/garvey/course_planner/service/DashboardService.java`](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/DashboardService.java) (Progress calculations)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_api["API and access"]
  node_ui["Browser UI<br/>[index.html]"]
  node_auth_api["Authentication API"]
  node_auth_service["Session authentication"]
  node_security["Access security"]
  node_errors["API error mapping"]
end

subgraph group_planning["Academic planning"]
  node_course_api["Course API"]
  node_course_service["Course management<br/>[CourseService.java]"]
  node_semester_api["Semester API"]
  node_semester_service["Semester management"]
  node_requirement_api["Requirement API"]
  node_requirement_service["Requirement management"]
end

subgraph group_summary["Plan summaries"]
  node_dashboard_api["Dashboard API"]
  node_dashboard_service["Progress calculations"]
end

subgraph group_persistence["Persistence"]
  node_user_model["User record<br/>[User.java]"]
  node_semester_model["Semester record<br/>[Semester.java]"]
  node_course_model["Course record<br/>[Course.java]"]
  node_requirement_model["Requirement record"]
  node_user_repo[("User repository")]
  node_semester_repo[("Semester repository")]
  node_course_repo[("Course repository")]
  node_requirement_repo[("Requirement repository")]
  node_db[("PostgreSQL database")]
end

node_planner(("Browser user"))

node_planner -.->|"uses"| node_ui
node_planner -.->|"registers"| node_auth_api
node_ui -.->|"manages plan"| node_course_api
node_ui -.->|"manages terms"| node_semester_api
node_ui -.->|"tracks requirements"| node_requirement_api
node_ui -.->|"views progress"| node_dashboard_api
node_auth_api -->|"delegates"| node_auth_service
node_auth_service -->|"reads and saves"| node_user_repo
node_security -->|"loads users"| node_user_repo
node_course_api -->|"delegates"| node_course_service
node_course_service -->|"reads and saves"| node_course_repo
node_course_service -->|"checks ownership"| node_semester_repo
node_course_service -->|"assigns requirement"| node_requirement_repo
node_semester_api -->|"delegates"| node_semester_service
node_semester_service -->|"reads and saves"| node_semester_repo
node_requirement_api -->|"delegates"| node_requirement_service
node_requirement_service -->|"reads and saves"| node_requirement_repo
node_requirement_service -->|"loads owner"| node_user_repo
node_dashboard_api -->|"delegates"| node_dashboard_service
node_dashboard_service -->|"loads courses"| node_course_repo
node_dashboard_service -->|"loads semesters"| node_semester_repo
node_dashboard_service -->|"loads requirements"| node_requirement_repo
node_user_repo -->|"maps"| node_user_model
node_semester_repo -->|"maps"| node_semester_model
node_course_repo -->|"maps"| node_course_model
node_requirement_repo -->|"maps"| node_requirement_model
node_db -.->|"stores"| node_user_repo
node_errors -.->|"handles failures"| node_auth_api

click node_ui "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/resources/static/index.html"
click node_auth_api "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/AuthenticationController.java"
click node_auth_service "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/AuthenticationService.java"
click node_security "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/config/SecurityConfiguration.java"
click node_course_api "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/CourseController.java"
click node_course_service "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/CourseService.java"
click node_semester_api "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/SemesterController.java"
click node_semester_service "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/SemesterService.java"
click node_requirement_api "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/DegreeRequirementController.java"
click node_requirement_service "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/DegreeRequirementService.java"
click node_dashboard_api "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/DashboardController.java"
click node_dashboard_service "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/DashboardService.java"
click node_user_model "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/User.java"
click node_semester_model "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/Semester.java"
click node_course_model "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/Course.java"
click node_requirement_model "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/DegreeRequirement.java"
click node_user_repo "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/UserRepository.java"
click node_semester_repo "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/SemesterRepository.java"
click node_course_repo "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/CourseRepository.java"
click node_requirement_repo "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/DegreeRequirementRepository.java"
click node_errors "https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/ApiExceptionHandler.java"

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_ui,node_auth_api,node_auth_service,node_security,node_errors,node_planner toneBlue
class node_course_api,node_course_service,node_semester_api,node_semester_service,node_requirement_api,node_requirement_service toneAmber
class node_dashboard_api,node_dashboard_service toneMint
class node_user_model,node_semester_model,node_course_model,node_requirement_model,node_user_repo,node_semester_repo,node_course_repo,node_requirement_repo,node_db toneRose
```

## Components

### API and access

- [Browser UI](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/resources/static/index.html): `src/main/resources/static/index.html`
- [Authentication API](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/AuthenticationController.java): `src/main/java/com/garvey/course_planner/api/AuthenticationController.java`
- [Session authentication](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/AuthenticationService.java): `src/main/java/com/garvey/course_planner/service/AuthenticationService.java`
- [Access security](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/config/SecurityConfiguration.java): `src/main/java/com/garvey/course_planner/config/SecurityConfiguration.java`
- [API error mapping](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/ApiExceptionHandler.java): `src/main/java/com/garvey/course_planner/api/ApiExceptionHandler.java`

### Academic planning

- [Course API](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/CourseController.java): `src/main/java/com/garvey/course_planner/api/CourseController.java`
- [Course management](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/CourseService.java): `src/main/java/com/garvey/course_planner/service/CourseService.java`
- [Semester API](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/SemesterController.java): `src/main/java/com/garvey/course_planner/api/SemesterController.java`
- [Semester management](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/SemesterService.java): `src/main/java/com/garvey/course_planner/service/SemesterService.java`
- [Requirement API](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/DegreeRequirementController.java): `src/main/java/com/garvey/course_planner/api/DegreeRequirementController.java`
- [Requirement management](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/DegreeRequirementService.java): `src/main/java/com/garvey/course_planner/service/DegreeRequirementService.java`

### Plan summaries

- [Dashboard API](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/api/DashboardController.java): `src/main/java/com/garvey/course_planner/api/DashboardController.java`
- [Progress calculations](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/service/DashboardService.java): `src/main/java/com/garvey/course_planner/service/DashboardService.java`

### Persistence

- [User record](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/User.java): `src/main/java/com/garvey/course_planner/model/User.java`
- [Semester record](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/Semester.java): `src/main/java/com/garvey/course_planner/model/Semester.java`
- [Course record](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/Course.java): `src/main/java/com/garvey/course_planner/model/Course.java`
- [Requirement record](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/model/DegreeRequirement.java): `src/main/java/com/garvey/course_planner/model/DegreeRequirement.java`
- [User repository](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/UserRepository.java): `src/main/java/com/garvey/course_planner/repository/UserRepository.java`
- [Semester repository](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/SemesterRepository.java): `src/main/java/com/garvey/course_planner/repository/SemesterRepository.java`
- [Course repository](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/CourseRepository.java): `src/main/java/com/garvey/course_planner/repository/CourseRepository.java`
- [Requirement repository](https://github.com/chloeg-rowan/course-planner/blob/main/src/main/java/com/garvey/course_planner/repository/DegreeRequirementRepository.java): `src/main/java/com/garvey/course_planner/repository/DegreeRequirementRepository.java`
- **PostgreSQL database**

### Other components

- **Browser user**

## Connections

- Browser user → Browser UI: uses (evidence: `README.md`)
- Browser user → Authentication API: registers (evidence: `README.md`)
- Browser UI → Course API: manages plan (evidence: `README.md`)
- Browser UI → Semester API: manages terms (evidence: `README.md`)
- Browser UI → Requirement API: tracks requirements (evidence: `README.md`)
- Browser UI → Dashboard API: views progress (evidence: `README.md`)
- Authentication API → Session authentication: delegates (evidence: `src/main/java/com/garvey/course_planner/api/AuthenticationController.java`)
- Session authentication → User repository: reads and saves (evidence: `src/main/java/com/garvey/course_planner/service/AuthenticationService.java`)
- Access security → User repository: loads users (evidence: `src/main/java/com/garvey/course_planner/config/SecurityConfiguration.java`)
- Course API → Course management: delegates (evidence: `src/main/java/com/garvey/course_planner/api/CourseController.java`)
- Course management → Course repository: reads and saves (evidence: `src/main/java/com/garvey/course_planner/service/CourseService.java`)
- Course management → Semester repository: checks ownership (evidence: `src/main/java/com/garvey/course_planner/service/CourseService.java`)
- Course management → Requirement repository: assigns requirement (evidence: `src/main/java/com/garvey/course_planner/service/CourseService.java`)
- Semester API → Semester management: delegates (evidence: `src/main/java/com/garvey/course_planner/api/SemesterController.java`)
- Semester management → Semester repository: reads and saves (evidence: `src/main/java/com/garvey/course_planner/service/SemesterService.java`)
- Requirement API → Requirement management: delegates (evidence: `src/main/java/com/garvey/course_planner/api/DegreeRequirementController.java`)
- Requirement management → Requirement repository: reads and saves (evidence: `src/main/java/com/garvey/course_planner/service/DegreeRequirementService.java`)
- Requirement management → User repository: loads owner (evidence: `src/main/java/com/garvey/course_planner/service/DegreeRequirementService.java`)
- Dashboard API → Progress calculations: delegates (evidence: `src/main/java/com/garvey/course_planner/api/DashboardController.java`)
- Progress calculations → Course repository: loads courses (evidence: `src/main/java/com/garvey/course_planner/service/DashboardService.java`)
- Progress calculations → Semester repository: loads semesters (evidence: `src/main/java/com/garvey/course_planner/service/DashboardService.java`)
- Progress calculations → Requirement repository: loads requirements (evidence: `src/main/java/com/garvey/course_planner/service/DashboardService.java`)
- User repository → User record: maps (evidence: `src/main/java/com/garvey/course_planner/repository/UserRepository.java`)
- Semester repository → Semester record: maps (evidence: `src/main/java/com/garvey/course_planner/repository/SemesterRepository.java`)
- Course repository → Course record: maps (evidence: `src/main/java/com/garvey/course_planner/repository/CourseRepository.java`)
- Requirement repository → Requirement record: maps (evidence: `src/main/java/com/garvey/course_planner/repository/DegreeRequirementRepository.java`)
- PostgreSQL database → User repository: stores (evidence: `README.md`)
- API error mapping → Authentication API: handles failures
