summaryrefslogtreecommitdiff
path: root/20-implementierungsheft/assets/diagrams/db.puml
blob: bdefaeae336e7a1ead2e51e1932d324f98133a6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
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