From b6cf8c7fa0653aae527648571b0b5d9170f970c4 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Tue, 29 Sep 2026 18:14:57 +0200 Subject: [PATCH] Abstimmung Ja/Nein statt Links/Rechts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modus-Werte yes/no statt left/right in DB, API und Statistik; Knöpfe "Ja"/"Nein". Bestehende Stimmen müssen per SQL migriert werden. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q --- endpoints_test.go | 18 +++++++++--------- entry.go | 16 ++++++++-------- frontend/src/components/Votes.tsx | 6 +++--- frontend/src/pages/StatsPage.tsx | 4 ++-- frontend/src/types.ts | 8 ++++---- notes/api.md | 6 +++--- notes/todo.md | 2 +- stats.go | 10 +++++----- 8 files changed, 35 insertions(+), 35 deletions(-) diff --git a/endpoints_test.go b/endpoints_test.go index 60e4152..8ba85c1 100644 --- a/endpoints_test.go +++ b/endpoints_test.go @@ -187,8 +187,8 @@ func TestCreateEntryRequiresAuth(t *testing.T) { } type tally struct { - Left int `json:"left"` - Right int `json:"right"` + Yes int `json:"yes"` + No int `json:"no"` Selected string `json:"selected"` } @@ -209,16 +209,16 @@ func TestVoting(t *testing.T) { return tl } - if got := vote(alice, "left"); got.Left != 1 || got.Selected != "left" { - t.Fatalf("alice left: %+v", got) + if got := vote(alice, "yes"); got.Yes != 1 || got.Selected != "yes" { + t.Fatalf("alice yes: %+v", got) } - if got := vote(bob, "right"); got.Left != 1 || got.Right != 1 { - t.Fatalf("bob right: %+v", got) + if got := vote(bob, "no"); got.Yes != 1 || got.No != 1 { + t.Fatalf("bob no: %+v", got) } - if got := vote(alice, "left"); got.Left != 0 || got.Selected != "none" { + if got := vote(alice, "yes"); got.Yes != 0 || got.Selected != "none" { t.Fatalf("alice toggle off: %+v", got) } - if got := vote(alice, "right"); got.Right != 2 || got.Selected != "right" { + if got := vote(alice, "no"); got.No != 2 || got.Selected != "no" { t.Fatalf("alice switch: %+v", got) } } @@ -230,7 +230,7 @@ func TestVoteRequiresAuthAndValidMode(t *testing.T) { voteURL := fmt.Sprintf("%s/api/entry/%d/vote", srv.URL, pid) anon := newClient(t) - resp := postForm(t, anon, voteURL, url.Values{"mode": {"left"}}) + resp := postForm(t, anon, voteURL, url.Values{"mode": {"yes"}}) resp.Body.Close() if resp.StatusCode != http.StatusUnauthorized { t.Fatalf("anon vote: erwartet 401, bekam %d", resp.StatusCode) diff --git a/entry.go b/entry.go index 123a2b8..240906c 100644 --- a/entry.go +++ b/entry.go @@ -540,20 +540,20 @@ func handleBump(w http.ResponseWriter, r *http.Request) error { // writeTally schreibt die Zähler und die eigene Auswahl (selected) für einen // Beitrag. Ist uid == 0 (nicht eingeloggt), ist selected immer "none". func writeTally(w http.ResponseWriter, pid, uid int64) error { - var left, right int64 + var yes, no int64 var selected string if err := db.QueryRow( - `SELECT COUNT(*) FILTER (WHERE mode = 'left'), - COUNT(*) FILTER (WHERE mode = 'right'), + `SELECT COUNT(*) FILTER (WHERE mode = 'yes'), + COUNT(*) FILTER (WHERE mode = 'no'), COALESCE(MAX(mode) FILTER (WHERE uid = $2), 'none') FROM vote WHERE pid = $1`, pid, uid). - Scan(&left, &right, &selected); err != nil { + Scan(&yes, &no, &selected); err != nil { return Internal(err) } writeJSON(w, http.StatusOK, map[string]any{ "pid": pid, - "left": left, - "right": right, + "yes": yes, + "no": no, "selected": selected, }) return nil @@ -585,8 +585,8 @@ func handleVote(w http.ResponseWriter, r *http.Request) error { uid := uidFromContext(r.Context()) mode := r.FormValue("mode") - if mode != "left" && mode != "right" { - return Invalid("vote.bad_mode", "Ungültiger Modus (left oder right)").At("mode") + if mode != "yes" && mode != "no" { + return Invalid("vote.bad_mode", "Ungültiger Modus (yes oder no)").At("mode") } // Nur auf existierende Beiträge abstimmen, sonst entstehen Waisen-Votes. diff --git a/frontend/src/components/Votes.tsx b/frontend/src/components/Votes.tsx index f071474..d6c1ac1 100644 --- a/frontend/src/components/Votes.tsx +++ b/frontend/src/components/Votes.tsx @@ -47,7 +47,7 @@ export function Votes({ pid }: { pid: number }) { let counts = "– / –"; if (vote.isError) counts = errMsg(vote.error, "Fehler"); else if (tally.isError) counts = errMsg(tally.error, "Fehler"); - else if (t) counts = `${t.left} / ${t.right}`; + else if (t) counts = `${t.yes} / ${t.no}`; const button = (mode: VoteMode, label: string) => (