chap 5: Umsetzung — 11 Abschnitte + module-components/zip-stream/race-condition diagrams

This commit is contained in:
2026-08-25 20:33:15 +02:00
parent ce6b01626c
commit f857a244dd
17 changed files with 437 additions and 110 deletions
+39 -29
View File
@@ -1,29 +1,39 @@
classDiagram
class DocumentsPage {
+OnGetAsync()
+OnGetDownloadAsync()
+OnGetZipAsync()
}
class DocumentsService {
+ListDocumentsAsync(orgId, search, type, token)
+GetDownloadUrlAsync(orgId, key)
+GetZipStreamAsync(orgId, keys)
+ResolveCustomerPrefixAsync(orgId, orgName)
}
class S3DocumentsClient {
-IAmazonS3 _s3
+ListObjectsAsync(prefix, delimiter, token)
+GetObjectMetadataAsync(key)
+GetPresignedUrlAsync(key)
}
class OrgSlug {
+Slugify(name) string
}
class S3Settings {
+BucketName string
+ServiceUrl string
}
DocumentsPage --> DocumentsService
DocumentsService --> S3DocumentsClient
DocumentsService --> OrgSlug
S3DocumentsClient --> S3Settings
flowchart TB
subgraph Pages["Pages"]
P1["Documents.cshtml<br/>+ .cshtml.cs<br/><i>Liste, Suche, Filter, Seiten</i>"]
P2["Document/Download.cshtml.cs<br/><i>Einzel- und ZIP-Download</i>"]
P3["Document/Share.cshtml.cs<br/><i>OpenGraph-Vorschau</i>"]
end
subgraph Services["Services"]
S["DocumentsService<br/><i>Auflisten, Filtern, Aufloesen<br/>des Kundenordners</i>"]
C["S3DocumentsClient<br/><i>Kapselung von IAmazonS3</i>"]
end
subgraph Model["Model/Documents"]
M1["DocumentType<br/><i>Enum + Ableitung<br/>aus Ordnername</i>"]
M2["DocumentName<br/><i>Anzeigename,<br/>.url-Erkennung</i>"]
M3["DocumentKey /<br/>RelativePath<br/><i>validierte Pfade</i>"]
M4["OrgSlug<br/><i>Normalisierung des<br/>Firmennamens</i>"]
M5["DocumentViewModel"]
end
EXT["IAmazonS3<br/>(AWS SDK)"]
CFG["S3Settings<br/><i>keyed service</i>"]
P1 --> S
P2 --> S
P3 --> S
S --> C
S --> M1
S --> M2
S --> M4
S --> M5
P2 --> M3
C --> EXT
C --> CFG
style S fill:#dae8fc,stroke:#6c8ebf
style C fill:#dae8fc,stroke:#6c8ebf
style EXT fill:#f5f5f5,stroke:#999
style CFG fill:#f5f5f5,stroke:#999