Melden-Button: Beiträge mit optionalem Grund melden

- report-Tabelle wieder im Schema (kompatibel zur bestehenden auf PROD)
- POST /api/entry/{pid}/report, nur angemeldet, speichert Melder-uid;
  erneutes Melden legt keine zweite offene Meldung an
- "Melden" auf der Beitragsseite für fremde, nicht gelöschte Beiträge
- Test und API-Doku

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
This commit is contained in:
irrlicht
2026-09-29 17:53:10 +02:00
co-authored by Claude Opus 5.5
parent 2bae608d76
commit 80c333cd58
6 changed files with 123 additions and 2 deletions
+46
View File
@@ -550,6 +550,52 @@ func TestSoftDelete(t *testing.T) {
}
}
func TestReport(t *testing.T) {
srv := newTestServer(t)
alice := registerAndLogin(t, srv, "alice")
bob := registerAndLogin(t, srv, "bob")
pid := createEntry(t, alice, srv, "strittig")
report := func(c *http.Client, pid int64, reason string) int {
resp := postForm(t, c, fmt.Sprintf("%s/api/entry/%d/report", srv.URL, pid), url.Values{"reason": {reason}})
resp.Body.Close()
return resp.StatusCode
}
openReports := func() (n int) {
if err := db.QueryRow(`SELECT count(*) FROM report WHERE pid = $1 AND handled = 0`, pid).Scan(&n); err != nil {
t.Fatal(err)
}
return n
}
if got := report(newClient(t), pid, ""); got != http.StatusUnauthorized {
t.Fatalf("anon report: erwartet 401, bekam %d", got)
}
if got := report(bob, pid, " Spam "); got != http.StatusOK {
t.Fatalf("report: erwartet 200, bekam %d", got)
}
var reason string
db.QueryRow(`SELECT reason FROM report WHERE pid = $1`, pid).Scan(&reason)
if reason != "Spam" {
t.Fatalf("grund: %q", reason)
}
// Erneut melden legt keine zweite offene Meldung an, ein anderer Nutzer schon.
report(bob, pid, "")
report(alice, pid, "")
if n := openReports(); n != 2 {
t.Fatalf("offene meldungen: erwartet 2, bekam %d", n)
}
if got := report(bob, 999999, ""); got != http.StatusNotFound {
t.Fatalf("report unbekannt: erwartet 404, bekam %d", got)
}
postForm(t, alice, fmt.Sprintf("%s/api/entry/%d/delete", srv.URL, pid), url.Values{}).Body.Close()
if got := report(bob, pid, ""); got != http.StatusNotFound {
t.Fatalf("report gelöscht: erwartet 404, bekam %d", got)
}
}
func TestRenameUser(t *testing.T) {
srv := newTestServer(t)
alice := registerAndLogin(t, srv, "alice")