- SQLite-Import, migrate.sh, notes/migrations.md und altes jQuery-Skript entfernt - Backend: scanEntry/queryEntries statt doppelter Scan-Liste, Feed-Queries direkt statt feedWhere, Thread ohne Map-Umweg, gemeinsame Helfer für Cookie-Löschen und Mediennamen, usernameTaken - Frontend: PostForm für Beitrag und Antwort, EntryCard in Deleted/LiveCard aufgeteilt, tote CSS-Regeln und Typen entfernt, Strich-Regeln zusammengelegt - Rechtstexte verlinken /stats; Kommentare ohne Vorgeschichte Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TiXsPUqw7oeomZ8wZrQW5q
34 lines
1.1 KiB
Go
34 lines
1.1 KiB
Go
package main
|
|
|
|
import "net/http"
|
|
|
|
// handlerFunc ist die Handler-Signatur dieser App: wie http.HandlerFunc, aber
|
|
// mit Fehler-Rückgabe. "return err" beendet den Handler zwingend -- ein
|
|
// vergessenes return nach dem Fehlerschreiben kann es so nicht geben.
|
|
type handlerFunc func(http.ResponseWriter, *http.Request) error
|
|
|
|
// api hängt einen fehlerliefernden Handler in chi ein; der Fehler geht als
|
|
// JSON über writeAPIError hinaus.
|
|
func api(h handlerFunc) http.HandlerFunc {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
if err := h(w, r); err != nil {
|
|
writeAPIError(w, err)
|
|
}
|
|
}
|
|
}
|
|
|
|
// guard ist dasselbe für Middlewares: der Prüfschritt liefert einen Fehler,
|
|
// statt selbst zu schreiben. Der ResponseWriter wird durchgereicht, weil
|
|
// manche Prüfungen vor der Antwort noch Header setzen müssen.
|
|
func guard(check func(http.ResponseWriter, *http.Request) error) func(http.Handler) http.Handler {
|
|
return func(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if err := check(w, r); err != nil {
|
|
writeAPIError(w, err)
|
|
return
|
|
}
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
}
|