From c4d630d63c943d1fa352dc5c2fb41b69d1db6524 Mon Sep 17 00:00:00 2001 From: kevin Date: Fri, 7 Nov 2025 20:20:46 +0000 Subject: [PATCH 1/7] usecases.md aktualisiert UC Kinostatistik anzeigen angepasst --- usecases.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/usecases.md b/usecases.md index bef08d3..d339b67 100644 --- a/usecases.md +++ b/usecases.md @@ -29,10 +29,10 @@ Ein Mitarbeiter kann beim Einlass das Ticket eines Kunden kontrollieren. Dazu is Der Kinoinhaber kann sich Statistiken (gesamt, pro Vorstellung oder pro Film) zu seinem Kinobetrieb anzeigen lassen. \ Dazu gehören unter anderem: -* Besucheranzahl * Einnahmen * Anzahl reservierter/gebuchter Sitzplätze -* Beliebteste Filme basierend auf Besucheranzahlen +* Beliebteste Filme basierend auf gebuchten Sitzplätzen +
From 76fee7b729c5abc90dfc0d4e8cb05e73b71e0c79 Mon Sep 17 00:00:00 2001 From: lennart Date: Thu, 13 Nov 2025 19:21:30 +0000 Subject: [PATCH 2/7] usecases.md aktualisiert --- usecases.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/usecases.md b/usecases.md index d339b67..3fbf238 100644 --- a/usecases.md +++ b/usecases.md @@ -27,11 +27,11 @@ Ein Mitarbeiter kann beim Einlass das Ticket eines Kunden kontrollieren. Dazu is ### 🟥 Kinostatistik anzeigen -Der Kinoinhaber kann sich Statistiken (gesamt, pro Vorstellung oder pro Film) zu seinem Kinobetrieb anzeigen lassen. \ +Der Kinoinhaber kann sich Statistiken (~~gesamt,~~ pro Vorstellung oder pro Film) zu seinem Kinobetrieb anzeigen lassen. \ Dazu gehören unter anderem: -* Einnahmen +* Einnahmen * Anzahl reservierter/gebuchter Sitzplätze -* Beliebteste Filme basierend auf gebuchten Sitzplätzen +* ~~Beliebteste Filme basierend auf gebuchten Sitzplätzen~~
From 3bba05ff61932be47cceed2bcd39b6a134f3e3c5 Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Fri, 21 Nov 2025 22:05:11 +0100 Subject: [PATCH 3/7] messaging sequence diagram --- plantuml/messaging-sequence.puml | 104 +++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 plantuml/messaging-sequence.puml diff --git a/plantuml/messaging-sequence.puml b/plantuml/messaging-sequence.puml new file mode 100644 index 0000000..bd7a67e --- /dev/null +++ b/plantuml/messaging-sequence.puml @@ -0,0 +1,104 @@ +@startuml Messaging Sequenzdiagramm + +group "Backend: Request produzieren und warten" + +Endpoint -> RequestReply: request(cmdW) + +RequestReply -> AtomicReference : <> +RequestReply <-- AtomicReference : responseRef + +RequestReply -> RequestReply : responses.put(\nrequestId,\nresponseRef) + +RequestReply -> Kafka: produce(cmdW) +RequestReply <-- Kafka : Ack + +RequestReply -> AtomicReference : wait() + +end + +note over Kafka : asynchron + +group "Persistence: Request konsumieren und enqueuen" + +Quarkus -> Kafka: poll() +Quarkus <-- Kafka: cmdW + +Quarkus -> CommandObserver: process(cmdW) + +CommandObserver -> Transaction: get(txId) +CommandObserver <-- Transaction: tx + +CommandObserver -> Transaction: queue(tx, cmdW) +CommandObserver <-- Transaction + +Quarkus <-- CommandObserver +Kafka <-- Quarkus : Ack + +end + +note over Transaction : asynchron + +group "Persistence: Request verarbeiten und Response produzieren" + +Transaction -> CommandWrapper : process(cmdW) +CommandWrapper -> Command : <>\ndeserialize(cmdW) +CommandWrapper <-- Command : cmd + +CommandWrapper -> Command : process(cmd) + +Command -> CDI : select(Class) +Command <-- CDI : Processor + +Command -> Processor : process(cmd) +note over Processor : Verarbeitung\ndes Commands +Command <-- Processor : resp + +CommandWrapper <-- Command : resp +Transaction <-- CommandWrapper : resp + +Transaction -> CommandResponse : serialize(resp).copyIds(cmdW) +Transaction <-- CommandResponse : respW + +Transaction -> Interceptor : intercept(respW) +note over Interceptor : (asynchron;\nDetails nicht\ndargestellt) +Transaction <-- Interceptor + +Transaction -> Transaction : commit() + +Transaction -> Kafka : produce(respW) +Transaction <-- Kafka : Ack + +end + +note over Kafka : asynchron + +group "Backend: Response konsumieren und benachrichtigen" + +RequestReply -> Kafka : poll() +RequestReply <-- Kafka : respW + +RequestReply -> RequestReply : responses.get(requestId) + +RequestReply -> AtomicReference : set(respW) +RequestReply <-- AtomicReference + +RequestReply -> AtomicReference : notifyAll() +RequestReply <-- AtomicReference + +end + +note over RequestReply : asynchron + +group "Backend: Response zu Request zurückgeben" [synchron nach 1. Block, siehe oben] + +RequestReply <-- AtomicReference : wegen wait (siehe oben) + +RequestReply -> AtomicReference : get() +RequestReply <-- AtomicReference : respW + +Endpoint <-- RequestReply : respW + +end + +@enduml + From 747f5f894b9a74a5b0f326a528cc928e3499a7b8 Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Sat, 22 Nov 2025 00:13:18 +0100 Subject: [PATCH 4/7] component diagram architecture --- plantuml/architecture.puml | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 plantuml/architecture.puml diff --git a/plantuml/architecture.puml b/plantuml/architecture.puml new file mode 100644 index 0000000..94ca29b --- /dev/null +++ b/plantuml/architecture.puml @@ -0,0 +1,41 @@ +@startuml Architektur + +component "<>\nFrontend" as frontend { + [<>\nFrontend-Model] as fm +} +frontend ..> REST : uses + +component "<>\nBackend" as backend { + [<>\nBackend-Model] as bm +} +REST -right- backend + +component "<>\nPersistence" as persistence { + [<>\nPersistence-Model] as pm +} + +component "<>\nMessaging" as messaging { + [<>\nCommand-Replies] as resp + [<>\nCommand] as cmd +} + + +backend <-down- resp : "consumed by" +backend -down-> cmd : produces + +persistence -up-> resp : produces +persistence <-up- cmd : "consumed by" + +[<>\nDatenbank] as db + +[<>\nDatenbank Statistiken] as dbs + +persistence -left-> db : queries +persistence -right-> dbs : queries + +[<>\nModel] as model +model -> fm : generates +model -> bm : generates +model -> pm : generates + +@enduml \ No newline at end of file From 37738dc5605fc5ebc07be93e52ffd45a58d305ea Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Sat, 22 Nov 2025 01:10:32 +0100 Subject: [PATCH 5/7] add generated classes diagram --- plantuml/generated-classes.puml | 69 +++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 plantuml/generated-classes.puml diff --git a/plantuml/generated-classes.puml b/plantuml/generated-classes.puml new file mode 100644 index 0000000..9a122be --- /dev/null +++ b/plantuml/generated-classes.puml @@ -0,0 +1,69 @@ +@startuml "Generierte Klassen" + +class Film { + id: int + .. + title: string + description: string + duration: int + image: string + rating: short + .. + category: Filmkategorie +} + +abstract class Command {} + +class CommandGetFilm { + id: int +} +CommandGetFilm -up-|> Command + +class CommandCreateFilm { +} +CommandCreateFilm -up-|> Command +CommandCreateFilm -down-> "1" Film : create + +class CommandUpdateFilm { +} +CommandUpdateFilm -up-|> Command +CommandUpdateFilm -down-> "1" Film : update + +class CommandDeleteFilm { +} +CommandDeleteFilm -up-|> Command +CommandDeleteFilm -down-> "1" Film : delete + +class CommandGetFilmResponse { +} +CommandGetFilmResponse -up-|> Command +CommandGetFilmResponse -up-> "1" Film : film + +class CommandCreateFilmResponse { +} +CommandCreateFilmResponse -up-|> Command +CommandCreateFilmResponse -up-> "1" Film : created + +class CommandDeleteFilmResponse { +} +CommandDeleteFilmResponse -up-|> Command +CommandDeleteFilmResponse -up-> "1" Film : deleted + +class CommandUpdateFilmResponse { +} +CommandUpdateFilmResponse -up-|> Command +CommandUpdateFilmResponse -up-> "1" Film : updated + +class CommandListFilm { + filters: List +} +CommandListFilm -up-|> Command + +class CommandListFilmResponse { +} +CommandListFilmResponse -up-|> Command +CommandListFilmResponse -up-> "0..*" Film : list + +'Todo: Methoden + Processor + einiges mehr evtl.? + +@enduml \ No newline at end of file From 29ed2a8d60e0f9afb6c3cfd471b15856bfb7e135 Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Sat, 22 Nov 2025 19:35:19 +0100 Subject: [PATCH 6/7] generated processor classes --- plantuml/generated-processor.puml | 37 +++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 plantuml/generated-processor.puml diff --git a/plantuml/generated-processor.puml b/plantuml/generated-processor.puml new file mode 100644 index 0000000..b06f967 --- /dev/null +++ b/plantuml/generated-processor.puml @@ -0,0 +1,37 @@ +@startuml "Generated Processor" + +interface CommandCreateFilmProcessor { + processCommandCreateFilm(cmd: CommandCreateFilm): Command +} + +interface CommandGetFilmProcessor { + processCommandGetFilm(cmd: CommandGetFilm): Command +} + +interface CommandUpdateFilmProcessor { + processCommandUpdateFilm(cmd: CommandUpdateFilm): Command +} + +interface CommandDeleteFilmProcessor { + processCommandDeleteFilm(cmd: CommandDeleteFilm): Command +} + +interface CommandListFilmProcessor { + processCommandListFilm(cmd: CommandListFilm): Command +} + +class FilmProcessor { + processCommandCreateFilm(cmd: CommandCreateFilm): Command + processCommandGetFilm(cmd: CommandGetFilm): Command + processCommandUpdateFilm(cmd: CommandUpdateFilm): Command + processCommandDeleteFilm(cmd: CommandDeleteFilm): Command + processCommandListFilm(cmd: CommandListFilm): Command +} + +FilmProcessor -right-|> CommandListFilmProcessor +FilmProcessor -up-|> CommandDeleteFilmProcessor +FilmProcessor -up-|> CommandUpdateFilmProcessor +FilmProcessor -up-|> CommandGetFilmProcessor +FilmProcessor -left-|> CommandCreateFilmProcessor + +@enduml \ No newline at end of file From 2146fbab9af9c318a51c14310c2fcebda791b6d7 Mon Sep 17 00:00:00 2001 From: Lennart Heinrich Date: Thu, 11 Dec 2025 20:09:44 +0100 Subject: [PATCH 7/7] split messaging sequence diagram --- plantuml/messaging-sequence-left.puml | 74 ++++++++++++++++++++++++++ plantuml/messaging-sequence-right.puml | 38 +++++++++++++ 2 files changed, 112 insertions(+) create mode 100644 plantuml/messaging-sequence-left.puml create mode 100644 plantuml/messaging-sequence-right.puml diff --git a/plantuml/messaging-sequence-left.puml b/plantuml/messaging-sequence-left.puml new file mode 100644 index 0000000..3a3d533 --- /dev/null +++ b/plantuml/messaging-sequence-left.puml @@ -0,0 +1,74 @@ +@startuml Messaging Sequenzdiagramm Links + +group "Backend: Request produzieren und warten" + +Endpoint -> RequestReply: request(cmdW) + +RequestReply -> AtomicReference : <> +RequestReply <-- AtomicReference : responseRef + +RequestReply -> RequestReply : responses.put(\nrequestId,\nresponseRef) + +RequestReply -> Kafka: produce(cmdW) +RequestReply <-- Kafka : Ack + +RequestReply -> AtomicReference : wait() + +end + +note over Kafka : asynchron + +group "Persistence: Request konsumieren und enqueuen" + +Quarkus -> Kafka: poll() +Quarkus <-- Kafka: cmdW + +Quarkus -> CommandObserver: process(cmdW) + +CommandObserver -> Transaction: get(txId) +CommandObserver <-- Transaction: tx + +CommandObserver -> Transaction: queue(tx, cmdW) +CommandObserver <-- Transaction + +Quarkus <-- CommandObserver +Kafka <-- Quarkus : Ack + +end + +note over Transaction : asynchron + +... Persistence: Request verarbeiten und Response produzieren\n(siehe weiteres Sequenzdiagramm) ... + +note over Kafka : asynchron + +group "Backend: Response konsumieren und benachrichtigen" + +RequestReply -> Kafka : poll() +RequestReply <-- Kafka : respW + +RequestReply -> RequestReply : responses.get(requestId) + +RequestReply -> AtomicReference : set(respW) +RequestReply <-- AtomicReference + +RequestReply -> AtomicReference : notifyAll() +RequestReply <-- AtomicReference + +end + +note over RequestReply : asynchron + +group "Backend: Response zu Request zurückgeben" [synchron nach 1. Block, siehe oben] + +RequestReply <-- AtomicReference : wegen wait (siehe oben) + +RequestReply -> AtomicReference : get() +RequestReply <-- AtomicReference : respW + +Endpoint <-- RequestReply : respW + +end + +@enduml + diff --git a/plantuml/messaging-sequence-right.puml b/plantuml/messaging-sequence-right.puml new file mode 100644 index 0000000..1d5decd --- /dev/null +++ b/plantuml/messaging-sequence-right.puml @@ -0,0 +1,38 @@ +@startuml Messaging Sequenzdiagramm Rechts + +participant Kafka + +group "Persistence: Request verarbeiten und Response produzieren" + +Transaction -> CommandWrapper : process(cmdW) +CommandWrapper -> Command : <>\ndeserialize(cmdW) +CommandWrapper <-- Command : cmd + +CommandWrapper -> Command : process(cmd) + +Command -> CDI : select(Class) +Command <-- CDI : Processor + +Command -> Processor : process(cmd) +note over Processor : Verarbeitung\ndes Commands +Command <-- Processor : resp + +CommandWrapper <-- Command : resp +Transaction <-- CommandWrapper : resp + +Transaction -> CommandResponse : serialize(resp).copyIds(cmdW) +Transaction <-- CommandResponse : respW + +Transaction -> Interceptor : intercept(respW) +note over Interceptor : (asynchron;\nDetails nicht\ndargestellt) +Transaction <-- Interceptor + +Transaction -> Transaction : commit() + +Transaction -> Kafka : produce(respW) +Transaction <-- Kafka : Ack + +end + +@enduml +