Skip to content

Commit d3ef0d6

Browse files
committed
docs: update architecture pipeline details, test metrics, and Go version requirement
1 parent e1d841c commit d3ef0d6

2 files changed

Lines changed: 42 additions & 25 deletions

File tree

ARCHITECTURE.md

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ Dispatch ist ein mandantenfähiges E-Mail-Delivery-System. Eine REST-Schnittstel
1111
│ mail-gateway │ │ mail-worker │ │ mail-admin │
1212
│ │ │ │ │ │
1313
│ POST /mail/send │────▶│ NATS Consumer │────▶│ GraphQL API │
14-
5-Stage Pipeline│ │ MS Graph Send │ │ Sender-CRUD │
14+
7-Stage Pipeline│ │ MS Graph Send │ │ Sender-CRUD │
1515
│ │ │ Audit / DLQ │ │ Stream-Queries │
1616
└─────────────────┘ └──────────────────┘ └───────────────────┘
1717
│ │
@@ -54,9 +54,9 @@ HTTP POST /dispatch/api/v1/mail/send
5454
5555
5656
┌───────────────────────────────────┐
57-
5-Stage Validation
57+
7-Stage Gateway Pipeline
5858
│ │
59-
│ 1 JSON-Parse + Struct-Tags
59+
│ 1 JSON-Decode + Struct-Validier.
6060
│ (validator, MIME-Whitelist, │
6161
│ Größenlimits) │
6262
│ │
@@ -74,18 +74,15 @@ HTTP POST /dispatch/api/v1/mail/send
7474
│ 5 Spam-Dedup (SHA-256) │
7575
│ appTag|subject|recip|size │
7676
│ NATS KV spam (60s TTL) │
77+
│ │
78+
│ 6 Anhang-Upload │
79+
│ decode base64 → Object Store │
80+
│ Fehler → HTTP 503 │
81+
│ │
82+
│ 7 NATS Publish → DISPATCH_MAILS │
83+
│ Fehler → HTTP 503 │
84+
│ Erfolg → HTTP 202 │
7785
└───────────────────────────────────┘
78-
79-
80-
Attachments → NATS Object Store
81-
(key: {traceID}/{index}, Content gecleart)
82-
83-
84-
NATS Publish → DISPATCH_MAILS
85-
(MailRequestDO: traceID, sender, ObjectKeys, ...)
86-
87-
88-
HTTP 202 Accepted
8986
```
9087

9188
```
@@ -240,6 +237,7 @@ devbox run lint # golangci-lint
240237
devbox run coverage-html # HTML-Coverage-Report → coverage.html
241238
devbox run mutate # Mutations-Tests (gremlins) auf Core-Packages
242239
devbox run metrics # Coverage + Mutation in einem Lauf
240+
devbox run sonar # Coverage erzeugen + SonarQube-Scan
243241
```
244242

245243
Der MS Graph Developer Proxy (`ghcr.io/dotnet/dev-proxy:latest`) mockt alle genutzten Graph-Endpunkte. Konfiguration in `dev-proxy/devproxyrc.json`, Mock-Antworten in `dev-proxy/mocks.json`.

README.md

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ Multi-tenantes E-Mail-Delivery-System. REST-Eingang → NATS JetStream → Micro
1515
```
1616
Client
1717
POST /dispatch/api/v1/mail/send
18-
└── mail-gateway
19-
1. Validierung (Format, Größe, MIME)
18+
└── mail-gateway (7-Stage-Pipeline)
19+
1. JSON-Decode + Struct-Validierung (Format, Größe, MIME-Whitelist)
2020
2. Sender-Lookup (NATS KV senders, In-Memory-Cache 10 min)
2121
3. Domain-Whitelist-Check
2222
4. Quota-Check (NATS KV quota, rolling 24h, CAS, fail-closed)
23-
5. Spam-Deduplizierung (NATS KV spam, TTL-Bucket)
24-
6. Anhänge → NATS Object Store attachments (key: {traceID}/{index})
25-
7. Publish → NATS JetStream DISPATCH_MAILS (Anhangsinhalte entfernt)
23+
5. Spam-Deduplizierung (SHA-256, NATS KV spam, TTL-Bucket)
24+
6. Anhang-Upload → NATS Object Store attachments
25+
↳ Fehler → HTTP 503 (kein Retry)
26+
7. Publish → NATS JetStream DISPATCH_MAILS
2627
↳ Fehler → HTTP 503 (kein Retry, kein Fallback)
2728
↳ Erfolg → HTTP 202
2829
@@ -153,19 +154,37 @@ devbox run coverage-html # Tests + Coverage-Bericht (HTML → coverage.html)
153154
devbox run test-integration # Integrationstests (Docker erforderlich)
154155
devbox run mutate # Mutations-Tests (gremlins) für Core-Packages
155156
devbox run metrics # Coverage + Mutations in einem Lauf
157+
devbox run sonar # Coverage erzeugen + SonarQube-Scan
156158
```
157159

158160
### Test-Metriken (Stand main)
159161

160162
| Metrik | Wert |
161163
|--------|------|
162-
| Unit-Tests | 46 |
163-
| Statement Coverage (Core-Packages) | 67 % |
164-
| Mutation Score (gateway) | 100 % (1/1 killed) |
165-
| Mutation Score (quota) | 100 % (3/3 killed) |
164+
| Unit-Tests | 97 |
165+
| Statement Coverage (getestete Packages) | 84 – 100 % |
166+
| Mutation Score (alle Core-Packages) | 100 % Efficacy |
166167
| Mutation Score Threshold | ≥ 70 % (efficacy + mutation-coverage) |
168+
| SonarQube Quality Gate | PASSED |
167169

168-
Mutation-Tests laufen mit [gremlins](https://github.com/go-gremlins/gremlins) (`go tool gremlins unleash`) auf den Packages `internal/gateway`, `internal/quota`, `internal/spam`, `internal/worker`, `internal/pii` und `internal/hash`. Die Schwellwerte sind in [`.gremlins.yaml`](.gremlins.yaml) hinterlegt.
170+
**Coverage pro Package:**
171+
172+
| Package | Coverage |
173+
|---------|---------|
174+
| `internal/config` | 96 % |
175+
| `internal/domain` | 100 % |
176+
| `internal/gateway` | 95 % |
177+
| `internal/hash` | 100 % |
178+
| `internal/msgraph` | 88 % |
179+
| `internal/pii` | 100 % |
180+
| `internal/quota` | 92 % |
181+
| `internal/sender` | 95 % |
182+
| `internal/spam` | 88 % |
183+
| `internal/worker` | 84 % |
184+
185+
Mutation-Tests laufen mit [gremlins](https://github.com/go-gremlins/gremlins) (`go tool gremlins unleash`) auf den Packages `internal/gateway`, `internal/quota`, `internal/spam`, `internal/worker`, `internal/pii`, `internal/hash` und `internal/msgraph`. Die Schwellwerte sind in [`.gremlins.yaml`](.gremlins.yaml) hinterlegt.
186+
187+
Statische Code-Analyse via [SonarQube](http://10.27.27.202:9000/dashboard?id=dispatch). Token wird aus `.env` geladen (`SONAR_TOKEN=sqp_...`), nie im Repository gespeichert.
169188

170189
## API
171190

@@ -252,7 +271,7 @@ query {
252271

253272
## Stack
254273

255-
- **Go 1.24+**
274+
- **Go 1.25+**
256275
- **NATS JetStream** — Message-Broker, KV-Store, Object Store, State-Backend
257276
- **Microsoft Graph API v1.0** — E-Mail-Versand via Microsoft 365
258277
- **`github.com/go-chi/chi/v5`** — HTTP-Routing

0 commit comments

Comments
 (0)