# enaughton/course-app architecture

> Architecture diagram of the GitHub repository enaughton/course-app, 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/enaughton/course-app
- Repository: https://github.com/enaughton/course-app

## Overview

Course-app is a React course catalog backed by an Express API and SQLite. Visitors can browse course listings and details; users sign up and sign in, then create, update, or delete courses. The client routes requests through shared data/context code, while the API handles authentication and course/user operations against Sequelize models. A separate seed workflow initializes the database. Client-to-API wiring and several client components are inferred from the documented capabilities and tree; their source was not sampled.

Main entry points: [`client/src/App.js`](https://github.com/enaughton/course-app/blob/master/client/src/App.js) (Routes and shell), [`client/src/Data.js`](https://github.com/enaughton/course-app/blob/master/client/src/Data.js) (API client), [`client/src/PrivateRoute.js`](https://github.com/enaughton/course-app/blob/master/client/src/PrivateRoute.js) (Route protection), [`api/db/index.js`](https://github.com/enaughton/course-app/blob/master/api/db/index.js) (Sequelize setup)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["React client"]
  node_app["Routes and shell<br/>[App.js]"]
  node_access["Route protection<br/>[PrivateRoute.js]"]
  node_context["Auth context<br/>[Context.js]"]
  node_data_client["API client<br/>[Data.js]"]
  node_browse["Course browsing<br/>[Courses.js]"]
  node_detail["Course details<br/>[CourseDetail.js]"]
  node_account["Account flows<br/>[UserSignUp.js]"]
  node_signin["Sign in and out<br/>[UserSignIn.js]"]
  node_create["Create course<br/>[CreateCourse.js]"]
  node_update["Update course<br/>[UpdateCourse.js]"]
  node_delete["Delete course<br/>[DeleteCourse.js]"]
end

subgraph group_api["Express API"]
  node_api_app["HTTP routes and auth<br/>[app.js]"]
end

subgraph group_data["Persistence"]
  node_sequelize["Sequelize setup<br/>[index.js]"]
  node_user_model["User model<br/>[user.js]"]
  node_course_model["Course model<br/>[course.js]"]
  node_sqlite[("SQLite database")]
end

subgraph group_seed["Database seed"]
  node_seed_entry["Seed runner<br/>[index.js]"]
  node_seed_database["Seed initialization<br/>[database.js]"]
  node_seed_context["Seed SQL access<br/>[context.js]"]
end

node_visitor(("Visitor or user"))

node_visitor -->|"uses"| node_app
node_app -->|"routes to"| node_browse
node_app -->|"routes to"| node_detail
node_app -->|"routes to"| node_account
node_app -->|"routes to"| node_signin
node_app -->|"guards routes"| node_access
node_access -->|"permits"| node_create
node_access -->|"permits"| node_update
node_access -->|"permits"| node_delete
node_app -->|"provides"| node_context
node_browse -->|"requests courses"| node_data_client
node_detail -->|"requests course"| node_data_client
node_account -->|"submits account"| node_data_client
node_signin -->|"updates auth"| node_context
node_create -->|"submits course"| node_data_client
node_update -->|"updates course"| node_data_client
node_delete -->|"deletes course"| node_data_client
node_data_client -->|"sends requests"| node_api_app
node_api_app -->|"queries users"| node_user_model
node_api_app -->|"queries courses"| node_course_model
node_sequelize -->|"loads model"| node_user_model
node_sequelize -->|"loads model"| node_course_model
node_sequelize -->|"connects"| node_sqlite
node_seed_entry -->|"initializes"| node_seed_database
node_seed_database -->|"runs SQL through"| node_seed_context
node_seed_context -->|"reads and writes"| node_sqlite

click node_app "https://github.com/enaughton/course-app/blob/master/client/src/App.js"
click node_access "https://github.com/enaughton/course-app/blob/master/client/src/PrivateRoute.js"
click node_context "https://github.com/enaughton/course-app/blob/master/client/src/Context.js"
click node_data_client "https://github.com/enaughton/course-app/blob/master/client/src/Data.js"
click node_browse "https://github.com/enaughton/course-app/blob/master/client/src/components/Courses.js"
click node_detail "https://github.com/enaughton/course-app/blob/master/client/src/components/CourseDetail.js"
click node_account "https://github.com/enaughton/course-app/blob/master/client/src/components/UserSignUp.js"
click node_signin "https://github.com/enaughton/course-app/blob/master/client/src/components/UserSignIn.js"
click node_create "https://github.com/enaughton/course-app/blob/master/client/src/components/CreateCourse.js"
click node_update "https://github.com/enaughton/course-app/blob/master/client/src/components/UpdateCourse.js"
click node_delete "https://github.com/enaughton/course-app/blob/master/client/src/components/DeleteCourse.js"
click node_api_app "https://github.com/enaughton/course-app/blob/master/api/app.js"
click node_sequelize "https://github.com/enaughton/course-app/blob/master/api/db/index.js"
click node_user_model "https://github.com/enaughton/course-app/blob/master/api/db/models/user.js"
click node_course_model "https://github.com/enaughton/course-app/blob/master/api/db/models/course.js"
click node_seed_entry "https://github.com/enaughton/course-app/blob/master/api/seed/index.js"
click node_seed_database "https://github.com/enaughton/course-app/blob/master/api/seed/database.js"
click node_seed_context "https://github.com/enaughton/course-app/blob/master/api/seed/context.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_app,node_access,node_context,node_data_client,node_browse,node_detail,node_account,node_signin,node_create,node_update,node_delete,node_visitor toneBlue
class node_api_app toneAmber
class node_sequelize,node_user_model,node_course_model,node_sqlite toneMint
class node_seed_entry,node_seed_database,node_seed_context toneRose
```

## Components

### React client

- [Routes and shell](https://github.com/enaughton/course-app/blob/master/client/src/App.js): `client/src/App.js`
- [Route protection](https://github.com/enaughton/course-app/blob/master/client/src/PrivateRoute.js): `client/src/PrivateRoute.js`
- [Auth context](https://github.com/enaughton/course-app/blob/master/client/src/Context.js): `client/src/Context.js`
- [API client](https://github.com/enaughton/course-app/blob/master/client/src/Data.js): `client/src/Data.js`
- [Course browsing](https://github.com/enaughton/course-app/blob/master/client/src/components/Courses.js): `client/src/components/Courses.js`
- [Course details](https://github.com/enaughton/course-app/blob/master/client/src/components/CourseDetail.js): `client/src/components/CourseDetail.js`
- [Account flows](https://github.com/enaughton/course-app/blob/master/client/src/components/UserSignUp.js): `client/src/components/UserSignUp.js`
- [Sign in and out](https://github.com/enaughton/course-app/blob/master/client/src/components/UserSignIn.js): `client/src/components/UserSignIn.js`
- [Create course](https://github.com/enaughton/course-app/blob/master/client/src/components/CreateCourse.js): `client/src/components/CreateCourse.js`
- [Update course](https://github.com/enaughton/course-app/blob/master/client/src/components/UpdateCourse.js): `client/src/components/UpdateCourse.js`
- [Delete course](https://github.com/enaughton/course-app/blob/master/client/src/components/DeleteCourse.js): `client/src/components/DeleteCourse.js`

### Express API

- [HTTP routes and auth](https://github.com/enaughton/course-app/blob/master/api/app.js): `api/app.js`

### Persistence

- [Sequelize setup](https://github.com/enaughton/course-app/blob/master/api/db/index.js): `api/db/index.js`
- [User model](https://github.com/enaughton/course-app/blob/master/api/db/models/user.js): `api/db/models/user.js`
- [Course model](https://github.com/enaughton/course-app/blob/master/api/db/models/course.js): `api/db/models/course.js`
- **SQLite database**

### Database seed

- [Seed runner](https://github.com/enaughton/course-app/blob/master/api/seed/index.js): `api/seed/index.js`
- [Seed initialization](https://github.com/enaughton/course-app/blob/master/api/seed/database.js): `api/seed/database.js`
- [Seed SQL access](https://github.com/enaughton/course-app/blob/master/api/seed/context.js): `api/seed/context.js`

### Other components

- **Visitor or user**

## Connections

- Visitor or user → Routes and shell: uses
- Routes and shell → Course browsing: routes to
- Routes and shell → Course details: routes to
- Routes and shell → Account flows: routes to
- Routes and shell → Sign in and out: routes to
- Routes and shell → Route protection: guards routes
- Route protection → Create course: permits
- Route protection → Update course: permits
- Route protection → Delete course: permits
- Routes and shell → Auth context: provides
- Course browsing → API client: requests courses
- Course details → API client: requests course
- Account flows → API client: submits account
- Sign in and out → Auth context: updates auth
- Create course → API client: submits course
- Update course → API client: updates course
- Delete course → API client: deletes course
- API client → HTTP routes and auth: sends requests
- HTTP routes and auth → User model: queries users
- HTTP routes and auth → Course model: queries courses
- Sequelize setup → User model: loads model
- Sequelize setup → Course model: loads model
- Sequelize setup → SQLite database: connects
- Seed runner → Seed initialization: initializes
- Seed initialization → Seed SQL access: runs SQL through
- Seed SQL access → SQLite database: reads and writes
