# abdus-typing/ai-chat-app architecture

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

- Interactive diagram: https://gitdiagram.com/abdus-typing/ai-chat-app
- Repository: https://github.com/abdus-typing/ai-chat-app

## Overview

This is a Java/Javalin AI chat application with registration and signed-token login, authenticated multi-session conversations, message history, and AI replies via an OpenAI-compatible endpoint or offline fallback. The principal flow runs from the browser through authenticated REST controllers and ChatService, which loads history, requests a reply, and atomically persists both messages. README documents a responsive UI, but the sampled React App is only a placeholder; the tree also contains a static UI. Backend wiring and service flows are sampled; unsampled details are represented only where README or paths support them.

Main entry points: [`src/main/java/com/aichat/web/Controllers.java`](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/Controllers.java) (REST controllers), [`src/main/java/com/aichat/service/ChatService.java`](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/ChatService.java) (Chat service), [`src/main/java/com/aichat/web/AuthFilter.java`](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/AuthFilter.java) (Bearer auth filter), [`src/main/java/com/aichat/service/UserService.java`](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/UserService.java) (User service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web interface"]
  node_browser["Web client"]
  node_server["Javalin bootstrap<br/>[Main.java]"]
  node_controllers["REST controllers<br/>[Controllers.java]"]
end

subgraph group_identity["Identity"]
  node_filter["Bearer auth filter<br/>[AuthFilter.java]"]
  node_user_service["User service<br/>[UserService.java]"]
  node_auth_service["Token and passwords<br/>[AuthService.java]"]
end

subgraph group_conversation["Conversation"]
  node_chat_service["Chat service<br/>[ChatService.java]"]
end

subgraph group_persistence["Persistence"]
  node_user_dao["User DAO<br/>[UserDao.java]"]
  node_session_dao["Session DAO"]
  node_message_dao["Message DAO<br/>[MessageDao.java]"]
  node_jpa["JPA and pool<br/>[JpaUtil.java]"]
  node_entities["Chat entities"]
  node_database[("MySQL database")]
end

subgraph group_integration["AI replies"]
  node_ai_service["AI reply service<br/>[AiService.java]"]
  node_ai_api["OpenAI-compatible API"]
end

node_visitor(("Chat user"))

node_visitor -->|"uses"| node_browser
node_browser -->|"HTTP JSON"| node_server
node_server -->|"routes to"| node_controllers
node_server -->|"protects routes"| node_filter
node_controllers -->|"guarded by"| node_filter
node_controllers -->|"registers and logs in"| node_user_service
node_controllers -->|"issues tokens"| node_auth_service
node_filter -->|"validates token"| node_auth_service
node_filter -->|"loads user"| node_user_service
node_user_service -->|"hashes passwords"| node_auth_service
node_user_service -->|"reads and saves"| node_user_dao
node_controllers -->|"handles chat requests"| node_chat_service
node_chat_service -->|"manages sessions"| node_session_dao
node_chat_service -->|"lists messages"| node_message_dao
node_chat_service -->|"requests reply"| node_ai_service
node_chat_service -->|"loads history and persists pair"| node_entities
node_session_dao -->|"persists sessions"| node_entities
node_message_dao -->|"queries messages"| node_entities
node_user_dao -->|"persists users"| node_entities
node_jpa -->|"connects via pool"| node_database
node_session_dao -->|"uses JPA"| node_jpa
node_message_dao -->|"uses JPA"| node_jpa
node_user_dao -->|"uses JPA"| node_jpa
node_ai_service -.->|"calls when configured"| node_ai_api

click node_browser "https://github.com/abdus-typing/ai-chat-app/tree/main/src/main/resources/static"
click node_server "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/Main.java"
click node_controllers "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/Controllers.java"
click node_filter "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/AuthFilter.java"
click node_user_service "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/UserService.java"
click node_auth_service "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/AuthService.java"
click node_user_dao "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/UserDao.java"
click node_chat_service "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/ChatService.java"
click node_ai_service "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/AiService.java"
click node_session_dao "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/ChatSessionDao.java"
click node_message_dao "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/MessageDao.java"
click node_jpa "https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/jpa/JpaUtil.java"
click node_entities "https://github.com/abdus-typing/ai-chat-app/tree/main/src/main/java/com/aichat/entity"

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_browser,node_server,node_controllers,node_visitor toneBlue
class node_filter,node_user_service,node_auth_service toneAmber
class node_chat_service toneMint
class node_user_dao,node_session_dao,node_message_dao,node_jpa,node_entities,node_database toneRose
class node_ai_service,node_ai_api toneIndigo
```

## Components

### Web interface

- [Web client](https://github.com/abdus-typing/ai-chat-app/tree/main/src/main/resources/static): `src/main/resources/static`
- [Javalin bootstrap](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/Main.java): `src/main/java/com/aichat/Main.java`
- [REST controllers](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/Controllers.java): `src/main/java/com/aichat/web/Controllers.java`

### Identity

- [Bearer auth filter](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/web/AuthFilter.java): `src/main/java/com/aichat/web/AuthFilter.java`
- [User service](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/UserService.java): `src/main/java/com/aichat/service/UserService.java`
- [Token and passwords](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/AuthService.java): `src/main/java/com/aichat/service/AuthService.java`

### Conversation

- [Chat service](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/ChatService.java): `src/main/java/com/aichat/service/ChatService.java`

### Persistence

- [User DAO](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/UserDao.java): `src/main/java/com/aichat/dao/UserDao.java`
- [Session DAO](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/ChatSessionDao.java): `src/main/java/com/aichat/dao/ChatSessionDao.java`
- [Message DAO](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/dao/MessageDao.java): `src/main/java/com/aichat/dao/MessageDao.java`
- [JPA and pool](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/jpa/JpaUtil.java): `src/main/java/com/aichat/jpa/JpaUtil.java`
- [Chat entities](https://github.com/abdus-typing/ai-chat-app/tree/main/src/main/java/com/aichat/entity): `src/main/java/com/aichat/entity`
- **MySQL database**

### AI replies

- [AI reply service](https://github.com/abdus-typing/ai-chat-app/blob/main/src/main/java/com/aichat/service/AiService.java): `src/main/java/com/aichat/service/AiService.java`
- **OpenAI-compatible API**

### Other components

- **Chat user**

## Connections

- Chat user → Web client: uses
- Web client → Javalin bootstrap: HTTP JSON
- Javalin bootstrap → REST controllers: routes to
- Javalin bootstrap → Bearer auth filter: protects routes
- REST controllers → Bearer auth filter: guarded by
- REST controllers → User service: registers and logs in
- REST controllers → Token and passwords: issues tokens
- Bearer auth filter → Token and passwords: validates token
- Bearer auth filter → User service: loads user
- User service → Token and passwords: hashes passwords
- User service → User DAO: reads and saves
- REST controllers → Chat service: handles chat requests
- Chat service → Session DAO: manages sessions
- Chat service → Message DAO: lists messages
- Chat service → AI reply service: requests reply
- Chat service → Chat entities: loads history and persists pair
- Session DAO → Chat entities: persists sessions
- Message DAO → Chat entities: queries messages
- User DAO → Chat entities: persists users
- JPA and pool → MySQL database: connects via pool
- Session DAO → JPA and pool: uses JPA
- Message DAO → JPA and pool: uses JPA
- User DAO → JPA and pool: uses JPA
- AI reply service → OpenAI-compatible API: calls when configured
