Melden rechts in der Byline jeder Karte, auch anonym

- Melden-Knopf in der Byline aller Beiträge (außer eigenen), Grund-Formular
  darunter; ersetzt den Knopf unter dem fokussierten Beitrag
- /api/entry/{pid}/report öffentlich, 10/min pro IP; ohne Session anonym
  (uid 0), Doppelmeldungen nur für Angemeldete unterdrückt
- Klicks in Formularen öffnen die Karte nicht mehr

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 18:05:54 +02:00
co-authored by Claude Opus 5.5
parent 80c333cd58
commit 3d2447fe35
8 changed files with 73 additions and 52 deletions
+9 -4
View File
@@ -441,8 +441,9 @@ 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.
// handleReport meldet einen Beitrag, optional mit Grund. Melden darf jeder;
// ohne Session ist der Melder anonym (uid 0). Angemeldete legen für denselben
// Beitrag keine zweite Meldung an, solange ihre erste offen ist.
func handleReport(w http.ResponseWriter, r *http.Request) error {
pid, err := pidParam(r)
if err != nil {
@@ -453,12 +454,16 @@ func handleReport(w http.ResponseWriter, r *http.Request) error {
return errEntryNotFound
}
reason := truncateRunes(strings.TrimSpace(r.FormValue("reason")), 500)
var uid int64
if s, ok := getSession(r); ok {
uid = s.UID
}
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(),
WHERE $2::bigint = 0 OR NOT EXISTS (SELECT 1 FROM report WHERE pid = $1 AND uid = $2 AND handled = 0)`,
pid, uid, reason, time.Now().Unix(),
); err != nil {
return Internal(err)
}