# dump-hr/futsal-app architecture

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

- Interactive diagram: https://gitdiagram.com/dump-hr/futsal-app
- Repository: https://github.com/dump-hr/futsal-app

## Overview

Futsal App supports tournament administration and public tournament viewing. Administrators sign in, configure tournaments, groups and teams, schedule matches, and record live match events and timer state; spectators browse tournament standings, draws, teams and match details, including live updates. The API separates these domain operations into NestJS modules and uses Prisma with PostgreSQL. The graph shows the documented client/API/data responsibilities; frontend request wiring and persistence details are summarized because their implementations were not sampled.

Main entry points: [`apps/admin/src/api`](https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/api) (Admin API clients), [`apps/app/src/api`](https://github.com/dump-hr/futsal-app/tree/main/apps/app/src/api) (Public API clients), [`apps/api/lib/prisma.ts`](https://github.com/dump-hr/futsal-app/blob/main/apps/api/lib/prisma.ts) (Prisma access), [`packages/types/src`](https://github.com/dump-hr/futsal-app/tree/main/packages/types/src) (Shared DTOs and enums)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_admin["Administration"]
  node_admin_ui["Admin interface"]
  node_admin_auth["Login and access"]
  node_admin_clients["Admin API clients"]
end

subgraph group_public["Public Web"]
  node_public_ui["Public tournament views"]
  node_public_clients["Public API clients"]
end

subgraph group_backend["API Domain"]
  node_tournament_api["Tournament endpoints"]
  node_group_api["Group endpoints"]
  node_team_api["Team and player endpoints"]
  node_player_api["Player endpoints"]
  node_match_api["Match endpoints"]
  node_event_api["Match event endpoints"]
  node_timer_api["Match timer endpoints"]
  node_auth_api["Authentication"]
  node_blob_api["Logo storage service"]
end

subgraph group_data["Persistence and Contracts"]
  node_prisma["Prisma access<br/>[prisma.ts]"]
  node_postgres[("PostgreSQL")]
  node_shared_types["Shared DTOs and enums"]
end

node_admin_user(("Administrator"))
node_spectator(("Spectator"))

node_admin_user -->|"manages tournaments"| node_admin_ui
node_admin_ui -->|"signs in"| node_admin_auth
node_admin_ui -->|"requests changes"| node_admin_clients
node_admin_clients -->|"calls"| node_tournament_api
node_admin_clients -->|"calls"| node_group_api
node_admin_clients -->|"calls"| node_team_api
node_admin_clients -->|"calls"| node_player_api
node_admin_clients -->|"calls"| node_match_api
node_admin_clients -->|"calls"| node_event_api
node_admin_clients -->|"calls"| node_timer_api
node_admin_clients -->|"authenticates"| node_auth_api
node_spectator -->|"views tournaments"| node_public_ui
node_public_ui -->|"loads data"| node_public_clients
node_public_clients -->|"calls"| node_tournament_api
node_public_clients -->|"calls"| node_group_api
node_public_clients -->|"calls"| node_team_api
node_public_clients -->|"calls"| node_match_api
node_public_clients -->|"subscribes to events"| node_event_api
node_public_clients -->|"subscribes to timer"| node_timer_api
node_tournament_api -->|"reads and writes"| node_prisma
node_group_api -->|"reads and writes"| node_prisma
node_team_api -->|"reads and writes"| node_prisma
node_player_api -->|"reads and writes"| node_prisma
node_match_api -->|"reads and writes"| node_prisma
node_event_api -->|"reads and writes"| node_prisma
node_timer_api -->|"persists state"| node_prisma
node_auth_api -->|"looks up admin"| node_prisma
node_prisma -->|"queries"| node_postgres
node_team_api -->|"stores logos"| node_blob_api
node_admin_clients -->|"uses DTOs"| node_shared_types
node_public_clients -->|"uses DTOs"| node_shared_types
node_tournament_api -->|"uses DTOs"| node_shared_types
node_group_api -->|"uses DTOs"| node_shared_types
node_team_api -->|"uses DTOs"| node_shared_types
node_match_api -->|"uses DTOs"| node_shared_types
node_event_api -->|"uses DTOs"| node_shared_types
node_timer_api -->|"uses DTOs"| node_shared_types
node_auth_api -->|"uses DTOs"| node_shared_types

click node_admin_ui "https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/pages"
click node_admin_auth "https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/api/auth"
click node_admin_clients "https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/api"
click node_public_ui "https://github.com/dump-hr/futsal-app/tree/main/apps/app/src/pages"
click node_public_clients "https://github.com/dump-hr/futsal-app/tree/main/apps/app/src/api"
click node_tournament_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/tournament"
click node_group_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/group"
click node_team_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/team"
click node_player_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/player"
click node_match_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match"
click node_event_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match-event"
click node_timer_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match-timer"
click node_auth_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/auth"
click node_blob_api "https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/blob"
click node_prisma "https://github.com/dump-hr/futsal-app/blob/main/apps/api/lib/prisma.ts"
click node_shared_types "https://github.com/dump-hr/futsal-app/tree/main/packages/types/src"

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_admin_ui,node_admin_auth,node_admin_clients toneBlue
class node_public_ui,node_public_clients toneAmber
class node_tournament_api,node_group_api,node_team_api,node_player_api,node_match_api,node_event_api,node_timer_api,node_auth_api,node_blob_api toneMint
class node_prisma,node_postgres,node_shared_types toneRose
class node_admin_user,node_spectator toneIndigo
```

## Components

### Administration

- [Admin interface](https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/pages): `apps/admin/src/pages`
- [Login and access](https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/api/auth): `apps/admin/src/api/auth`
- [Admin API clients](https://github.com/dump-hr/futsal-app/tree/main/apps/admin/src/api): `apps/admin/src/api`

### Public Web

- [Public tournament views](https://github.com/dump-hr/futsal-app/tree/main/apps/app/src/pages): `apps/app/src/pages`
- [Public API clients](https://github.com/dump-hr/futsal-app/tree/main/apps/app/src/api): `apps/app/src/api`

### API Domain

- [Tournament endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/tournament): `apps/api/src/tournament`
- [Group endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/group): `apps/api/src/group`
- [Team and player endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/team): `apps/api/src/team`
- [Player endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/player): `apps/api/src/player`
- [Match endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match): `apps/api/src/match`
- [Match event endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match-event): `apps/api/src/match-event`
- [Match timer endpoints](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/match-timer): `apps/api/src/match-timer`
- [Authentication](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/auth): `apps/api/src/auth`
- [Logo storage service](https://github.com/dump-hr/futsal-app/tree/main/apps/api/src/blob): `apps/api/src/blob`

### Persistence and Contracts

- [Prisma access](https://github.com/dump-hr/futsal-app/blob/main/apps/api/lib/prisma.ts): `apps/api/lib/prisma.ts`
- **PostgreSQL**
- [Shared DTOs and enums](https://github.com/dump-hr/futsal-app/tree/main/packages/types/src): `packages/types/src`

### Other components

- **Administrator**
- **Spectator**

## Connections

- Administrator → Admin interface: manages tournaments
- Admin interface → Login and access: signs in
- Admin interface → Admin API clients: requests changes
- Admin API clients → Tournament endpoints: calls
- Admin API clients → Group endpoints: calls
- Admin API clients → Team and player endpoints: calls
- Admin API clients → Player endpoints: calls
- Admin API clients → Match endpoints: calls
- Admin API clients → Match event endpoints: calls
- Admin API clients → Match timer endpoints: calls
- Admin API clients → Authentication: authenticates
- Spectator → Public tournament views: views tournaments
- Public tournament views → Public API clients: loads data
- Public API clients → Tournament endpoints: calls
- Public API clients → Group endpoints: calls
- Public API clients → Team and player endpoints: calls
- Public API clients → Match endpoints: calls
- Public API clients → Match event endpoints: subscribes to events
- Public API clients → Match timer endpoints: subscribes to timer
- Tournament endpoints → Prisma access: reads and writes
- Group endpoints → Prisma access: reads and writes
- Team and player endpoints → Prisma access: reads and writes
- Player endpoints → Prisma access: reads and writes
- Match endpoints → Prisma access: reads and writes
- Match event endpoints → Prisma access: reads and writes
- Match timer endpoints → Prisma access: persists state
- Authentication → Prisma access: looks up admin
- Prisma access → PostgreSQL: queries
- Team and player endpoints → Logo storage service: stores logos
- Admin API clients → Shared DTOs and enums: uses DTOs
- Public API clients → Shared DTOs and enums: uses DTOs
- Tournament endpoints → Shared DTOs and enums: uses DTOs
- Group endpoints → Shared DTOs and enums: uses DTOs
- Team and player endpoints → Shared DTOs and enums: uses DTOs
- Match endpoints → Shared DTOs and enums: uses DTOs
- Match event endpoints → Shared DTOs and enums: uses DTOs
- Match timer endpoints → Shared DTOs and enums: uses DTOs
- Authentication → Shared DTOs and enums: uses DTOs
