Gesamtplanung, Roadmap & Optimierung
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
@startuml
|
||||
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
|
||||
|
||||
' ##################################################################
|
||||
' ### STYLING-DEFINITIONEN ###
|
||||
' ##################################################################
|
||||
|
||||
' Globale Layout-Optionen
|
||||
LAYOUT_TOP_DOWN()
|
||||
|
||||
' Tags für Technologien und Domänen
|
||||
!define DE_SPRING_BOOT "Spring Boot & Kotlin"
|
||||
!define DE_POSTGRES "PostgreSQL DB"
|
||||
!define DE_KAFKA "Apache Kafka"
|
||||
!define DE_REDIS "Redis"
|
||||
!define DE_COMPOSE "Compose Multiplatform"
|
||||
!define DE_KEYCLOAK "Keycloak"
|
||||
!define DE_KTOR "Ktor"
|
||||
!define DE_ZNS_FORMAT "OEPS ZNS (.dat)"
|
||||
!define DE_ERGEBNIS_FORMAT "OEPS Ergebnis (.erg, .xml)"
|
||||
|
||||
skinparam defaultFontName "Segoe UI"
|
||||
skinparam defaultFontSize 12
|
||||
skinparam roundCorner 20
|
||||
skinparam shadowing false
|
||||
|
||||
skinparam person {
|
||||
BackgroundColor #08427b
|
||||
BorderColor #08427b
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam system {
|
||||
BackgroundColor #1168bd
|
||||
BorderColor #1168bd
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam container {
|
||||
BackgroundColor #4284d3
|
||||
BorderColor #4284d3
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam database {
|
||||
BackgroundColor #6c757d
|
||||
BorderColor #6c757d
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 1: SYSTEMKONTEXT-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 1: Systemkontext
|
||||
|
||||
' --- Personen / Akteure ---
|
||||
Person(reiter, "Reiter / Pferdebesitzer", "Nennt für Turniere, verwaltet eigene Daten.")
|
||||
Person(veranstalter, "Veranstalter / Meldestelle", "Organisiert Turniere, managt Nennungen, erfasst Ergebnisse.")
|
||||
Person(admin, "Mandanten-Admin", "Interner Admin von Meldestelle_Pro, verwaltet Kunden & Lizenzen.")
|
||||
Person(parcoursbauer, "Parcours-Bauer", "Entwirft Parcours-Skizzen.")
|
||||
Person(funktionaer, "Funktionär (Richter, Zeitnehmer)", "Nutzt digitale Werkzeuge zur Bewertung und Zeitmessung.")
|
||||
|
||||
' --- Externe Systeme ---
|
||||
System_Ext(oeps_zns, "OEPS ZNS", "Zentrales Nenn-System des OEPS.")
|
||||
System_Ext(zeitmessung, "Zeitmess-Systeme", "Professionelle Hardware (z.B. Alge, Microgate).")
|
||||
System_Ext(email_sms, "E-Mail & SMS Gateway", "Versendet Benachrichtigungen an die Nutzer.")
|
||||
|
||||
' --- Unser System ---
|
||||
System(meldestelle_pro, "Meldestelle_Pro", "Die zentrale Plattform zur Verwaltung und Durchführung von Pferdesport-Veranstaltungen.")
|
||||
|
||||
' --- Beziehungen ---
|
||||
Rel(reiter, meldestelle_pro, "Nennt online, sieht Start- & Ergebnislisten")
|
||||
Rel(veranstalter, meldestelle_pro, "Verwaltet Turniere & Finanzen, nutzt das Live-Cockpit")
|
||||
Rel(admin, meldestelle_pro, "Richtet neue Vereine (Mandanten) ein")
|
||||
Rel(parcoursbauer, meldestelle_pro, "Nutzt das Parcours-Design-Modul (Freemium)")
|
||||
Rel(funktionaer, meldestelle_pro, "Nutzt die Schreiber-App & das Parcours-Cockpit")
|
||||
|
||||
Rel(meldestelle_pro, oeps_zns, "Importiert Stammdaten (.dat), exportiert Ergebnisse (.erg/.xml)", DE_ZNS_FORMAT " / " DE_ERGEBNIS_FORMAT)
|
||||
Rel(meldestelle_pro, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
Rel(meldestelle_pro, email_sms, "Sendet Bestätigungen & Benachrichtigungen", "API")
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 2: CONTAINER-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 2: Container-Diagramm
|
||||
|
||||
' --- Externe Systeme & Personen (aus Level 1 wiederverwenden) ---
|
||||
LAYOUT_LANDSCAPE()
|
||||
reiter -- (0, 10)
|
||||
veranstalter -- (0, 10)
|
||||
admin -- (0, 10)
|
||||
parcoursbauer -- (0, 10)
|
||||
funktionaer -- (0, 10)
|
||||
|
||||
System_Boundary(c1, "Meldestelle_Pro") {
|
||||
|
||||
' --- Client-Anwendungen ---
|
||||
Container(webapp, "Web-Anwendung", DE_COMPOSE, "Bietet Online-Nennung für Reiter und Verwaltungs-Dashboards für Admins/Veranstalter.")
|
||||
Container(desktopapp, "Desktop-Anwendung", DE_COMPOSE, "Offline-fähige 'Pro'-Version für die Meldestelle mit Hardware-Anbindung und vollem Funktionsumfang.")
|
||||
|
||||
' --- API Gateway ---
|
||||
Container(api_gateway, "API Gateway", DE_KTOR, "Zentraler, gesicherter Eingangspunkt für alle API-Anfragen. Leitet Anfragen an die Backend-Services weiter.")
|
||||
|
||||
' --- Datenbanken & Messaging ---
|
||||
ContainerDb(postgres_db, "Relationale Datenbank", DE_POSTGRES, "Speichert die primären Geschäftsdaten (Personen, Pferde, Events etc.). Jeder Service hat ein eigenes, isoliertes Schema.")
|
||||
ContainerDb(redis, "In-Memory Datenspeicher", DE_REDIS, "Dient als High-Performance Cache und als Event Store für das Event Sourcing.")
|
||||
ContainerQueue(kafka, "Message Bus", DE_KAFKA, "Ermöglicht die asynchrone, ereignisgesteuerte Kommunikation zwischen den Services.")
|
||||
|
||||
' --- Unterstützende & Technische Services ---
|
||||
System_Boundary(c3, "Infrastructure Services") {
|
||||
Container(keycloak, "Identity & Access Mgmt", DE_KEYCLOAK, "Zentraler Service für Authentifizierung und Autorisierung (Benutzer-Logins, Rollen).")
|
||||
Container(notification_service, "Notification Service", DE_SPRING_BOOT, "Zentraler Dienst zum Versenden von E-Mails, SMS und Push-Benachrichtigungen. Reagiert auf Events vom Message Bus.")
|
||||
}
|
||||
|
||||
' --- Bounded Contexts / Fach-Microservices ---
|
||||
System_Boundary(c2, "Fachliche Backend Services") {
|
||||
|
||||
package "Stammdaten & Import" {
|
||||
Container(masterdata_service, "Masterdata Service", DE_SPRING_BOOT, "Verwaltet globale Regeln, Lizenzen, Qualifikationen und sportfachliche Definitionen.")
|
||||
Container(zns_import_acl, "ZNS-Import (ACL)", DE_SPRING_BOOT, "Liest und übersetzt die OEPS .dat Dateien in Domänen-Events.")
|
||||
Container(personen_service, "Personen/Pferde Service", DE_SPRING_BOOT, "Verwaltet die Stammdaten von Personen, Pferden und Vereinen.")
|
||||
}
|
||||
|
||||
package "Planung & Abwicklung" {
|
||||
Container(events_service, "Veranstaltungs-Service", DE_SPRING_BOOT, "Verwaltet die Struktur von Veranstaltungen (Dach-Event, Turnier, Bewerb).")
|
||||
Container(nennungs_service, "Nennungs-Service", DE_SPRING_BOOT, "Orchestriert den Nennprozess von der Abgabe bis zur Startliste.")
|
||||
Container(ergebnis_service, "Ergebnis-Service", DE_SPRING_BOOT, "Erfasst, berechnet und exportiert die finalen Ergebnisse.")
|
||||
}
|
||||
|
||||
package "Geschäfts- & Meta-Logik" {
|
||||
Container(tenancy_service, "Mandanten-Service", DE_SPRING_BOOT, "Verwaltet Kunden, Produkte ('Web'/'Pro') und Software-Lizenzen.")
|
||||
Container(billing_service, "Abrechnungs-Service", DE_SPRING_BOOT, "Zentrale Kasse für Nenngelder, Preisgelder und Gebühren.")
|
||||
Container(championship_service, "Serien-Service", DE_SPRING_BOOT, "Verwaltet übergreifende Cups und Meisterschaften.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
' --- Beziehungen Level 2 ---
|
||||
|
||||
' Benutzer -> Frontend / Gateway
|
||||
Rel(reiter, webapp, "Nutzt")
|
||||
Rel(veranstalter, webapp, "Nutzt")
|
||||
Rel(veranstalter, desktopapp, "Nutzt")
|
||||
Rel(admin, webapp, "Nutzt")
|
||||
Rel(parcoursbauer, webapp, "Nutzt")
|
||||
Rel(funktionaer, desktopapp, "Nutzt")
|
||||
|
||||
Rel(webapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
Rel(desktopapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
|
||||
' Gateway -> Backend
|
||||
Rel(api_gateway, nennungs_service, "Leitet Anfragen weiter")
|
||||
' ... (weitere Relationen vom Gateway zu den anderen Fach-Services)
|
||||
|
||||
' Authentifizierung
|
||||
Rel(api_gateway, keycloak, "Validiert JWT Token")
|
||||
Rel(webapp, keycloak, "Authentifiziert Benutzer", "OAuth2")
|
||||
Rel(desktopapp, keycloak, "Authentifiziert Benutzer", "OAuth2")
|
||||
|
||||
' Datenbank-Zugriffe
|
||||
Rel(nennungs_service, postgres_db, "Liest/Schreibt", "JDBC")
|
||||
' ... (weitere Relationen von den anderen Fach-Services zur DB)
|
||||
|
||||
' Asynchrone Kommunikation via Kafka
|
||||
Rel(nennungs_service, kafka, "Publiziert 'NennungEingereicht' Event")
|
||||
Rel(billing_service, kafka, "Publiziert 'RechnungErstellt' Event")
|
||||
|
||||
' NEU: Der Notification Service reagiert auf Events
|
||||
Rel(kafka, notification_service, "Konsumiert fachliche Events")
|
||||
Rel(notification_service, email_sms, "Sendet Nachricht via", "API")
|
||||
Rel(notification_service, personen_service, "Holt Kontaktdaten", "HTTPS/JSON")
|
||||
|
||||
' Hardware Anbindung
|
||||
Rel(desktopapp, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
|
||||
@enduml
|
||||
@@ -0,0 +1,173 @@
|
||||
@startuml
|
||||
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
|
||||
|
||||
' ##################################################################
|
||||
' ### STYLING-DEFINITIONEN ###
|
||||
' ##################################################################
|
||||
|
||||
' Globale Layout-Optionen
|
||||
LAYOUT_TOP_DOWN()
|
||||
|
||||
' Tags für Technologien und Domänen
|
||||
!define DE_SPRING_BOOT "Spring Boot & Kotlin"
|
||||
!define DE_POSTGRES "PostgreSQL DB"
|
||||
!define DE_KAFKA "Apache Kafka"
|
||||
!define DE_REDIS "Redis"
|
||||
!define DE_COMPOSE "Compose Multiplatform"
|
||||
!define DE_KEYCLOAK "Keycloak"
|
||||
!define DE_KTOR "Ktor"
|
||||
!define DE_ZNS_FORMAT "OEPS ZNS (.dat)"
|
||||
!define DE_ERGEBNIS_FORMAT "OEPS Ergebnis (.erg, .xml)"
|
||||
|
||||
skinparam defaultFontName "Segoe UI"
|
||||
skinparam defaultFontSize 12
|
||||
skinparam roundCorner 20
|
||||
skinparam shadowing false
|
||||
|
||||
skinparam person {
|
||||
BackgroundColor #08427b
|
||||
BorderColor #08427b
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam system {
|
||||
BackgroundColor #1168bd
|
||||
BorderColor #1168bd
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam container {
|
||||
BackgroundColor #4284d3
|
||||
BorderColor #4284d3
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam database {
|
||||
BackgroundColor #6c757d
|
||||
BorderColor #6c757d
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 1: SYSTEMKONTEXT-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 1: Systemkontext
|
||||
|
||||
' --- Personen / Akteure ---
|
||||
Person(reiter, "Reiter / Pferdebesitzer", "Nennt für Turniere, verwaltet eigene Daten.")
|
||||
Person(veranstalter, "Veranstalter / Meldestelle", "Organisiert Turniere, druckt Listen, erfasst Ergebnisse.")
|
||||
Person(admin, "Mandanten-Admin", "Interner Admin von Meldestelle_Pro, verwaltet Kunden & Lizenzen.")
|
||||
Person(parcoursbauer, "Parcours-Bauer", "Entwirft Parcours-Skizzen.")
|
||||
Person(funktionaer, "Funktionär (Richter, Zeitnehmer)", "Nutzt digitale Werkzeuge zur Bewertung und Zeitmessung.")
|
||||
|
||||
' --- Externe Systeme ---
|
||||
System_Ext(oeps_zns, "OEPS ZNS", "Zentrales Nenn-System des OEPS.")
|
||||
System_Ext(zeitmessung, "Zeitmess-Systeme", "Professionelle Hardware (z.B. Alge, Microgate).")
|
||||
System_Ext(email_sms, "E-Mail & SMS Gateway", "Versendet Benachrichtigungen an die Nutzer.")
|
||||
|
||||
' --- Unser System ---
|
||||
System(meldestelle_pro, "Meldestelle_Pro", "Die zentrale Plattform zur Verwaltung und Durchführung von Pferdesport-Veranstaltungen.")
|
||||
|
||||
' --- Beziehungen ---
|
||||
Rel(reiter, meldestelle_pro, "Nennt online, sieht Start- & Ergebnislisten")
|
||||
Rel(veranstalter, meldestelle_pro, "Verwaltet Turniere, druckt Dokumente, nutzt das Live-Cockpit")
|
||||
Rel(admin, meldestelle_pro, "Richtet neue Vereine (Mandanten) ein")
|
||||
Rel(parcoursbauer, meldestelle_pro, "Nutzt das Parcours-Design-Modul (Freemium)")
|
||||
Rel(funktionaer, meldestelle_pro, "Nutzt die Schreiber-App & das Parcours-Cockpit")
|
||||
|
||||
Rel(meldestelle_pro, oeps_zns, "Importiert Stammdaten (.dat), exportiert Ergebnisse (.erg/.xml)", DE_ZNS_FORMAT " / " DE_ERGEBNIS_FORMAT)
|
||||
Rel(meldestelle_pro, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
Rel(meldestelle_pro, email_sms, "Sendet Bestätigungen & Benachrichtigungen", "API")
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 2: CONTAINER-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 2: Container-Diagramm
|
||||
|
||||
' --- Externe Systeme & Personen (aus Level 1 wiederverwenden) ---
|
||||
LAYOUT_LANDSCAPE()
|
||||
reiter -- (0, 10)
|
||||
veranstalter -- (0, 10)
|
||||
admin -- (0, 10)
|
||||
parcoursbauer -- (0, 10)
|
||||
funktionaer -- (0, 10)
|
||||
|
||||
System_Boundary(c1, "Meldestelle_Pro") {
|
||||
|
||||
' --- Client-Anwendungen ---
|
||||
Container(webapp, "Web-Anwendung", DE_COMPOSE, "Bietet Online-Nennung für Reiter und Verwaltungs-Dashboards für Admins/Veranstalter.")
|
||||
Container(desktopapp, "Desktop-Anwendung", DE_COMPOSE, "Offline-fähige 'Pro'-Version für die Meldestelle mit Hardware-Anbindung und vollem Funktionsumfang.")
|
||||
|
||||
' --- API Gateway ---
|
||||
Container(api_gateway, "API Gateway", DE_KTOR, "Zentraler, gesicherter Eingangspunkt für alle API-Anfragen. Leitet Anfragen an die Backend-Services weiter.")
|
||||
|
||||
' --- Datenbanken & Messaging ---
|
||||
ContainerDb(postgres_db, "Relationale Datenbank", DE_POSTGRES, "Speichert die primären Geschäftsdaten (Personen, Pferde, Events etc.). Jeder Service hat ein eigenes, isoliertes Schema.")
|
||||
ContainerDb(redis, "In-Memory Datenspeicher", DE_REDIS, "Dient als High-Performance Cache und als Event Store für das Event Sourcing.")
|
||||
ContainerQueue(kafka, "Message Bus", DE_KAFKA, "Ermöglicht die asynchrone, ereignisgesteuerte Kommunikation zwischen den Services.")
|
||||
|
||||
' --- Unterstützende & Technische Services ---
|
||||
System_Boundary(c3, "Infrastructure Services") {
|
||||
Container(keycloak, "Identity & Access Mgmt", DE_KEYCLOAK, "Zentraler Service für Authentifizierung und Autorisierung (Benutzer-Logins, Rollen).")
|
||||
Container(notification_service, "Notification Service", DE_SPRING_BOOT, "Zentraler Dienst zum Versenden von E-Mails, SMS etc. Reagiert auf Events vom Message Bus.")
|
||||
Container(docgen_service, "Document Generation Service", DE_SPRING_BOOT, "Zentraler Dienst zur Erstellung von Dokumenten (PDF, CSV etc.) aus Vorlagen.")
|
||||
}
|
||||
|
||||
' --- Bounded Contexts / Fach-Microservices ---
|
||||
System_Boundary(c2, "Fachliche Backend Services") {
|
||||
Container(personen_service, "Personen/Pferde Service", DE_SPRING_BOOT, "Verwaltet die Stammdaten von Personen, Pferden und Vereinen.")
|
||||
Container(events_service, "Veranstaltungs-Service", DE_SPRING_BOOT, "Verwaltet die Struktur von Veranstaltungen (Dach-Event, Turnier, Bewerb).")
|
||||
Container(nennungs_service, "Nennungs-Service", DE_SPRING_BOOT, "Orchestriert den Nennprozess von der Abgabe bis zur Startliste.")
|
||||
Container(ergebnis_service, "Ergebnis-Service", DE_SPRING_BOOT, "Erfasst, berechnet und exportiert die finalen Ergebnisse.")
|
||||
Container(billing_service, "Abrechnungs-Service", DE_SPRING_BOOT, "Zentrale Kasse für Nenngelder, Preisgelder und Gebühren.")
|
||||
' ... weitere fachliche Services ...
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
' --- Beziehungen Level 2 ---
|
||||
|
||||
' Benutzer -> Frontend / Gateway
|
||||
Rel(reiter, webapp, "Nutzt")
|
||||
Rel(veranstalter, webapp, "Nutzt")
|
||||
Rel(veranstalter, desktopapp, "Nutzt")
|
||||
' ... weitere User-Relationen ...
|
||||
|
||||
Rel(webapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
Rel(desktopapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
|
||||
' Gateway -> Backend
|
||||
Rel(api_gateway, nennungs_service, "Leitet Anfragen weiter")
|
||||
Rel(api_gateway, ergebnis_service, "Leitet Anfragen weiter")
|
||||
Rel(api_gateway, docgen_service, "Leitet Anfragen zum Dokumenten-Download weiter") ' NEU
|
||||
' ... (weitere Relationen vom Gateway zu den anderen Fach-Services)
|
||||
|
||||
' Authentifizierung
|
||||
Rel(api_gateway, keycloak, "Validiert JWT Token")
|
||||
|
||||
' Datenbank-Zugriffe
|
||||
Rel(nennungs_service, postgres_db, "Liest/Schreibt", "JDBC")
|
||||
Rel(ergebnis_service, postgres_db, "Liest/Schreibt", "JDBC")
|
||||
' ... (weitere Relationen von den anderen Fach-Services zur DB)
|
||||
|
||||
' Asynchrone Kommunikation via Kafka
|
||||
Rel(nennungs_service, kafka, "Publiziert 'NennungEingereicht' Event")
|
||||
Rel(kafka, notification_service, "Konsumiert 'NennungEingereicht' Event")
|
||||
Rel(notification_service, email_sms, "Sendet Bestätigungs-Mail via", "API")
|
||||
|
||||
' NEU: Beziehungen für den Document-Generation-Service
|
||||
Rel(ergebnis_service, docgen_service, "Fordert Ergebnislisten-PDF an", "HTTPS/JSON")
|
||||
Rel(billing_service, docgen_service, "Fordert Rechnungs-PDF an", "HTTPS/JSON")
|
||||
Rel(docgen_service, ergebnis_service, "Holt Ergebnisdaten", "HTTPS/JSON")
|
||||
Rel(docgen_service, events_service, "Holt Veranstaltungs-Stammdaten", "HTTPS/JSON")
|
||||
|
||||
' Hardware Anbindung
|
||||
Rel(desktopapp, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
|
||||
@enduml
|
||||
@@ -0,0 +1,184 @@
|
||||
@startuml
|
||||
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml
|
||||
|
||||
' ##################################################################
|
||||
' ### STYLING-DEFINITIONEN ###
|
||||
' ##################################################################
|
||||
|
||||
' Globale Layout-Optionen
|
||||
LAYOUT_TOP_DOWN()
|
||||
|
||||
' Tags für Technologien und Domänen
|
||||
!define DE_SPRING_BOOT "Spring Boot & Kotlin"
|
||||
!define DE_POSTGRES "PostgreSQL DB"
|
||||
!define DE_KAFKA "Apache Kafka"
|
||||
!define DE_REDIS "Redis"
|
||||
!define DE_COMPOSE "Compose Multiplatform"
|
||||
!define DE_KEYCLOAK "Keycloak"
|
||||
!define DE_KTOR "Ktor"
|
||||
!define DE_ZNS_FORMAT "OEPS ZNS (.dat)"
|
||||
!define DE_ERGEBNIS_FORMAT "OEPS Ergebnis (.erg, .xml)"
|
||||
|
||||
skinparam defaultFontName "Segoe UI"
|
||||
skinparam defaultFontSize 12
|
||||
skinparam roundCorner 20
|
||||
skinparam shadowing false
|
||||
|
||||
skinparam person {
|
||||
BackgroundColor #08427b
|
||||
BorderColor #08427b
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam system {
|
||||
BackgroundColor #1168bd
|
||||
BorderColor #1168bd
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam container {
|
||||
BackgroundColor #4284d3
|
||||
BorderColor #4284d3
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
skinparam database {
|
||||
BackgroundColor #6c757d
|
||||
BorderColor #6c757d
|
||||
FontColor #FFFFFF
|
||||
StereotypeFontColor #FFFFFF
|
||||
}
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 1: SYSTEMKONTEXT-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 1: Systemkontext
|
||||
|
||||
' --- Personen / Akteure ---
|
||||
Person(reiter, "Reiter / Pferdebesitzer", "Nennt für Turniere, verwaltet eigene Daten.")
|
||||
Person(veranstalter, "Veranstalter / Meldestelle", "Organisiert Turniere, druckt Listen, erfasst Ergebnisse.")
|
||||
Person(admin, "Mandanten-Admin", "Interner Admin von Meldestelle_Pro, verwaltet Kunden & Lizenzen.")
|
||||
Person(parcoursbauer, "Parcours-Bauer", "Entwirft Parcours-Skizzen.")
|
||||
Person(funktionaer, "Funktionär (Richter, Zeitnehmer)", "Nutzt digitale Werkzeuge zur Bewertung und Zeitmessung.")
|
||||
|
||||
' --- Externe Systeme ---
|
||||
System_Ext(oeps_zns, "OEPS ZNS", "Zentrales Nenn-System des OEPS.")
|
||||
System_Ext(zeitmessung, "Zeitmess-Systeme", "Professionelle Hardware (z.B. Alge, Microgate).")
|
||||
System_Ext(email_sms, "E-Mail & SMS Gateway", "Versendet Benachrichtigungen an die Nutzer.")
|
||||
|
||||
' --- Unser System ---
|
||||
System(meldestelle_pro, "Meldestelle_Pro", "Die zentrale Plattform zur Verwaltung und Durchführung von Pferdesport-Veranstaltungen.")
|
||||
|
||||
' --- Beziehungen ---
|
||||
Rel(reiter, meldestelle_pro, "Nennt online, sieht Start- & Ergebnislisten")
|
||||
Rel(veranstalter, meldestelle_pro, "Verwaltet Turniere, druckt Dokumente, nutzt das Live-Cockpit")
|
||||
Rel(admin, meldestelle_pro, "Richtet neue Vereine (Mandanten) ein")
|
||||
Rel(parcoursbauer, meldestelle_pro, "Nutzt das Parcours-Design-Modul (Freemium)")
|
||||
Rel(funktionaer, meldestelle_pro, "Nutzt die Schreiber-App & das Parcours-Cockpit")
|
||||
|
||||
Rel(meldestelle_pro, oeps_zns, "Importiert Stammdaten (.dat), exportiert Ergebnisse (.erg/.xml)", DE_ZNS_FORMAT " / " DE_ERGEBNIS_FORMAT)
|
||||
Rel(meldestelle_pro, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
Rel(meldestelle_pro, email_sms, "Sendet Bestätigungen & Benachrichtigungen", "API")
|
||||
|
||||
' ##################################################################
|
||||
' ### LEVEL 2: CONTAINER-DIAGRAMM ###
|
||||
' ##################################################################
|
||||
|
||||
title Meldestelle_Pro - C4 Level 2: Container-Diagramm (Finales Zielmodell)
|
||||
|
||||
' --- Externe Systeme & Personen (aus Level 1 wiederverwenden) ---
|
||||
LAYOUT_LANDSCAPE()
|
||||
reiter -- (0, 10)
|
||||
veranstalter -- (0, 10)
|
||||
admin -- (0, 10)
|
||||
parcoursbauer -- (0, 10)
|
||||
funktionaer -- (0, 10)
|
||||
|
||||
System_Boundary(c1, "Meldestelle_Pro") {
|
||||
|
||||
' --- Client-Anwendungen ---
|
||||
Container(webapp, "Web-Anwendung", DE_COMPOSE, "Bietet Online-Nennung, Dashboards und das Freemium Parcours-Design-Modul.")
|
||||
Container(desktopapp, "Desktop-Anwendung", DE_COMPOSE, "Offline-fähige 'Pro'-Version für die Meldestelle mit Hardware-Anbindung und Live-Turnier-Cockpit.")
|
||||
|
||||
' --- API Gateway ---
|
||||
Container(api_gateway, "API Gateway", DE_KTOR, "Zentraler, gesicherter Eingangspunkt für alle API-Anfragen. Leitet Anfragen an die Backend-Services weiter.")
|
||||
|
||||
' --- Gemeinsame Daten-Infrastruktur ---
|
||||
ContainerDb(postgres_db, "Relationale Datenbank", DE_POSTGRES, "Speichert die primären Geschäftsdaten. Jeder Fach-Service hat ein eigenes, isoliertes Schema.")
|
||||
ContainerDb(redis, "In-Memory Datenspeicher", DE_REDIS, "Dient als High-Performance Cache und als Event Store für das Event Sourcing.")
|
||||
ContainerQueue(kafka, "Message Bus", DE_KAFKA, "Ermöglicht die asynchrone, ereignisgesteuerte Kommunikation zwischen den Services.")
|
||||
|
||||
' --- Technische Infrastruktur-Services ---
|
||||
System_Boundary(c3, "Infrastructure Services") {
|
||||
Container(keycloak, "Identity & Access Mgmt", DE_KEYCLOAK, "Zentraler Service für Authentifizierung und Autorisierung.")
|
||||
Container(notification_service, "Notification Service", DE_SPRING_BOOT, "Zentraler Dienst zum Versenden von E-Mails, SMS etc. Reagiert auf Events vom Message Bus.")
|
||||
Container(docgen_service, "Document Generation Service", DE_SPRING_BOOT, "Zentraler Dienst zur Erstellung von Dokumenten (PDF, CSV etc.) aus Vorlagen.")
|
||||
}
|
||||
|
||||
' --- Bounded Contexts / Fach-Microservices ---
|
||||
System_Boundary(c2, "Fachliche Backend Services") {
|
||||
Container(masterdata_service, "Masterdata Service", DE_SPRING_BOOT, "BC1: Verwaltet globale Regelwerke, Lizenztypen und sportfachliche Definitionen (ÖTO/FEI).")
|
||||
Container(zns_import_acl, "ZNS-Import (ACL)", DE_SPRING_BOOT, "BC10: Liest und übersetzt die OEPS .dat Dateien in Domänen-Events.")
|
||||
Container(personen_service, "Personen/Pferde Service", DE_SPRING_BOOT, "BC2/BC3: Verwaltet Stammdaten von Personen, Pferden, Vereinen, Lizenzen & Qualifikationen.")
|
||||
Container(events_service, "Veranstaltungs-Service", DE_SPRING_BOOT, "BC4: Modelliert die hierarchische Struktur von Veranstaltungen (Dach-Event -> Turnier-Mandat -> Bewerb).")
|
||||
Container(tenancy_service, "Mandanten-Service", DE_SPRING_BOOT, "BC5: Verwaltet Kunden (Mandanten), Produkte ('Web'/'Pro') und Software-Lizenzen.")
|
||||
Container(nennungs_service, "Nennungs-Service", DE_SPRING_BOOT, "BC6: Orchestriert den Nennprozess von der Abgabe bis zur Startliste, inkl. Validierung.")
|
||||
Container(billing_service, "Abrechnungs-Service", DE_SPRING_BOOT, "BC7: Zentrale Kasse für Nenngelder, Preisgelder und Gebühren. Garantiert getrennte Kassenführung.")
|
||||
Container(ergebnis_service, "Ergebnis-Service", DE_SPRING_BOOT, "BC8: Erfasst, berechnet und exportiert die finalen Ergebnisse im offiziellen OEPS-Format.")
|
||||
Container(championship_service, "Serien-Service", DE_SPRING_BOOT, "BC9: Verwaltet übergreifende Cups und Meisterschaften.")
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
' --- Beziehungen Level 2 ---
|
||||
|
||||
' Benutzer -> Frontend / Gateway
|
||||
Rel(reiter, webapp, "Nutzt")
|
||||
Rel(veranstalter, webapp, "Nutzt")
|
||||
Rel(veranstalter, desktopapp, "Nutzt")
|
||||
Rel(admin, webapp, "Nutzt")
|
||||
Rel(parcoursbauer, webapp, "Nutzt")
|
||||
Rel(funktionaer, desktopapp, "Nutzt")
|
||||
|
||||
Rel(webapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
Rel(desktopapp, api_gateway, "Macht API-Aufrufe", "HTTPS/JSON")
|
||||
|
||||
' Gateway -> Backend
|
||||
Rel(api_gateway, nennungs_service, "Leitet Anfragen weiter")
|
||||
Rel(api_gateway, ergebnis_service, "Leitet Anfragen weiter")
|
||||
Rel(api_gateway, docgen_service, "Leitet Anfragen zum Dokumenten-Download weiter")
|
||||
' ... (weitere Relationen vom Gateway zu den anderen Fach-Services sind implizit)
|
||||
|
||||
' Authentifizierung
|
||||
Rel(api_gateway, keycloak, "Validiert JWT Token")
|
||||
Rel(keycloak, tenancy_service, "Holt Feature-Set für Token", "HTTPS/JSON")
|
||||
|
||||
' Datenbank-Zugriffe
|
||||
Rel(nennungs_service, postgres_db, "Liest/Schreibt", "JDBC")
|
||||
Rel(ergebnis_service, postgres_db, "Liest/Schreibt", "JDBC")
|
||||
' ... (jeder Fach-Service greift auf sein eigenes Schema in der DB zu)
|
||||
|
||||
' Asynchrone Kommunikation via Kafka (Beispiele)
|
||||
Rel(zns_import_acl, kafka, "Publiziert 'StammdatenAktualisiert' Events")
|
||||
Rel(personen_service, kafka, "Subscribed Events von ZNS-Import")
|
||||
Rel(nennungs_service, kafka, "Publiziert 'NennungEingereicht' & 'StartlisteFinalisiert' Events")
|
||||
Rel(ergebnis_service, kafka, "Subscribed 'StartlisteFinalisiert', Publiziert 'ErgebnisFinalisiert' Event")
|
||||
Rel(kafka, notification_service, "Konsumiert fachliche Events (z.B. 'NennungEingereicht')")
|
||||
Rel(kafka, billing_service, "Konsumiert Events (z.B. 'NennungEingereicht') zur Gebührenerstellung")
|
||||
Rel(kafka, championship_service, "Konsumiert 'ErgebnisFinalisiert' Event für Cup-Wertung")
|
||||
|
||||
|
||||
' Beziehungen der Infrastruktur-Services
|
||||
Rel(notification_service, email_sms, "Sendet Nachricht via", "API")
|
||||
Rel(notification_service, personen_service, "Holt Kontaktdaten", "HTTPS/JSON")
|
||||
Rel(ergebnis_service, docgen_service, "Fordert Ergebnislisten-PDF an", "HTTPS/JSON")
|
||||
Rel(docgen_service, ergebnis_service, "Holt Ergebnisdaten", "HTTPS/JSON")
|
||||
|
||||
' Hardware Anbindung
|
||||
Rel(desktopapp, zeitmessung, "Empfängt Zeit-Signale", "Serielle Schnittstelle / USB")
|
||||
|
||||
@enduml
|
||||
@@ -0,0 +1,108 @@
|
||||
# Strategiepapier: Meldestelle_Pro - Gesamtplanung, Roadmap & Optimierung
|
||||
|
||||
**Datum:** 27. Juli 2025
|
||||
**Status:** Finalisiert & zur Umsetzung freigegeben
|
||||
|
||||
## 1. Vision & Architektonische Grundpfeiler
|
||||
|
||||
Dieses Dokument ist die zentrale Blaupause für die Entwicklung des Projekts **"Meldestelle_Pro"**.
|
||||
|
||||
**Die Vision:** Meldestelle_Pro wird die führende digitale Plattform für die Verwaltung und Durchführung von Pferdesport-Veranstaltungen in Österreich. Das System wird nicht nur die komplexen Regularien der ÖTO und FEI korrekt abbilden, sondern durch intelligente, integrierte Werkzeuge die Arbeit für Veranstalter, Funktionäre und Teilnehmer revolutionieren und durch innovative Zusatzmodule wie das **Parcours-Design-Programm** einen einzigartigen Mehrwert schaffen.
|
||||
|
||||
Die Grundlage dafür ist eine moderne Software-Architektur, die auf folgenden Prinzipien beruht:
|
||||
* **Modulare Microservice-Architektur**
|
||||
* **Domain-Driven Design (DDD)**
|
||||
* **Ereignisgesteuerte Kommunikation**
|
||||
* **Multiplattform-Client-Strategie**
|
||||
|
||||
---
|
||||
|
||||
## 2. Das finale Zieldomänen-Modell (DDD Context Map)
|
||||
|
||||
Das System wird in die folgenden, klar abgegrenzten **Bounded Contexts (Domänen)** gegliedert. Fachliche Domänen werden als eigenständige Microservices implementiert, technische Fähigkeiten als zentrale Infrastruktur-Services.
|
||||
|
||||
### 2.1 Fachliche Domänen (Microservices)
|
||||
|
||||
* **BC1: OeTO-Verwaltung (Masterdata-Service):** Die "Quelle der Wahrheit" für alle globalen Regelwerke.
|
||||
* **BC2: Sportler, Pferde & Vereine (z.B. `members-` & `horses-service`):** Verwalten die Stammdaten aller Akteure.
|
||||
* **BC3: Lizenzen & Qualifikationen (`licensing-service`):** Verwaltet die sportlichen Berechtigungen einer Person.
|
||||
* **BC4: Veranstaltungsplanung (`events-service`):** Modelliert die hierarchische Struktur von Veranstaltungen (`Dach-Veranstaltung` -> `Turnier-Mandat` -> `Bewerb`).
|
||||
* **BC5: Mandanten- & Lizenz-Verwaltung (`tenancy-service`):** Steuert das Geschäftsmodell und den Software-Zugriff.
|
||||
* **BC6: Nennungsabwicklung (`nennungs-service`):** Das operative Herzstück für Nennung, Validierung und Startlisten.
|
||||
* **BC7: Abrechnung & Finanzen (`billing-service`):** Die zentrale Kasse für eine strikt getrennte Kassenführung.
|
||||
* **BC8: Ergebnisdienst (`result-service`):** Erfasst, berechnet und exportiert Ergebnisse.
|
||||
* **BC9: Serien-Verwaltung (`championship-service`):** Verwaltet übergeordnete Cups und Meisterschaften.
|
||||
|
||||
### 2.2 Technische & Infrastruktur-Domänen (Technische Services)
|
||||
|
||||
* **BC10: ZNS-Import (Anti-Corruption-Layer):** Isoliert das System von den OEPS-Rohdatenformaten.
|
||||
* **BC11: Notification-Service:** Zentraler Dienst zum Versenden von E-Mails, SMS und Push-Benachrichtigungen.
|
||||
* **BC12: Document-Generation-Service:** Zentraler Dienst zur Erstellung von Dokumenten (PDF, CSV, XML etc.).
|
||||
|
||||
---
|
||||
|
||||
## 3. Agile Entwicklungs-Roadmap
|
||||
|
||||
Wir verfolgen einen agilen, iterativen Ansatz. Jeder Zyklus liefert ein funktionierendes, in der Praxis testbares Produkt.
|
||||
|
||||
### Zyklus 1: MVP für C/C-Neu Turniere (Dressur & Springen)
|
||||
* **Ziel:** Ein voll funktionsfähiges End-to-End-System für den am weitesten verbreiteten Turniertyp, um schnelles Feedback aus "Feld-Versuchen" zu erhalten.
|
||||
* **Kern-Features:**
|
||||
* **Stammdaten & Import:** Implementierung der `Masterdata`-Regeln für Klassen E-LM und des `ZNS-Imports`.
|
||||
* **Veranstaltungsplanung:** "Event-Setup-Wizard" für C/C-Neu Turniere.
|
||||
* **Nennungsabwicklung:** Online-Nennung, Validierung für C-Turnier-Lizenzen, Erstellung von `Startlisten`.
|
||||
* **Abrechnung:** Verbuchung von `Nenngeld` und `Startgeld`.
|
||||
* **Ergebnisdienst:** Manuelle Eingabe für "gemeinsames Richten" (Dressur) und "Standardspringen" (Springen). Finaler Export im dualen Format (`.erg` und `.erg.xml`).
|
||||
* **Meta-Thema & Optimierung:**
|
||||
* **Konzept:** Ausarbeitung der Strategie für die **Daten-Aktualisierung & Synchronisation**.
|
||||
* **Implementierung:** Etablierung einer robusten **Logging-Strategie** im gesamten System.
|
||||
|
||||
### Zyklus 2: Erweiterung für B/A-Turniere & Professionalisierung
|
||||
* **Ziel:** Abbildung der komplexeren Regeln höherer Turnierkategorien und Automatisierung von Prozessen.
|
||||
* **Kern-Features:**
|
||||
* **Masterdata:** Erweiterung um Regeln für Klassen M und S und komplexe Lizenz-Höherreihungs-Logik.
|
||||
* **Springreiten-Bewertung:** Anbindung externer Zeitmessgeräte über die "Hardware-Adapter-Schicht".
|
||||
* **Dressur-Bewertung:** Implementierung des "getrennten Richtens".
|
||||
* **Abrechnung & Finanzen:** Implementierung der korrekten Preisgeldberechnung gemäß ÖTO.
|
||||
* **Client-App:** Entwicklung des **"Live-Turnier-Cockpits"** für die Meldestelle.
|
||||
* **Meta-Thema & Optimierung:**
|
||||
* **Implementierung:** Umsetzung der **Benutzerverwaltung für Veranstalter** (Onboarding-Prozess).
|
||||
* **Implementierung:** Einführung von **Resilience Patterns** (Retry, Circuit Breaker) für eine stabilere Service-Kommunikation.
|
||||
* **Vorbereitung:** Proaktive **Datenbank-Performance-Optimierung** für die größeren Datenmengen von A/B-Turnieren.
|
||||
|
||||
### Zyklus 3 & darüber hinaus: Ökosystem & Wachstum
|
||||
* **Ziel:** Das System um strategische Module zur Kundenbindung und -gewinnung erweitern.
|
||||
* **Kern-Features:**
|
||||
* **Parcours-Design-Modul:** Entwicklung des visuellen Editors als **"Freemium"-Standalone-Tool**, um Parcours-Bauer als neue Nutzergruppe und Multiplikatoren zu gewinnen.
|
||||
* **Serien-Verwaltung:** Implementierung des `championship-service` für Cups und Meisterschaften.
|
||||
* **Erweiterung der Sparten:** Schrittweise Implementierung der Logiken für Vielseitigkeit, Fahren etc.
|
||||
* **Meta-Themen & Optimierung:**
|
||||
* **Implementierung:** Umsetzung des **Funktionärs-Managements** und der **Reporting & Analyse-Komponente**.
|
||||
* **Implementierung:** Einführung von **Echtzeit-Updates mit WebSockets**.
|
||||
* **Vorbereitung:** Evaluierung von **GraphQL** und Vorbereitung des Deployments auf **Kubernetes**.
|
||||
|
||||
---
|
||||
|
||||
## 4. Übergreifende Optimierungs-Strategie (TODO)
|
||||
|
||||
Parallel zur Feature-Entwicklung verfolgen wir eine kontinuierliche Optimierungsstrategie.
|
||||
|
||||
### 4.1 Developer Experience (DevEx) & Code-Qualität
|
||||
* **Ziel:** Die Effizienz, Qualität und Wartbarkeit der Softwareentwicklung maximieren.
|
||||
* **Maßnahmen:**
|
||||
- **[ ] Logging-Strategie implementieren:** Ein zentrales, strukturiertes Logging-Framework etablieren.
|
||||
- **[ ] Contract Testing einführen:** Automatische Prüfung der Service-Kompatibilität in der CI/CD-Pipeline.
|
||||
- **[ ] Resilience Patterns implementieren:** Das System mit "Retry"- und "Circuit Breaker"-Mustern widerstandsfähiger machen.
|
||||
|
||||
### 4.2 Betrieb & Performance
|
||||
* **Ziel:** Ein schnelles, sicheres und zuverlässiges System im Live-Betrieb gewährleisten.
|
||||
* **Maßnahmen:**
|
||||
- **[ ] Advanced Caching-Strategien umsetzen:** "Cache Warming" und aktives Monitoring der Cache-Effizienz.
|
||||
- **[ ] Datenbank-Performance proaktiv optimieren:** Regelmäßige Analyse von SQL-Abfragen und Index-Optimierung.
|
||||
- **[ ] Deployment auf Kubernetes vorbereiten:** Erstellung von Helm-Charts und Definition einer "Rolling Update"-Strategie für ausfallsfreie Updates.
|
||||
|
||||
### 4.3 Strategische & Zukünftige Technologien
|
||||
* **Ziel:** Die technologische Basis für zukünftige Anforderungen und Skalierbarkeit schaffen.
|
||||
* **Maßnahmen:**
|
||||
- **[ ] Echtzeit-Updates mit WebSockets implementieren:** Für das "Live-Turnier-Cockpit" und Live-Ergebnisse.
|
||||
- **[ ] GraphQL als API-Alternative evaluieren:** Um die Datenabfragen für zukünftige mobile Clients zu optimieren.
|
||||
Reference in New Issue
Block a user