# koushikkothagal/inbox-app architecture

> Architecture diagram of the GitHub repository koushikkothagal/inbox-app, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/koushikkothagal/inbox-app
- Repository: https://github.com/koushikkothagal/inbox-app

## Overview

Inbox App is a Spring webmail application: a signed-in user opens a folder, views messages, and can compose email for delivery into recipient inboxes. EmailService creates sent/inbox listing records, stores the message, and updates unread counters; page controllers load and mark messages read. Cassandra-backed tables hold message bodies, per-user folder listings, folders, and unread statistics. GitHub OAuth and Astra are documented or indicated by configuration modules, but their full wiring and the compose page implementation are not excerpted, so uncertain links are omitted.

Main entry points: [`src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/EmailPageController.java) (Email page), [`src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/InboxPageController.java) (Inbox page), [`src/main/java/io/javabrains/inbox/email/EmailService.java`](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/EmailService.java) (Email service), [`src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java`](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java) (Mailbox listings)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web experience"]
  node_inbox_controller["Inbox page"]
  node_email_controller["Email page"]
  node_compose_controller["Compose page"]
  node_inbox_view["Inbox view<br/>[inbox-page.html]"]
  node_email_view["Email view<br/>[email-page.html]"]
  node_compose_view["Compose view<br/>[compose-page.html]"]
  node_folder_view["Folder component<br/>[folder-list.html]"]
end

subgraph group_mail["Mail workflow"]
  node_email_service["Email service<br/>[EmailService.java]"]
  node_folders_service["Folder service"]
end

subgraph group_state["Cassandra state"]
  node_email_store[("Message repository")]
  node_email_model["Message record<br/>[Email.java]"]
  node_listing_store[("Mailbox listings")]
  node_listing_model["Listing record<br/>[EmailsList.java]"]
  node_listing_key["Listing key"]
  node_folder_store[("Folder repository")]
  node_folder_model["Folder record<br/>[Folder.java]"]
  node_stats_store[("Unread statistics")]
  node_stats_model["Unread record"]
  node_stats_key["Statistics key"]
end

subgraph group_identity["Identity and setup"]
  node_security["Web security"]
  node_application["Application setup"]
  node_astra_properties["Astra properties"]
end

node_user(("Signed-in user"))
node_github(("GitHub OAuth"))
node_astra[("Astra Cassandra")]

node_user -->|"opens folder"| node_inbox_controller
node_user -->|"opens message"| node_email_controller
node_user -->|"composes mail"| node_compose_controller
node_inbox_controller -->|"renders"| node_inbox_view
node_email_controller -->|"renders"| node_email_view
node_inbox_controller -->|"loads counts"| node_folders_service
node_inbox_controller -->|"loads folders"| node_folder_store
node_inbox_controller -->|"loads listings"| node_listing_store
node_email_controller -->|"loads counts"| node_folders_service
node_email_controller -->|"loads folders"| node_folder_store
node_email_controller -->|"loads message"| node_email_store
node_email_controller -->|"marks read"| node_listing_store
node_email_controller -->|"decrements count"| node_stats_store
node_compose_controller -->|"submits mail"| node_email_service
node_compose_controller -->|"loads folders"| node_folder_store
node_email_service -->|"saves listings"| node_listing_store
node_email_service -->|"saves message"| node_email_store
node_email_service -->|"increments count"| node_stats_store
node_folders_service -->|"reads counts"| node_stats_store
node_email_store -->|"persists"| node_email_model
node_listing_store -->|"persists"| node_listing_model
node_listing_model -->|"keyed by"| node_listing_key
node_folder_store -->|"persists"| node_folder_model
node_stats_store -->|"persists"| node_stats_model
node_stats_model -.->|"keyed by"| node_stats_key
node_security -.->|"authenticates with"| node_github
node_application -->|"configures"| node_astra_properties
node_application -->|"wires"| node_email_service
node_astra_properties -.->|"connects to"| node_astra
node_astra -.->|"hosts mail data"| node_user

click node_inbox_controller "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/InboxPageController.java"
click node_email_controller "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/EmailPageController.java"
click node_compose_controller "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/ComposePageController.java"
click node_inbox_view "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/inbox-page.html"
click node_email_view "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/email-page.html"
click node_compose_view "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/compose-page.html"
click node_folder_view "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/components/folder-list.html"
click node_email_service "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/EmailService.java"
click node_folders_service "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/FoldersService.java"
click node_email_store "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/EmailRepository.java"
click node_email_model "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/Email.java"
click node_listing_store "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java"
click node_listing_model "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsList.java"
click node_listing_key "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsListPrimaryKey.java"
click node_folder_store "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/FolderRepository.java"
click node_folder_model "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/Folder.java"
click node_stats_store "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsRepository.java"
click node_stats_model "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStats.java"
click node_stats_key "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsPrimaryKey.java"
click node_security "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/SecurityAdapter.java"
click node_application "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/SpringGitHubLoginApplication.java"
click node_astra_properties "https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/DataStaxAstraProperties.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_inbox_controller,node_email_controller,node_compose_controller,node_inbox_view,node_email_view,node_compose_view,node_folder_view,node_user toneBlue
class node_email_service,node_folders_service,node_astra toneAmber
class node_email_store,node_email_model,node_listing_store,node_listing_model,node_listing_key,node_folder_store,node_folder_model,node_stats_store,node_stats_model,node_stats_key toneMint
class node_security,node_application,node_astra_properties toneRose
class node_github toneIndigo
```

## Components

### Web experience

- [Inbox page](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/InboxPageController.java): `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`
- [Email page](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/EmailPageController.java): `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`
- [Compose page](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/controllers/ComposePageController.java): `src/main/java/io/javabrains/inbox/controllers/ComposePageController.java`
- [Inbox view](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/inbox-page.html): `src/main/resources/templates/inbox-page.html`
- [Email view](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/email-page.html): `src/main/resources/templates/email-page.html`
- [Compose view](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/compose-page.html): `src/main/resources/templates/compose-page.html`
- [Folder component](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/resources/templates/components/folder-list.html): `src/main/resources/templates/components/folder-list.html`

### Mail workflow

- [Email service](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/EmailService.java): `src/main/java/io/javabrains/inbox/email/EmailService.java`
- [Folder service](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/FoldersService.java): `src/main/java/io/javabrains/inbox/folders/FoldersService.java`

### Cassandra state

- [Message repository](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/EmailRepository.java): `src/main/java/io/javabrains/inbox/email/EmailRepository.java`
- [Message record](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/email/Email.java): `src/main/java/io/javabrains/inbox/email/Email.java`
- [Mailbox listings](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java): `src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java`
- [Listing record](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsList.java): `src/main/java/io/javabrains/inbox/emailslist/EmailsList.java`
- [Listing key](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/emailslist/EmailsListPrimaryKey.java): `src/main/java/io/javabrains/inbox/emailslist/EmailsListPrimaryKey.java`
- [Folder repository](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/FolderRepository.java): `src/main/java/io/javabrains/inbox/folders/FolderRepository.java`
- [Folder record](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/Folder.java): `src/main/java/io/javabrains/inbox/folders/Folder.java`
- [Unread statistics](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsRepository.java): `src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsRepository.java`
- [Unread record](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStats.java): `src/main/java/io/javabrains/inbox/folders/UnreadEmailStats.java`
- [Statistics key](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsPrimaryKey.java): `src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsPrimaryKey.java`

### Identity and setup

- [Web security](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/SecurityAdapter.java): `src/main/java/io/javabrains/inbox/SecurityAdapter.java`
- [Application setup](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/SpringGitHubLoginApplication.java): `src/main/java/io/javabrains/inbox/SpringGitHubLoginApplication.java`
- [Astra properties](https://github.com/koushikkothagal/inbox-app/blob/master/src/main/java/io/javabrains/inbox/DataStaxAstraProperties.java): `src/main/java/io/javabrains/inbox/DataStaxAstraProperties.java`

### Other components

- **Signed-in user**
- **GitHub OAuth**
- **Astra Cassandra**

## Connections

- Signed-in user → Inbox page: opens folder (evidence: `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`)
- Signed-in user → Email page: opens message (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Signed-in user → Compose page: composes mail (evidence: `src/main/java/io/javabrains/inbox/controllers/ComposePageController.java`)
- Inbox page → Inbox view: renders (evidence: `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`)
- Email page → Email view: renders (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Inbox page → Folder service: loads counts (evidence: `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`)
- Inbox page → Folder repository: loads folders (evidence: `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`)
- Inbox page → Mailbox listings: loads listings (evidence: `src/main/java/io/javabrains/inbox/controllers/InboxPageController.java`)
- Email page → Folder service: loads counts (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Email page → Folder repository: loads folders (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Email page → Message repository: loads message (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Email page → Mailbox listings: marks read (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Email page → Unread statistics: decrements count (evidence: `src/main/java/io/javabrains/inbox/controllers/EmailPageController.java`)
- Compose page → Email service: submits mail (evidence: `src/main/java/io/javabrains/inbox/controllers/ComposePageController.java`)
- Compose page → Folder repository: loads folders (evidence: `src/main/java/io/javabrains/inbox/controllers/ComposePageController.java`)
- Email service → Mailbox listings: saves listings (evidence: `src/main/java/io/javabrains/inbox/email/EmailService.java`)
- Email service → Message repository: saves message (evidence: `src/main/java/io/javabrains/inbox/email/EmailService.java`)
- Email service → Unread statistics: increments count (evidence: `src/main/java/io/javabrains/inbox/email/EmailService.java`)
- Folder service → Unread statistics: reads counts (evidence: `src/main/java/io/javabrains/inbox/folders/FoldersService.java`)
- Message repository → Message record: persists (evidence: `src/main/java/io/javabrains/inbox/email/EmailRepository.java`)
- Mailbox listings → Listing record: persists (evidence: `src/main/java/io/javabrains/inbox/emailslist/EmailsListRepository.java`)
- Listing record → Listing key: keyed by (evidence: `src/main/java/io/javabrains/inbox/emailslist/EmailsList.java`)
- Folder repository → Folder record: persists (evidence: `src/main/java/io/javabrains/inbox/folders/FolderRepository.java`)
- Unread statistics → Unread record: persists (evidence: `src/main/java/io/javabrains/inbox/folders/UnreadEmailStatsRepository.java`)
- Unread record → Statistics key: keyed by
- Web security → GitHub OAuth: authenticates with
- Application setup → Astra properties: configures (evidence: `src/main/java/io/javabrains/inbox/SpringGitHubLoginApplication.java`)
- Application setup → Email service: wires (evidence: `src/main/java/io/javabrains/inbox/SpringGitHubLoginApplication.java`)
- Astra properties → Astra Cassandra: connects to
- Astra Cassandra → Signed-in user: hosts mail data (evidence: `README.md`)
