Split voting into clean read/write endpoints
Replaces the GET-mutates-state interactions route with a proper split:
- GET /entry/{pid}/votes reads the tally (public, read-only)
- POST /entry/{pid}/vote casts/toggles the vote (auth, mode in body)
Shared voteTally/writeTally helpers back both handlers. Invalid mode now
returns 400. Frontend updated to read via GET and vote via POST.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+23
-17
@@ -135,30 +135,37 @@ Mindestens `content` oder `file` muss vorhanden sein.
|
||||
|
||||
---
|
||||
|
||||
### `GET /entry/:pid/interactions/:mode`
|
||||
### `GET /entry/:pid/votes`
|
||||
|
||||
Abstimmungsstand lesen und optional die eigene Stimme umschalten.
|
||||
|
||||
**Parameter:**
|
||||
| Name | Typ | Beschreibung |
|
||||
|------|-----|--------------|
|
||||
| `pid` | int | Post-ID |
|
||||
| `mode` | string | `none` (nur lesen), `left` oder `right` (abstimmen) |
|
||||
|
||||
**Voting-Logik** (nur bei `left`/`right`, Auth erforderlich):
|
||||
- keine bisherige Stimme → neue Stimme
|
||||
- gleiche Stimme erneut → Stimme zurückziehen (Toggle)
|
||||
- andere Stimme → auf neuen Modus wechseln
|
||||
Abstimmungsstand eines Beitrags lesen (read-only).
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{ "pid": 123, "left": 4, "right": 2, "selected": "left" }
|
||||
```
|
||||
`selected` ist `none`, wenn nicht eingeloggt oder keine Stimme abgegeben.
|
||||
Bei `left`/`right` ohne Login → `401`.
|
||||
|
||||
> Hinweis: Mutation per GET ist aus dem ursprünglichen HTMX-Design übernommen.
|
||||
> Sauberer wäre ein separater `POST` fürs Abstimmen — siehe offene Punkte.
|
||||
---
|
||||
|
||||
### `POST /entry/:pid/vote`
|
||||
|
||||
Eigene Stimme abgeben oder umschalten.
|
||||
|
||||
**Auth:** erforderlich
|
||||
|
||||
**Request (form-encoded):**
|
||||
| Feld | Typ | Beschreibung |
|
||||
|------|-----|--------------|
|
||||
| `mode` | string | `left` oder `right` |
|
||||
|
||||
**Voting-Logik:**
|
||||
- keine bisherige Stimme → neue Stimme
|
||||
- gleiche Stimme erneut → Stimme zurückziehen (Toggle)
|
||||
- andere Stimme → auf neuen Modus wechseln
|
||||
|
||||
**Response:** wie `GET /entry/:pid/votes` (aktualisierter Stand)
|
||||
- `400` bei ungültigem Modus
|
||||
- `401` ohne Login
|
||||
|
||||
---
|
||||
|
||||
@@ -249,7 +256,6 @@ CREATE TABLE vote (
|
||||
|
||||
## Offene Punkte
|
||||
|
||||
- Voting läuft per GET (HTMX-Erbe) — perspektivisch auf `POST` umstellen (CSRF/Idempotenz)
|
||||
- Kein Rate-Limiting außer dem zufälligen `sleep` beim Login
|
||||
- `session`-Token ist nur `randbelow(999999999) + timestamp` — sollte auf `crypto/rand` umgestellt werden
|
||||
- Fehler-Responses sind aktuell Plaintext/HTML — in der Go-API einheitlich JSON
|
||||
|
||||
Reference in New Issue
Block a user