dev day #90 🥳

This commit is contained in:
Tomas Dvorak
2025-11-12 20:31:37 +01:00
parent 8762bde4bf
commit f3db65d350
103 changed files with 4053 additions and 2189 deletions
+29
View File
@@ -0,0 +1,29 @@
# Project Diagrams
This folder contains Mermaid diagrams for the project:
- ER Diagram of the database schema
- System Architecture (frontend ↔ backend ↔ integrations)
- Admin Module Map (grouped by navigation categories)
- Frontpage Data Map (sections → data sources)
## Recommended extensions (VS Code)
- Markdown Preview Mermaid Support (ID: bpruitt-goddard.vscode-mermaid-preview)
- Alternative: Markdown Preview Enhanced (ID: shd101wyy.markdown-preview-enhanced)
## How to preview
1) Install one of the extensions above.
2) Open any .md file here (e.g., er-diagram.md).
3) Press Ctrl+Shift+V (or Right click → Open Preview / Open Preview to the Side).
4) If prompted to allow scripts for Mermaid, accept.
## Files
- er-diagram.md — ER diagram of DB entities and relationships
- system-architecture.md — high-level system flow
- admin-map.md — map of admin sections
- frontpage-data-map.md — frontpage sections → data sources
## Optional: Export as images
- You can install Mermaid CLI to export to PNG/SVG: `npm i -g @mermaid-js/mermaid-cli`
- For Markdown files in this folder, run: `mmdc -i er-diagram.md -o er-diagram.svg --inputType markdown`
(If you extract the mermaid code to a standalone .mmd file, you can omit `--inputType`.)
+61
View File
@@ -0,0 +1,61 @@
# Admin Module Map
```mermaid
graph LR
subgraph Zakladni
ADASH[Nastenka]
AANALYT[Analytika]
end
subgraph Sport
TEAMS[Tymy]
MATCHES[Zapasy]
PLAYERS[Hraci]
ALIASES[Alias_soutezi]
SCORE[Tabule_Scoreboard]
SCORE_R[Scoreboard_Remote]
end
subgraph Obsah
ARTICLES[Clanky]
ACTIVITIES[Aktivity]
CATEGORIES[Kategorie]
COMMENTS[Komentare]
end
subgraph Media
VIDEOS[Videa]
GALLERY[Galerie]
FILES[Soubory]
BANNERS[Bannery]
end
subgraph Komunikace
MSGS[Zpravy]
NEWSLTR[Zpravodaj]
CONTACTS[Kontakty]
end
subgraph Marketing
SPONSORS[Sponzori]
MERCH[Obleceni]
POLLS[Ankety]
SWEEP[Souteze]
ENGAGE[Odmeny_a_Uspechy]
SHORT[Zkracene_odkazy]
end
subgraph Nastroje
PREFETCH[Prefetch_a_Cache]
ERRORS[Chyby]
DOCS[Dokumentace]
end
subgraph Nastaveni
SETTINGS[Nastaveni]
USERS[Uzivatele]
NAV[Navigace]
ABOUT[O_klubu]
end
ADASH --> Sport
ADASH --> Obsah
ADASH --> Media
ADASH --> Komunikace
ADASH --> Marketing
ADASH --> Nastroje
ADASH --> Nastaveni
```
+57
View File
@@ -0,0 +1,57 @@
graph LR
subgraph Zakladni
ADASH[Nastenka]
AANALYT[Analytika]
end
subgraph Sport
TEAMS[Tymy]
MATCHES[Zapasy]
PLAYERS[Hraci]
ALIASES[Alias_soutezi]
SCORE[Tabule_Scoreboard]
SCORE_R[Scoreboard_Remote]
end
subgraph Obsah
ARTICLES[Clanky]
ACTIVITIES[Aktivity]
CATEGORIES[Kategorie]
COMMENTS[Komentare]
end
subgraph Media
VIDEOS[Videa]
GALLERY[Galerie]
FILES[Soubory]
BANNERS[Bannery]
end
subgraph Komunikace
MSGS[Zpravy]
NEWSLTR[Zpravodaj]
CONTACTS[Kontakty]
end
subgraph Marketing
SPONSORS[Sponzori]
MERCH[Obleceni]
POLLS[Ankety]
SWEEP[Souteze]
ENGAGE[Odmeny_a_Uspechy]
SHORT[Zkracene_odkazy]
end
subgraph Nastroje
PREFETCH[Prefetch_a_Cache]
ERRORS[Chyby]
DOCS[Dokumentace]
end
subgraph Nastaveni
SETTINGS[Nastaveni]
USERS[Uzivatele]
NAV[Navigace]
ABOUT[O_klubu]
end
ADASH --> Sport
ADASH --> Obsah
ADASH --> Media
ADASH --> Komunikace
ADASH --> Marketing
ADASH --> Nastroje
ADASH --> Nastaveni
Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

+37
View File
@@ -0,0 +1,37 @@
graph LR
subgraph Backend
Router[API Router /api/v1]
Middleware[Middleware JWT RateLimit CORS Gzip Recovery]
Controllers[Controllers]
Services[Services]
Models[Models GORM]
DB[PostgreSQL]
Migrations[Migrations]
Jobs[Background jobs Prefetcher Newsletter]
Uploads[uploads static dist]
end
subgraph Integrations
FACR[FACR API]
YT[YouTube API]
ZON[Zonerama]
SMTP[SMTP Email]
MAPS[Google Maps]
UMAMI[Umami Analytics]
end
Router --> Middleware
Router --> Controllers
Controllers --> Services
Services --> Models
Models --> DB
Migrations --> DB
Jobs --> Services
Jobs --> DB
Controllers --> Uploads
Controllers --> FACR
Controllers --> YT
Controllers --> ZON
Controllers --> SMTP
Controllers --> MAPS
Controllers -. telemetry .-> UMAMI
Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 29 KiB

+79
View File
@@ -0,0 +1,79 @@
# ER Diagram
```mermaid
erDiagram
USERS ||--o{ ARTICLES : author_id
CATEGORIES ||--o{ ARTICLES : category_id
ARTICLES ||--o{ ARTICLE_TEAM_LINKS : article_id
ARTICLES ||--o{ ARTICLE_MATCH_LINKS : article_id
TEAMS ||--o{ PLAYERS : team_id
USERS ||--o{ EVENTS : created_by_id
EVENTS ||--o{ EVENT_ATTACHMENTS : event_id
POLLS ||--o{ POLL_OPTIONS : poll_id
POLLS ||--o{ POLL_VOTES : poll_id
POLL_OPTIONS ||--o{ POLL_VOTES : option_id
USERS o{--o| POLL_VOTES : user_id
CATEGORIES o{--o| POLLS : category_id
ARTICLES o{--o| POLLS : related_article_id
EVENTS o{--o| POLLS : related_event_id
PLAYERS o{--o| POLL_OPTIONS : player_id
USERS ||--|| USER_PROFILES : user_id
USERS ||--o{ PASSWORD_RESETS : user_id
USERS ||--o{ COMMENTS : user_id
COMMENTS o{--o| COMMENTS : parent_id
USERS ||--o{ COMMENT_BANS : user_id
USERS ||--o{ UNBAN_REQUESTS : user_id
COMMENTS ||--o{ COMMENT_REACTIONS : comment_id
COMMENTS ||--o{ COMMENT_REPORTS : comment_id
USERS o{--o| UPLOADED_FILES : uploaded_by_id
UPLOADED_FILES ||--o{ FILE_USAGES : file_id
CONTACT_CATEGORIES o{--o| CONTACTS : category_id
SHORT_LINKS o{--o| LINK_CLICKS : short_link_id
USERS o{--o| SHORT_LINKS : created_by_id
EMAIL_LOGS ||--o{ EMAIL_EVENTS : email_log_id
ARTICLES ||--o{ BLOG_NOTIFICATIONS : article_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_PRIZES : sweepstake_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_ENTRIES : sweepstake_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_WINNERS : sweepstake_id
USERS ||--o{ SWEEPSTAKE_ENTRIES : user_id
USERS ||--o{ SWEEPSTAKE_WINNERS : user_id
SWEEPSTAKE_ENTRIES ||--o{ SWEEPSTAKE_WINNERS : entry_id
SWEEPSTAKE_PRIZES |o--o{ SWEEPSTAKE_WINNERS : prize_id
USERS ||--o{ POINTS_TRANSACTIONS : user_id
USERS ||--o{ USER_ACHIEVEMENTS : user_id
ACHIEVEMENTS ||--o{ USER_ACHIEVEMENTS : achievement_id
REWARD_ITEMS ||--o{ REWARD_REDEMPTIONS : reward_id
USERS ||--o{ REWARD_REDEMPTIONS : user_id
USERS o{--o| AUDIT_LOGS : user_id
USERS o{--o| ERROR_EVENTS : user_id
USERS o{--o| VISITOR_EVENTS : user_id
SETUP_INFO ||--o{ CLUB_INFO : setup_info_id
NAVIGATION_ITEMS o{--o| NAVIGATION_ITEMS : parent_id
%% Standalone/core tables (configured/consumed by services)
SETTINGS
ABOUT_PAGES
SPONSORS
BANNERS
CLOTHING
COMPETITION_ALIASES
MATCH_OVERRIDES
TEAM_LOGO_OVERRIDES
NEWSLETTER_SUBSCRIPTIONS
NEWSLETTER_SENT_LOG
MATCH_NOTIFICATIONS
SCOREBOARD_STATES
```
+75
View File
@@ -0,0 +1,75 @@
erDiagram
USERS ||--o{ ARTICLES : author_id
CATEGORIES ||--o{ ARTICLES : category_id
ARTICLES ||--o{ ARTICLE_TEAM_LINKS : article_id
ARTICLES ||--o{ ARTICLE_MATCH_LINKS : article_id
TEAMS ||--o{ PLAYERS : team_id
USERS ||--o{ EVENTS : created_by_id
EVENTS ||--o{ EVENT_ATTACHMENTS : event_id
POLLS ||--o{ POLL_OPTIONS : poll_id
POLLS ||--o{ POLL_VOTES : poll_id
POLL_OPTIONS ||--o{ POLL_VOTES : option_id
USERS |o--o{ POLL_VOTES : user_id
CATEGORIES |o--o{ POLLS : category_id
ARTICLES |o--o{ POLLS : related_article_id
EVENTS |o--o{ POLLS : related_event_id
PLAYERS |o--o{ POLL_OPTIONS : player_id
USERS ||--|| USER_PROFILES : user_id
USERS ||--o{ PASSWORD_RESETS : user_id
USERS ||--o{ COMMENTS : user_id
COMMENTS |o--o{ COMMENTS : parent_id
USERS ||--o{ COMMENT_BANS : user_id
USERS ||--o{ UNBAN_REQUESTS : user_id
COMMENTS ||--o{ COMMENT_REACTIONS : comment_id
COMMENTS ||--o{ COMMENT_REPORTS : comment_id
USERS |o--o{ UPLOADED_FILES : uploaded_by_id
UPLOADED_FILES ||--o{ FILE_USAGES : file_id
CONTACT_CATEGORIES |o--o{ CONTACTS : category_id
SHORT_LINKS |o--o{ LINK_CLICKS : short_link_id
USERS |o--o{ SHORT_LINKS : created_by_id
EMAIL_LOGS ||--o{ EMAIL_EVENTS : email_log_id
ARTICLES ||--o{ BLOG_NOTIFICATIONS : article_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_PRIZES : sweepstake_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_ENTRIES : sweepstake_id
SWEEPSTAKES ||--o{ SWEEPSTAKE_WINNERS : sweepstake_id
USERS ||--o{ SWEEPSTAKE_ENTRIES : user_id
USERS ||--o{ SWEEPSTAKE_WINNERS : user_id
SWEEPSTAKE_ENTRIES ||--o{ SWEEPSTAKE_WINNERS : entry_id
SWEEPSTAKE_PRIZES |o--o{ SWEEPSTAKE_WINNERS : prize_id
USERS ||--o{ POINTS_TRANSACTIONS : user_id
USERS ||--o{ USER_ACHIEVEMENTS : user_id
ACHIEVEMENTS ||--o{ USER_ACHIEVEMENTS : achievement_id
REWARD_ITEMS ||--o{ REWARD_REDEMPTIONS : reward_id
USERS ||--o{ REWARD_REDEMPTIONS : user_id
USERS |o--o{ AUDIT_LOGS : user_id
USERS |o--o{ ERROR_EVENTS : user_id
USERS |o--o{ VISITOR_EVENTS : user_id
SETUP_INFO ||--o{ CLUB_INFO : setup_info_id
NAVIGATION_ITEMS |o--o{ NAVIGATION_ITEMS : parent_id
%% Standalone/core tables (configured/consumed by services)
SETTINGS
ABOUT_PAGES
SPONSORS
BANNERS
CLOTHING
COMPETITION_ALIASES
MATCH_OVERRIDES
TEAM_LOGO_OVERRIDES
NEWSLETTER_SUBSCRIPTIONS
NEWSLETTER_SENT_LOG
MATCH_NOTIFICATIONS
SCOREBOARD_STATES
Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 91 KiB

+72
View File
@@ -0,0 +1,72 @@
# Frontpage Data Map
```mermaid
graph TB
Home[Homepage sections]
News[News (Articles)]
Matches[Upcoming & recent matches]
TableSec[Standings / Tables]
Activities[Activities (Events)]
GallerySec[Gallery]
VideosSec[Videos]
PlayersSec[Players]
SponsorsSec[Sponsors]
MerchSec[Merch]
PollsSec[Polls]
MapSec[Club Map]
NewsletterSec[Newsletter box]
BannersSec[Banners]
Home --> News
Home --> Matches
Home --> TableSec
Home --> Activities
Home --> GallerySec
Home --> VideosSec
Home --> PlayersSec
Home --> SponsorsSec
Home --> MerchSec
Home --> PollsSec
Home --> MapSec
Home --> NewsletterSec
Home --> BannersSec
ARTICLES["Articles"]
FACR_API["FACR API"]
MATCH_OVERRIDES["Match overrides"]
COMPETITION_ALIASES["Competition aliases"]
EVENTS["Events"]
SETTINGS["Settings"]
ZONERAMA["Zonerama"]
YOUTUBE["YouTube"]
TEAMS["Teams"]
DB_PLAYERS["Players"]
SPONSORS["Sponsors"]
CLOTHING["Clothing"]
POLLS["Polls"]
POLL_OPTIONS["Poll options"]
GOOGLE_MAPS["Google Maps"]
NEWSLETTER_SUBSCRIPTIONS["Newsletter subscriptions"]
BANNERS["Banners"]
News -->|DB| ARTICLES
Matches -->|Source| FACR_API
Matches -->|Overrides| MATCH_OVERRIDES
TableSec -->|Source| FACR_API
TableSec -->|Aliases| COMPETITION_ALIASES
Activities -->|DB| EVENTS
GallerySec -->|Profile URL| SETTINGS
GallerySec --> ZONERAMA
VideosSec -->|Config| SETTINGS
VideosSec --> YOUTUBE
PlayersSec --> TEAMS
PlayersSec --> DB_PLAYERS
SponsorsSec -->|DB| SPONSORS
MerchSec -->|DB| CLOTHING
PollsSec -->|DB| POLLS
PollsSec --> POLL_OPTIONS
MapSec -->|lat/lng + style| SETTINGS
MapSec --> GOOGLE_MAPS
NewsletterSec -->|subscribe| NEWSLETTER_SUBSCRIPTIONS
BannersSec -->|DB| BANNERS
```
+68
View File
@@ -0,0 +1,68 @@
graph TB
Home[Homepage sections]
News[News Articles]
Matches[Upcoming and recent matches]
TableSec[Standings Tables]
Activities[Activities Events]
GallerySec[Gallery]
VideosSec[Videos]
PlayersSec[Players]
SponsorsSec[Sponsors]
MerchSec[Merch]
PollsSec[Polls]
MapSec[Club Map]
NewsletterSec[Newsletter]
BannersSec[Banners]
Home --> News
Home --> Matches
Home --> TableSec
Home --> Activities
Home --> GallerySec
Home --> VideosSec
Home --> PlayersSec
Home --> SponsorsSec
Home --> MerchSec
Home --> PollsSec
Home --> MapSec
Home --> NewsletterSec
Home --> BannersSec
ARTICLES[Articles]
FACR_API[FACR API]
MATCH_OVERRIDES[Match overrides]
COMPETITION_ALIASES[Competition aliases]
EVENTS[Events]
SETTINGS[Settings]
ZONERAMA[Zonerama]
YOUTUBE[YouTube]
TEAMS[Teams]
DB_PLAYERS[Players]
SPONSORS[Sponsors]
CLOTHING[Clothing]
POLLS[Polls]
POLL_OPTIONS[Poll options]
GOOGLE_MAPS[Google Maps]
NEWSLETTER_SUBSCRIPTIONS[Newsletter subscriptions]
BANNERS[Banners]
News -->|DB| ARTICLES
Matches -->|Source| FACR_API
Matches -->|Overrides| MATCH_OVERRIDES
TableSec -->|Source| FACR_API
TableSec -->|Aliases| COMPETITION_ALIASES
Activities -->|DB| EVENTS
GallerySec -->|Profile URL| SETTINGS
GallerySec --> ZONERAMA
VideosSec -->|Config| SETTINGS
VideosSec --> YOUTUBE
PlayersSec --> TEAMS
PlayersSec --> DB_PLAYERS
SponsorsSec -->|DB| SPONSORS
MerchSec -->|DB| CLOTHING
PollsSec -->|DB| POLLS
PollsSec --> POLL_OPTIONS
MapSec -->|lat lng and style| SETTINGS
MapSec --> GOOGLE_MAPS
NewsletterSec -->|subscribe| NEWSLETTER_SUBSCRIPTIONS
BannersSec -->|DB| BANNERS
Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 52 KiB

+3
View File
@@ -0,0 +1,3 @@
{
"args": ["--no-sandbox", "--disable-setuid-sandbox"]
}
+56
View File
@@ -0,0 +1,56 @@
# System Architecture
```mermaid
graph LR
subgraph Clients
A["Public site React SPA"]
B["Admin SPA"]
C["Scoreboard Overlay"]
end
subgraph Frontend
FE["React 18 + Chakra UI; Router + Query"]
end
subgraph Backend
BE["Go Gin REST API api v1; GORM services"]
JOBS["Background jobs; Prefetcher; Newsletter automation"]
end
subgraph Data
DB["PostgreSQL"]
UP["uploads static dist"]
end
subgraph Integrations_optional
FACR["FACR API"]
YT["YouTube API"]
ZON["Zonerama"]
SMTP["SMTP email"]
MAPS["Google Maps"]
UMAMI["Umami Analytics"]
end
A --> FE
B --> FE
C --> FE
FE -->|REST JSON| BE
FE -->|uploads static| UP
BE --> DB
BE --> UP
%% External calls
BE --> FACR
BE --> YT
BE --> ZON
BE --> SMTP
BE -. "telemetry" .-> UMAMI
BE --> MAPS
%% Jobs
JOBS --> BE
JOBS --> DB
JOBS --> SMTP
```
+52
View File
@@ -0,0 +1,52 @@
graph LR
subgraph Clients
A["Public site React SPA"]
B["Admin SPA"]
C["Scoreboard Overlay"]
end
subgraph Frontend
FE["React 18 + Chakra UI; Router + Query"]
end
subgraph Backend
BE["Go Gin REST API api v1; GORM services"]
JOBS["Background jobs; Prefetcher; Newsletter automation"]
end
subgraph Data
DB["PostgreSQL"]
UP["uploads static dist"]
end
subgraph Integrations_optional
FACR["FACR API"]
YT["YouTube API"]
ZON["Zonerama"]
SMTP["SMTP email"]
MAPS["Google Maps"]
UMAMI["Umami Analytics"]
end
A --> FE
B --> FE
C --> FE
FE -->|REST JSON| BE
FE -->|uploads static| UP
BE --> DB
BE --> UP
%% External calls
BE --> FACR
BE --> YT
BE --> ZON
BE --> SMTP
BE -. "telemetry" .-> UMAMI
BE --> MAPS
%% Jobs
JOBS --> BE
JOBS --> DB
JOBS --> SMTP
Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB