This commit is contained in:
2026-06-02 16:35:47 +02:00
parent 2dcba21250
commit 7ffc35808a
8 changed files with 272 additions and 170 deletions
+42 -10
View File
@@ -28,26 +28,31 @@ type Entry struct {
Username string `json:"username"`
}
func handleFeed(w http.ResponseWriter, r *http.Request) {
page, _ := strconv.Atoi(chi.URLParam(r, "page"))
// feedPage liefert eine Feed-Seite (20 Beiträge, neueste zuerst). Ist uid != 0,
// werden nur die Beiträge dieses Nutzers geliefert.
func feedPage(page int, uid int64) ([]Entry, error) {
if page < 0 {
page = 0
}
if page > 100 {
page = 100
}
const count = 20
offset := page * count
rows, err := db.Query(`
query := `
SELECT e.pid, e.uid, e.created_at, e.content, e.filepath, u.username
FROM entry e JOIN user u ON u.uid = e.uid
ORDER BY e.created_at DESC
LIMIT ? OFFSET ?`, count, offset)
FROM entry e JOIN user u ON u.uid = e.uid`
args := []any{}
if uid != 0 {
query += ` WHERE e.uid = ?`
args = append(args, uid)
}
query += ` ORDER BY e.created_at DESC LIMIT ? OFFSET ?`
args = append(args, count, page*count)
rows, err := db.Query(query, args...)
if err != nil {
writeError(w, http.StatusInternalServerError, "Datenbankfehler")
return
return nil, err
}
defer rows.Close()
@@ -59,6 +64,33 @@ func handleFeed(w http.ResponseWriter, r *http.Request) {
}
entries = append(entries, e)
}
return entries, rows.Err()
}
func handleFeed(w http.ResponseWriter, r *http.Request) {
page, _ := strconv.Atoi(chi.URLParam(r, "page"))
entries, err := feedPage(page, 0)
if err != nil {
writeError(w, http.StatusInternalServerError, "Datenbankfehler")
return
}
writeJSON(w, http.StatusOK, entries)
}
// handleUserFeed liefert den Feed eines einzelnen Nutzers (öffentlich).
func handleUserFeed(w http.ResponseWriter, r *http.Request) {
var uid int64
if err := db.QueryRow(`SELECT uid FROM user WHERE username = ?`, chi.URLParam(r, "username")).Scan(&uid); err != nil {
writeError(w, http.StatusNotFound, "Nutzer nicht gefunden")
return
}
page, _ := strconv.Atoi(chi.URLParam(r, "page"))
entries, err := feedPage(page, uid)
if err != nil {
writeError(w, http.StatusInternalServerError, "Datenbankfehler")
return
}
writeJSON(w, http.StatusOK, entries)
}