# grodmir/codeduel architecture

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

- Interactive diagram: https://gitdiagram.com/grodmir/codeduel
- Repository: https://github.com/grodmir/codeduel

## Overview

CodeDuel is a Spring-based coding-duel backend: it supports account and profile management, rating-aware matchmaking, and asynchronous submission execution through a sandbox service. The visible matchmaking flow checks player availability and rating, pairs queued players, requests match creation, then notifies them. Authentication issues and revokes JWTs; user operations persist account/profile state. Battle messaging and sandbox handling are present, but no match lifecycle or evaluation implementation was sampled. Dashed links mark wiring not confirmed by the excerpts.

Main entry points: [`codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java) (Matchmaking), [`codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java`](https://github.com/grodmir/codeduel/blob/master/codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java) (Sandbox listener), [`codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java`](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java) (Profile & rating), [`codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java`](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java) (User endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_identity["Identity &amp; profiles"]
  node_auth_api["Auth endpoints"]
  node_auth_service["Authentication<br/>[AuthService.java]"]
  node_jwt["JWT issuer<br/>[JwtService.java]"]
  node_user_api["User endpoints"]
  node_user_service["User management<br/>[UserService.java]"]
  node_profile_service["Profile &amp; rating"]
  node_user_store["User persistence"]
  node_profile_store["Profile persistence"]
end

subgraph group_matching["Matchmaking"]
  node_match_api["Queue endpoints"]
  node_match_service["Matchmaking"]
  node_pair_finder["Pair finder<br/>[PairFinder.java]"]
  node_queue_store["Queue store"]
  node_match_runtime["Match creation &amp; notices"]
end

subgraph group_execution["Battle execution"]
  node_debug_api["Debug submission API"]
  node_producer["Submission producer"]
  node_sandbox["Sandbox listener"]
end

subgraph group_messaging["Shared messaging"]
  node_task_message["Submission task"]
  node_result_message["Submission result"]
end

node_player(("Player"))
node_broker["RabbitMQ"]

node_player -->|"authenticates"| node_auth_api
node_auth_api -->|"calls"| node_auth_service
node_auth_service -.->|"issues token"| node_jwt
node_player -->|"manages account"| node_user_api
node_user_api -->|"calls"| node_user_service
node_user_api -->|"reads profile"| node_profile_service
node_user_service -->|"creates profile"| node_profile_service
node_user_service -.->|"persists users"| node_user_store
node_profile_service -.->|"persists profiles"| node_profile_store
node_player -.->|"queues"| node_match_api
node_match_api -.->|"dispatches"| node_match_service
node_match_service -->|"reads and writes"| node_queue_store
node_match_service -->|"finds pairs"| node_pair_finder
node_match_service -->|"gets rating"| node_profile_service
node_match_service -->|"requests match"| node_match_runtime
node_match_service -->|"sends match notice"| node_player
node_player -->|"submits code"| node_debug_api
node_debug_api -->|"dispatches task"| node_producer
node_producer -.->|"publishes"| node_task_message
node_producer -.->|"sends task"| node_broker
node_broker -.->|"delivers task"| node_sandbox
node_sandbox -->|"consumes"| node_task_message
node_sandbox -.->|"emits result"| node_result_message
node_sandbox -.->|"publishes result"| node_broker

click node_auth_api "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/AuthController.java"
click node_auth_service "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/AuthService.java"
click node_jwt "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/security/service/JwtService.java"
click node_user_api "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java"
click node_user_service "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/UserService.java"
click node_profile_service "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java"
click node_user_store "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/UserRepositoryAdapter.java"
click node_profile_store "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/ProfileRepositoryAdapter.java"
click node_match_api "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/web/QueueController.java"
click node_match_service "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java"
click node_pair_finder "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/PairFinder.java"
click node_queue_store "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/infrastructure/InMemoryQueueStore.java"
click node_match_runtime "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/port/MatchFoundListener.java"
click node_debug_api "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/debug/DebugController.java"
click node_producer "https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/battle/messaging/SubmissionProducer.java"
click node_sandbox "https://github.com/grodmir/codeduel/blob/master/codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java"
click node_task_message "https://github.com/grodmir/codeduel/blob/master/codeduel-common/src/main/java/com/codeduel/SubmissionTaskMessage.java"
click node_result_message "https://github.com/grodmir/codeduel/blob/master/codeduel-common/src/main/java/com/codeduel/SubmissionResultMessage.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_auth_api,node_auth_service,node_jwt,node_user_api,node_user_service,node_profile_service,node_user_store,node_profile_store toneBlue
class node_match_api,node_match_service,node_pair_finder,node_queue_store,node_match_runtime toneAmber
class node_debug_api,node_producer,node_sandbox toneMint
class node_task_message,node_result_message toneRose
class node_player,node_broker toneIndigo
```

## Components

### Identity & profiles

- [Auth endpoints](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/AuthController.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/AuthController.java`
- [Authentication](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/AuthService.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/AuthService.java`
- [JWT issuer](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/security/service/JwtService.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/security/service/JwtService.java`
- [User endpoints](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java`
- [User management](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/UserService.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/UserService.java`
- [Profile & rating](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java`
- [User persistence](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/UserRepositoryAdapter.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/UserRepositoryAdapter.java`
- [Profile persistence](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/ProfileRepositoryAdapter.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/infrastructure/persistence/adapter/ProfileRepositoryAdapter.java`

### Matchmaking

- [Queue endpoints](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/web/QueueController.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/web/QueueController.java`
- [Matchmaking](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`
- [Pair finder](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/PairFinder.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/PairFinder.java`
- [Queue store](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/infrastructure/InMemoryQueueStore.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/infrastructure/InMemoryQueueStore.java`
- [Match creation & notices](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/port/MatchFoundListener.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/port/MatchFoundListener.java`

### Battle execution

- [Debug submission API](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/debug/DebugController.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/debug/DebugController.java`
- [Submission producer](https://github.com/grodmir/codeduel/blob/master/codeduel-app/src/main/java/com/codeduel/codeduelapp/battle/messaging/SubmissionProducer.java): `codeduel-app/src/main/java/com/codeduel/codeduelapp/battle/messaging/SubmissionProducer.java`
- [Sandbox listener](https://github.com/grodmir/codeduel/blob/master/codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java): `codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java`

### Shared messaging

- [Submission task](https://github.com/grodmir/codeduel/blob/master/codeduel-common/src/main/java/com/codeduel/SubmissionTaskMessage.java): `codeduel-common/src/main/java/com/codeduel/SubmissionTaskMessage.java`
- [Submission result](https://github.com/grodmir/codeduel/blob/master/codeduel-common/src/main/java/com/codeduel/SubmissionResultMessage.java): `codeduel-common/src/main/java/com/codeduel/SubmissionResultMessage.java`

### Other components

- **Player**
- **RabbitMQ**

## Connections

- Player → Auth endpoints: authenticates (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/AuthController.java`)
- Auth endpoints → Authentication: calls (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/AuthController.java`)
- Authentication → JWT issuer: issues token
- Player → User endpoints: manages account (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java`)
- User endpoints → User management: calls (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java`)
- User endpoints → Profile & rating: reads profile (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/api/controller/UserController.java`)
- User management → Profile & rating: creates profile (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/UserService.java`)
- User management → User persistence: persists users
- Profile & rating → Profile persistence: persists profiles
- Player → Queue endpoints: queues
- Queue endpoints → Matchmaking: dispatches
- Matchmaking → Queue store: reads and writes (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`)
- Matchmaking → Pair finder: finds pairs (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`)
- Matchmaking → Profile & rating: gets rating (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/auth/domain/service/ProfileService.java`)
- Matchmaking → Match creation & notices: requests match (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`)
- Matchmaking → Player: sends match notice (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/matchmaking/domain/service/MatchmakingService.java`)
- Player → Debug submission API: submits code (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/debug/DebugController.java`)
- Debug submission API → Submission producer: dispatches task (evidence: `codeduel-app/src/main/java/com/codeduel/codeduelapp/debug/DebugController.java`)
- Submission producer → Submission task: publishes
- Submission producer → RabbitMQ: sends task
- RabbitMQ → Sandbox listener: delivers task
- Sandbox listener → Submission task: consumes (evidence: `codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java`)
- Sandbox listener → Submission result: emits result (evidence: `codeduel-sandbox/src/main/java/com/codeduel/codeduelsandbox/SubmissionListener.java`)
- Sandbox listener → RabbitMQ: publishes result
