From 5c97bfb182db62a9ce9c64da339cd655b7dc98ba Mon Sep 17 00:00:00 2001 From: xuu Date: Tue, 25 Mar 2025 18:52:30 -0600 Subject: [PATCH] chore: add twt endpoints --- http.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 4 deletions(-) diff --git a/http.go b/http.go index 0453b41..2adb74a 100644 --- a/http.go +++ b/http.go @@ -6,6 +6,7 @@ import ( "net/http" "slices" "sort" + "strconv" "strings" "time" @@ -104,6 +105,86 @@ func httpServer(c *console, app *appState) error { reg.WriteTo(w) }) + http.HandleFunc("/api/plain/twt", func(w http.ResponseWriter, r *http.Request) { + ctx, span := otel.Span(r.Context()) + defer span.End() + + limit := 100 + if v, ok := strconv.Atoi(r.URL.Query().Get("limit")); ok == nil { + limit = v + } + offset := 0 + if v, ok := strconv.Atoi(r.URL.Query().Get("offset")); ok == nil { + offset = v + } + + args := []any{limit, offset} + + uriqry := "" + if u := r.URL.Query().Get("uri"); u != "" { + uriqry = "and uri = ?" + args = append([]any{u}, args...) + } + + w.Header().Set("Content-Type", "text/plain; charset=utf-8") + rows, err := db.QueryContext( + ctx, + `SELECT + feed_id, + hash, + conv, + nick, + uri, + text + FROM twts + JOIN ( + SELECT + feed_id, + nick, + uri + FROM feeds + where state not in ('frozen', 'permanantly-dead') + `+uriqry+` + ) using (feed_id) + order by ulid desc + limit ? + offset ? + `, args..., + ) + if err != nil { + span.RecordError(err) + return + } + defer rows.Close() + + var twts []types.Twt + for rows.Next() { + var o struct { + FeedID string + Hash string + Conv string + Dt string + Nick string + URI string + Text string + } + err = rows.Scan(&o.FeedID, &o.Hash, &o.Conv, &o.Nick, &o.URI, &o.Text) + if err != nil { + span.RecordError(err) + return + } + twter := types.NewTwter(o.Nick, o.URI) + o.Text = strings.ReplaceAll(o.Text, "\n", "\u2028") + twt, _ := lextwt.ParseLine(o.Text, &twter) + twts = append(twts, twt) + } + var preamble lextwt.Comments + preamble = append(preamble, lextwt.NewComment("# self = /api/plain/twts")) + + reg := lextwt.NewTwtRegistry(preamble, twts) + reg.WriteTo(w) + }) + http.HandleFunc("/api/plain/users", func(w http.ResponseWriter, r *http.Request) { ctx, span := otel.Span(r.Context()) defer span.End() @@ -136,10 +217,10 @@ func httpServer(c *console, app *appState) error { var twts []types.Twt for rows.Next() { var o struct { - FeedID string - URI string - Nick string - Dt TwtTime + FeedID string + URI string + Nick string + Dt TwtTime LastTwtOn TwtTime } err = rows.Scan(&o.FeedID, &o.URI, &o.Nick, &o.Dt, &o.LastTwtOn)