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
+26
View File
@@ -441,6 +441,32 @@ func handleDeleteEntry(w http.ResponseWriter, r *http.Request) error {
return nil
}
// handleReport meldet einen Beitrag, optional mit Grund. Wer denselben Beitrag
// erneut meldet, solange die Meldung offen ist, legt keine zweite an.
func handleReport(w http.ResponseWriter, r *http.Request) error {
pid, err := pidParam(r)
if err != nil {
return err
}
e, err := entryByPID(pid)
if err != nil || e.Deleted != 0 {
return errEntryNotFound
}
reason := truncateRunes(strings.TrimSpace(r.FormValue("reason")), 500)
if _, err := db.Exec(
`INSERT INTO report (pid, uid, reason, created_at)
SELECT $1, $2, $3, $4
WHERE NOT EXISTS (SELECT 1 FROM report WHERE pid = $1 AND uid = $2 AND handled = 0)`,
pid, uidFromContext(r.Context()), reason, time.Now().Unix(),
); err != nil {
return Internal(err)
}
writeJSON(w, http.StatusOK, map[string]string{"status": "reported"})
return nil
}
// bumpStep ist der Cooldown-Zuwachs je bereits erfolgtem Bump: nach dem 1. Bump
// ein Tag Sperre, nach dem 10. Bump zehn Tage. So wird Hochspülen mit jedem Mal
// teurer.