Files
MyClub/diagrams/admin-overall.mmd
T
Tomas Dvorak f5b6f83974 dev day #99
2025-11-21 08:44:44 +01:00

421 lines
12 KiB
Plaintext

%%{init: {
'theme': 'base',
'securityLevel': 'loose',
'flowchart': { 'curve': 'linear', 'useMaxWidth': true, 'nodeSpacing': 36, 'rankSpacing': 48 },
'themeVariables': {
'primaryColor': '#0b5cff',
'primaryTextColor': '#ffffff',
'lineColor': '#64748b',
'tertiaryColor': '#f8fafc',
'fontSize': '12px'
},
'themeCSS': '.edgePath path { stroke-opacity: .6; } .cluster rect { rx:8; ry:8; }'
}}%%
flowchart TB
classDef route stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:1px;
classDef page stroke:#0ea5e9,fill:#e0f7ff,color:#0b5cff,stroke-width:1px;
classDef layout stroke:#6b7280,fill:#f8fafc,color:#111827,stroke-width:1px;
classDef component stroke:#94a3b8,fill:#f1f5f9,color:#111827,stroke-width:1px;
classDef svc stroke:#22c55e,fill:#ecfdf5,color:#065f46,stroke-width:1px;
classDef adminsvc stroke:#16a34a,fill:#dcfce7,color:#064e3b,stroke-width:1px;
classDef hook stroke:#f97316,fill:#fff7ed,color:#9a3412,stroke-width:1px;
classDef ctx stroke:#8b5cf6,fill:#f5f3ff,color:#4c1d95,stroke-width:1px;
classDef guard stroke:#ef4444,fill:#fef2f2,color:#991b1b,stroke-width:1px;
classDef ext stroke:#a855f7,fill:#faf5ff,color:#6b21a8,stroke-width:1px;
classDef infra stroke:#0f766e,fill:#ecfeff,color:#155e75,stroke-width:1px;
classDef legacy stroke-dasharray:3 3,stroke:#9ca3af,fill:#fafafa,color:#6b7280;
%% Routing & Guards
subgraph ROUTING [Routing]
direction TB
pr_admin[ProtectedRoute requiredRole=admin]:::guard
pr_editor[ProtectedRoute requiredRole=editor]:::guard
subgraph ROUTES [Admin Routes]
direction TB
r_admin["/admin"]:::route
r_docs["/admin/docs"]:::route
r_about["/admin/o-klubu"]:::route
r_videos["/admin/videa"]:::route
r_gallery["/admin/galerie"]:::route
r_merch["/admin/obleceni"]:::route
r_sponsors["/admin/sponzori"]:::route
r_matches["/admin/zapasy"]:::route
r_players["/admin/hraci"]:::route
r_teams["/admin/tymy"]:::route
r_users["/admin/uzivatele"]:::route
r_banners["/admin/bannery"]:::route
r_messages["/admin/zpravy"]:::route
r_settings["/admin/nastaveni"]:::route
r_newsletter["/admin/newsletter"]:::route
r_polls["/admin/ankety"]:::route
r_aliases["/admin/aliasy-soutezi"]:::route
r_prefetch["/admin/prefetch"]:::route
r_reset["/admin/users/send-reset"]:::route
r_score["/admin/scoreboard"]:::route
r_score_remote["/admin/scoreboard/remote"]:::route
r_analytics["/admin/analytika"]:::route
r_shortlinks["/admin/shortlinks"]:::route
r_files["/admin/soubory"]:::route
r_contacts["/admin/kontakty"]:::route
r_nav["/admin/navigace"]:::route
r_comments["/admin/komentare"]:::route
r_engagement["/admin/engagement"]:::route
r_sweep["/admin/sweepstakes"]:::route
r_sweep_visual["/admin/sweepstakes/:id/visual"]:::route
r_articles["/admin/clanky"]:::route
r_activities["/admin/aktivity"]:::route
end
pr_admin --> r_admin
pr_admin --> r_docs
pr_admin --> r_about
pr_admin --> r_videos
pr_admin --> r_gallery
pr_admin --> r_merch
pr_admin --> r_sponsors
pr_admin --> r_matches
pr_admin --> r_players
pr_admin --> r_teams
pr_admin --> r_users
pr_admin --> r_banners
pr_admin --> r_messages
pr_admin --> r_settings
pr_admin --> r_newsletter
pr_admin --> r_polls
pr_admin --> r_aliases
pr_admin --> r_prefetch
pr_admin --> r_reset
pr_admin --> r_score
pr_admin --> r_score_remote
pr_admin --> r_analytics
pr_admin --> r_shortlinks
pr_admin --> r_files
pr_admin --> r_contacts
pr_admin --> r_nav
pr_admin --> r_comments
pr_admin --> r_engagement
pr_admin --> r_sweep
pr_admin --> r_sweep_visual
pr_editor --> r_articles
pr_editor --> r_activities
end
%% Admin UI Shell
subgraph UI [Admin UI Shell]
direction TB
layout[AdminLayout]:::layout
sidebar[AdminSidebar]:::component
header[AdminHeader]:::component
search[AdminSearchModal]:::component
support[AdminSupportButton]:::component
auth[AuthContext]:::ctx
ups[usePublicSettings]:::hook
layout --> sidebar
layout --> header
layout --> search
layout --> support
layout --> auth
layout --> ups
end
%% Common Admin Hooks
subgraph HOOKS [Common Admin Hooks]
direction TB
h_adminTable[useAdminTable]:::hook
h_autoSave[useAutoSave]:::hook
end
%% Admin Pages (each includes AdminLayout)
subgraph PAGES [Admin Pages]
direction TB
p_dashboard[AdminDashboardPage]:::page
p_docs[AdminDocsPage]:::page
p_about[AboutAdminPage]:::page
p_videos[AdminVideosPage]:::page
p_gallery[GalleryAdminPage]:::page
p_merch[AdminMerchPage]:::page
p_sponsors[SponsorsAdminPage]:::page
p_matches[MatchesAdminPage]:::page
p_players[PlayersAdminPage]:::page
p_teams[TeamsAdminPage]:::page
p_users[UsersAdminPage]:::page
p_banners[BannersAdminPage]:::page
p_messages[MessagesAdminPage]:::page
p_settings[SettingsAdminPage]:::page
p_newsletter[NewsletterAdminPage]:::page
p_polls[PollsAdminPage]:::page
p_aliases[CompetitionAliasesAdminPage]:::page
p_prefetch[PrefetchAdminPage]:::page
p_reset[AdminResetPasswordPage]:::page
p_score[ScoreboardAdminPage]:::page
p_score_remote[MobileScoreboardControlPage]:::page
p_analytics[AnalyticsAdminPage]:::page
p_shortlinks[ShortlinksAdminPage]:::page
p_files[FilesAdminPage]:::page
p_contacts[ContactsAdminPage]:::page
p_nav[NavigationAdminPage]:::page
p_comments[CommentsAdminPage]:::page
p_engagement[EngagementAdminPage]:::page
p_sweep[SweepstakesAdminPage]:::page
p_sweep_visual[SweepstakeVisualPage]:::page
p_articles[ArticlesAdminPage]:::page
p_activities[AdminActivitiesPage]:::page
%% Unrouted/Legacy admin pages present in codebase
p_devdocs[DevDocsPage]:::legacy
p_media[MediaAdminPage]:::legacy
p_standings[StandingsAdminPage]:::legacy
p_errors[ErrorsAdminPage]:::legacy
p_docs_old[AdminDocsPage_Old]:::legacy
p_dash_legacy[DashboardPage]:::legacy
end
%% Route -> Page wiring
r_admin --> p_dashboard
r_docs --> p_docs
r_about --> p_about
r_videos --> p_videos
r_gallery --> p_gallery
r_merch --> p_merch
r_sponsors --> p_sponsors
r_matches --> p_matches
r_players --> p_players
r_teams --> p_teams
r_users --> p_users
r_banners --> p_banners
r_messages --> p_messages
r_settings --> p_settings
r_newsletter --> p_newsletter
r_polls --> p_polls
r_aliases --> p_aliases
r_prefetch --> p_prefetch
r_reset --> p_reset
r_score --> p_score
r_score_remote --> p_score_remote
r_analytics --> p_analytics
r_shortlinks --> p_shortlinks
r_files --> p_files
r_contacts --> p_contacts
r_nav --> p_nav
r_comments --> p_comments
r_engagement --> p_engagement
r_sweep --> p_sweep
r_sweep_visual --> p_sweep_visual
r_articles --> p_articles
r_activities --> p_activities
%% Pages include AdminLayout
p_dashboard --> layout
p_docs --> layout
p_about --> layout
p_videos --> layout
p_gallery --> layout
p_merch --> layout
p_sponsors --> layout
p_matches --> layout
p_players --> layout
p_teams --> layout
p_users --> layout
p_banners --> layout
p_messages --> layout
p_settings --> layout
p_newsletter --> layout
p_polls --> layout
p_aliases --> layout
p_prefetch --> layout
p_reset --> layout
p_score --> layout
p_score_remote --> layout
p_analytics --> layout
p_shortlinks --> layout
p_files --> layout
p_contacts --> layout
p_nav --> layout
p_comments --> layout
p_engagement --> layout
p_sweep --> layout
p_sweep_visual --> layout
p_articles --> layout
p_activities --> layout
%% Services
subgraph SERVICES [Service Layer]
direction TB
s_api["api.ts (Axios + interceptors)"]:::infra
s_settings[settings.ts]:::svc
s_setup[setup.ts]:::svc
s_seo[seo.ts]:::svc
s_articles[articles.ts]:::svc
s_files[files.ts]:::svc
s_navigation[navigation.ts]:::svc
s_players[players.ts]:::svc
s_polls[polls.ts]:::svc
s_shortlinks[shortlinks.ts]:::svc
s_banners[banners.ts]:::svc
s_clothing[clothing.ts]:::svc
s_contacts[contactInfo.ts]:::svc
s_comments_pub[comments.ts]:::svc
s_events[eventService.ts]:::svc
s_image[imageProcessing.ts]:::svc
s_scoreboard[scoreboard.ts]:::svc
s_sweep[sweepstakes.ts]:::svc
s_youtube[youtube.ts]:::svc
s_zonerama[zonerama.ts]:::svc
s_analytics[analyticsService.ts]:::svc
s_errors[errors.ts]:::svc
s_facr_cache[facr/cache.ts]:::svc
s_facr_api[facr/facrApi.ts]:::svc
s_ai[ai.ts]:::svc
subgraph ADMIN_APIs [Admin API Modules]
direction TB
s_admin_comments[admin/comments.ts]:::adminsvc
s_admin_msgs[admin/contactMessages.ts]:::adminsvc
s_admin_eng[admin/engagement.ts]:::adminsvc
s_admin_news[admin/newsletter.ts]:::adminsvc
s_admin_prefetch[admin/prefetch.ts]:::adminsvc
s_admin_matches[adminMatches.ts]:::adminsvc
end
end
%% External/Integrations
subgraph EXTERNAL [External Systems]
direction TB
x_facr[FAČR API]:::ext
x_youtube[YouTube]:::ext
x_zonerama[Zonerama]:::ext
x_logoapi[logoapi.sportcreative.eu]:::ext
x_sportlogos[sportlogos.tdvorak.dev]:::ext
x_smtp[SMTP / Email]:::ext
x_errrev[Error Review Service]:::ext
end
%% Infra
s_api -->|interceptors, auth, csrf| s_api
%% Service <-> External mappings
s_youtube --> x_youtube
s_zonerama --> x_zonerama
s_facr_api --> x_facr
s_scoreboard --> x_logoapi
s_scoreboard --> x_sportlogos
s_admin_news --> x_smtp
s_settings --> x_errrev
%% Page -> Service dependencies
p_dashboard --> s_analytics
p_dashboard --> s_facr_cache
p_dashboard --> s_api
p_docs --> s_api
p_about --> s_settings
p_about --> s_articles
p_about --> s_api
p_about --> s_ai
p_videos --> s_settings
p_videos --> s_admin_prefetch
p_videos --> s_youtube
p_gallery --> s_api
p_gallery --> s_zonerama
p_merch --> s_clothing
p_sponsors --> s_sponsors
p_sponsors --> s_articles
p_matches --> s_admin_matches
p_matches --> s_settings
p_matches --> s_facr_cache
p_matches --> s_facr_api
p_matches --> s_comp_alias
p_players --> s_players
p_players --> s_image
p_players --> s_articles
p_teams --> s_admin_matches
p_teams --> s_image
p_teams --> s_facr_api
p_teams --> s_scoreboard
p_users --> s_admin_eng
p_users --> s_api
p_banners --> s_banners
p_banners --> s_articles
p_messages --> s_admin_msgs
p_settings --> s_settings
p_settings --> s_seo
p_settings --> s_admin_prefetch
p_settings --> s_articles
p_newsletter --> s_admin_news
p_newsletter --> s_settings
p_polls --> s_polls
p_polls --> s_categories
p_polls --> s_events
p_polls --> s_articles
p_polls --> s_players
p_aliases --> s_comp_alias
p_aliases --> s_api
p_prefetch --> s_admin_prefetch
p_prefetch --> s_api
p_reset --> s_api
p_score --> s_scoreboard
p_score --> s_sponsors
p_score_remote --> s_scoreboard
p_analytics --> s_analytics
p_shortlinks --> s_shortlinks
p_files --> s_files
p_files --> s_api
p_contacts --> s_contacts
p_contacts --> s_settings
p_contacts --> s_image
p_contacts --> s_facr_cache
p_nav --> s_navigation
p_comments --> s_admin_comments
p_comments --> s_comments_pub
p_comments --> s_articles
p_comments --> s_events
p_comments --> s_youtube
p_comments --> s_admin_eng
p_engagement --> s_admin_eng
p_sweep --> s_sweep
p_sweep --> s_articles
p_sweep_visual --> s_sweep
p_sweep_visual --> s_settings
p_articles --> s_articles
p_articles --> s_youtube
p_articles --> s_shortlinks
p_articles --> s_zonerama
p_articles --> s_settings
p_articles --> s_facr_api
p_articles --> s_events
p_articles --> h_autoSave
p_articles --> s_ai
p_activities --> s_events
p_activities --> s_articles
p_activities --> s_youtube
p_activities --> s_settings
p_activities --> s_shortlinks
p_activities --> s_facr_api
p_activities --> h_autoSave
%% Missing simple aliases for a few symbols referenced above
s_sponsors[sponsors.ts]:::svc
s_categories[categories.ts]:::svc
s_comp_alias[competitionAliases.ts]:::svc
%% Legacy pages light mappings
p_errors --> s_errors
p_errors --> s_settings
p_media --> s_files
p_media --> s_image
p_standings --> s_facr_cache
%% UI / Guards dependencies
sidebar --> s_navigation
sidebar --> s_events
sidebar --> s_settings
pr_admin --> s_setup
pr_editor --> s_setup
%% Notes:
%% - All admin pages render AdminLayout which composes Sidebar, Header, Search modal and Support button.
%% - Guards: routes under /admin require admin unless explicitly editor-accessible (/admin/clanky, /admin/aktivity).
%% - Services use Axios instance with interceptors (api.ts), many pages use React Query for data fetching.