summaryrefslogtreecommitdiff
path: root/31-qualitaetsheft-kolloquium/assets/diagrams/db.puml
diff options
context:
space:
mode:
authorOrangerot <purple@orangerot.dev>2024-05-24 17:42:08 +0200
committerOrangerot <purple@orangerot.dev>2024-05-24 17:47:22 +0200
commit7fcdc1c788725f866de71fc9dfd8c4d1cb132b57 (patch)
tree89931c85ae3f149884ba02c69862558e93f01531 /31-qualitaetsheft-kolloquium/assets/diagrams/db.puml
Initial commitHEADmain
Diffstat (limited to '31-qualitaetsheft-kolloquium/assets/diagrams/db.puml')
-rw-r--r--31-qualitaetsheft-kolloquium/assets/diagrams/db.puml78
1 files changed, 78 insertions, 0 deletions
diff --git a/31-qualitaetsheft-kolloquium/assets/diagrams/db.puml b/31-qualitaetsheft-kolloquium/assets/diagrams/db.puml
new file mode 100644
index 0000000..bdefaea
--- /dev/null
+++ b/31-qualitaetsheft-kolloquium/assets/diagrams/db.puml
@@ -0,0 +1,78 @@
+@startuml
+' Type Symbol
+' Zero or One |o--
+' Exactly One ||--
+' Zero or Many }o--
+' One or Many }|--
+
+skinparam linetype ortho
+
+entity User {
+ * int id <<unique>>
+ * <u>String email</u>
+ * String password
+ * boolean verified
+ * long created_at
+}
+
+entity SubscriptionAction {
+ * int id <<unique>>
+ * <u>int user_id</u>
+ * long timestamp
+ * int subscription_id
+ * boolean added
+}
+
+entity Subscription {
+ * int id <<unique>>
+ * <u>String url</u>
+ * long timestamp
+ * String title
+}
+
+entity Episode {
+ * int id <<unique>>
+ * <u>int guid <<unique>></u>
+ * <u>String url</u>
+ * String title
+ * int total
+ * int subscription_id
+}
+note right
+ Wenn der Client eine GUID aus dem Feed mitsendet, wird
+ diese statt der URL verwendet um die Episode zu finden.
+ So wird die Episode auch noch gefunden, nachdem sich
+ die URL geändert hat.
+end note
+note bottom of Episode
+ Wenn für die Episoden-URL einer EpisodeAction noch keine Episode in der Datenbank steht,
+ dann schreibe dafür ein Dummy-Objekt in Datenbank und lade asynchron die Episoden der Subscription.
+ Ersetze dann die Dummy-Objekte durch die Episoden und setze den Timestamp der Subscription auf
+ die aktuelle Zeit.
+ Um DoS-Angriffe auf den Backend-Server abzuwenden, können die Episoden einer Subscription erst
+ nach einer Stunde erneut gefetched werden. Bis dahin werden für EpisodeActions, die sich auf noch
+ nicht geladene Episoden beziehen, nur Dummy-Objekte für die Episoden in die Datenbank geschrieben.
+ Es sei noch darauf hingewiesen, dass diese Dummy-Episoden bei Anfragen nicht mit ausgegeben werden.
+end note
+
+entity EpisodeAction {
+ * int id <<unique>>
+ * <u>int user_id</u>
+ * int episode_id
+ * long timestamp
+ * int action
+ * int started
+ * int position
+}
+note right
+ Speichere für jede Episode
+ nur letzte Play-Action.
+endnote
+
+User ||--o{ EpisodeAction
+User ||--o{ SubscriptionAction
+SubscriptionAction }|--|| Subscription
+EpisodeAction }|--|| Episode
+Subscription ||-right-|{ Episode
+
+@enduml