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
|