add-otel #3
							
								
								
									
										81
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								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()
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user