# hyuni0326/askeep_backend architecture

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

- Interactive diagram: https://gitdiagram.com/hyuni0326/askeep_backend
- Repository: https://github.com/hyuni0326/askeep_backend

## Overview

ASKeep is a collaborative presentation/study-session backend. The main workflow is account access, session creation and code-based joining, PDF material processing, live questions with AI and presenter answers, then an AI-generated session summary; WebSocket events keep session subscribers updated. Spring Boot owns the API and workflow coordination, while FastAPI provides document and answer/summary AI processing. The README documents the deployment and major capabilities; source excerpts and the import index support selected internal calls. Some unexcerpted handlers and processors are represented only at their documented subsystem level.

Main entry points: [`src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java) (Questions and answers), [`src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java) (Session lifecycle), [`src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java`](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java) (Session summaries), [`src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java`](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java) (PDF materials)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_identity["Identity and access"]
  node_user["User<br/>[User.java]"]
  node_auth["Authentication<br/>[AuthService.java]"]
end

subgraph group_sessions["Session lifecycle"]
  node_session_api["Session API"]
  node_session_service["Session lifecycle"]
  node_access["Membership checks"]
  node_session_store[("Session records")]
end

subgraph group_engagement["Materials and Q&amp;A"]
  node_material_service["PDF materials"]
  node_question_service["Questions and answers"]
  node_question_store[("Question records")]
  node_answer_store[("Answer records")]
  node_material_store[("Material records")]
end

subgraph group_ai["AI processing"]
  node_spring_ai_client["AI HTTP client"]
  node_ai_server["FastAPI processing<br/>[main.py]"]
  node_summary_service["Session summaries"]
  node_summary_worker["Summary processor"]
  node_summary_store[("Summary records")]
end

subgraph group_realtime["Realtime delivery"]
  node_realtime_events["Session event publisher"]
  node_websocket["STOMP WebSocket"]
end

node_actor(("Presenter / audience"))
node_database[("PostgreSQL")]
node_gemini["Gemini API"]

node_actor -->|"signs in"| node_auth
node_auth -->|"authenticates"| node_user
node_actor -->|"creates and joins"| node_session_api
node_session_api -->|"delegates to"| node_session_service
node_session_service -->|"reads and writes"| node_session_store
node_session_service -->|"deletes session files"| node_material_service
node_session_service -->|"resolves presenter"| node_user
node_actor -->|"uploads PDF"| node_material_service
node_material_service -->|"requests processing"| node_spring_ai_client
node_material_service -->|"updates status"| node_material_store
node_spring_ai_client -->|"sends document"| node_ai_server
node_actor -->|"asks question"| node_question_service
node_question_service -->|"stores questions"| node_question_store
node_question_service -->|"stores answers"| node_answer_store
node_question_service -->|"requests AI answer"| node_spring_ai_client
node_question_service -->|"checks membership"| node_access
node_actor -->|"requests summary"| node_summary_service
node_summary_service -->|"creates and reads"| node_summary_store
node_summary_service -->|"loads session questions"| node_question_store
node_summary_service -->|"queues request"| node_summary_worker
node_summary_worker -.->|"requests summary AI"| node_spring_ai_client
node_ai_server -->|"stores embeddings"| node_database
node_ai_server -->|"requests generated content"| node_gemini
node_actor -->|"subscribes to session"| node_websocket
node_question_service -->|"publishes question events"| node_realtime_events
node_session_service -->|"publishes status events"| node_realtime_events
node_realtime_events -->|"broadcasts events"| node_websocket
node_session_store -.->|"persists session state"| node_database
node_question_store -.->|"persists Q&amp;A"| node_database
node_summary_store -.->|"persists summaries"| node_database

click node_user "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/user/entity/User.java"
click node_auth "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/user/service/AuthService.java"
click node_session_api "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/controller/SessionController.java"
click node_session_service "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java"
click node_access "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/SessionAccessService.java"
click node_session_store "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionRepository.java"
click node_material_service "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java"
click node_question_service "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java"
click node_question_store "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionRepository.java"
click node_answer_store "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/answer/AnswerRepository.java"
click node_spring_ai_client "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/client/AiClientServer.java"
click node_ai_server "https://github.com/hyuni0326/askeep_backend/blob/main/ai-server/main.py"
click node_material_store "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialRepository.java"
click node_summary_service "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java"
click node_summary_worker "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryProcessor.java"
click node_summary_store "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionSummaryRepository.java"
click node_realtime_events "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/global/websocket/SessionTopicEvent.java"
click node_websocket "https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/global/websocket/RealtimeBroadcaster.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_user,node_auth toneBlue
class node_session_api,node_session_service,node_access,node_session_store,node_database toneAmber
class node_material_service,node_question_service,node_question_store,node_answer_store,node_material_store,node_gemini toneMint
class node_spring_ai_client,node_ai_server,node_summary_service,node_summary_worker,node_summary_store toneRose
class node_realtime_events,node_websocket,node_actor toneIndigo
```

## Components

### Identity and access

- [User](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/user/entity/User.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/user/entity/User.java`
- [Authentication](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/user/service/AuthService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/user/service/AuthService.java`

### Session lifecycle

- [Session API](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/controller/SessionController.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/controller/SessionController.java`
- [Session lifecycle](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`
- [Membership checks](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/SessionAccessService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/SessionAccessService.java`
- [Session records](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionRepository.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionRepository.java`

### Materials and Q&A

- [PDF materials](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java`
- [Questions and answers](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`
- [Question records](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionRepository.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionRepository.java`
- [Answer records](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/answer/AnswerRepository.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/answer/AnswerRepository.java`
- [Material records](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialRepository.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialRepository.java`

### AI processing

- [AI HTTP client](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/material/client/AiClientServer.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/material/client/AiClientServer.java`
- [FastAPI processing](https://github.com/hyuni0326/askeep_backend/blob/main/ai-server/main.py): `ai-server/main.py`
- [Session summaries](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java`
- [Summary processor](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryProcessor.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryProcessor.java`
- [Summary records](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionSummaryRepository.java): `src/main/java/com/GDGoCSMU/ASKeep/domain/session/repository/SessionSummaryRepository.java`

### Realtime delivery

- [Session event publisher](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/global/websocket/SessionTopicEvent.java): `src/main/java/com/GDGoCSMU/ASKeep/global/websocket/SessionTopicEvent.java`
- [STOMP WebSocket](https://github.com/hyuni0326/askeep_backend/blob/main/src/main/java/com/GDGoCSMU/ASKeep/global/websocket/RealtimeBroadcaster.java): `src/main/java/com/GDGoCSMU/ASKeep/global/websocket/RealtimeBroadcaster.java`

### Other components

- **Presenter / audience**
- **PostgreSQL**
- **Gemini API**

## Connections

- Presenter / audience → Authentication: signs in
- Authentication → User: authenticates (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/user/service/AuthService.java`)
- Presenter / audience → Session API: creates and joins
- Session API → Session lifecycle: delegates to (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/controller/SessionController.java`)
- Session lifecycle → Session records: reads and writes (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`)
- Session lifecycle → PDF materials: deletes session files (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`)
- Session lifecycle → User: resolves presenter (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`)
- Presenter / audience → PDF materials: uploads PDF
- PDF materials → AI HTTP client: requests processing (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java`)
- PDF materials → Material records: updates status (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/material/MaterialService.java`)
- AI HTTP client → FastAPI processing: sends document
- Presenter / audience → Questions and answers: asks question
- Questions and answers → Question records: stores questions (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`)
- Questions and answers → Answer records: stores answers (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`)
- Questions and answers → AI HTTP client: requests AI answer (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`)
- Questions and answers → Membership checks: checks membership (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`)
- Presenter / audience → Session summaries: requests summary
- Session summaries → Summary records: creates and reads (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java`)
- Session summaries → Question records: loads session questions (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java`)
- Session summaries → Summary processor: queues request (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionSummaryService.java`)
- Summary processor → AI HTTP client: requests summary AI
- FastAPI processing → PostgreSQL: stores embeddings
- FastAPI processing → Gemini API: requests generated content
- Presenter / audience → STOMP WebSocket: subscribes to session
- Questions and answers → Session event publisher: publishes question events (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/question/QuestionService.java`)
- Session lifecycle → Session event publisher: publishes status events (evidence: `src/main/java/com/GDGoCSMU/ASKeep/domain/session/service/SessionService.java`)
- Session event publisher → STOMP WebSocket: broadcasts events
- Session records → PostgreSQL: persists session state
- Question records → PostgreSQL: persists Q&A
- Summary records → PostgreSQL: persists summaries
