add-otel #3
							
								
								
									
										89
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								http.go
									
									
									
									
									
								
							@ -6,6 +6,7 @@ import (
 | 
				
			|||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
	"slices"
 | 
						"slices"
 | 
				
			||||||
	"sort"
 | 
						"sort"
 | 
				
			||||||
 | 
						"strconv"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -104,6 +105,86 @@ func httpServer(c *console, app *appState) error {
 | 
				
			|||||||
		reg.WriteTo(w)
 | 
							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) {
 | 
						http.HandleFunc("/api/plain/users", func(w http.ResponseWriter, r *http.Request) {
 | 
				
			||||||
		ctx, span := otel.Span(r.Context())
 | 
							ctx, span := otel.Span(r.Context())
 | 
				
			||||||
		defer span.End()
 | 
							defer span.End()
 | 
				
			||||||
@ -136,10 +217,10 @@ func httpServer(c *console, app *appState) error {
 | 
				
			|||||||
		var twts []types.Twt
 | 
							var twts []types.Twt
 | 
				
			||||||
		for rows.Next() {
 | 
							for rows.Next() {
 | 
				
			||||||
			var o struct {
 | 
								var o struct {
 | 
				
			||||||
				FeedID string
 | 
									FeedID    string
 | 
				
			||||||
				URI    string
 | 
									URI       string
 | 
				
			||||||
				Nick   string
 | 
									Nick      string
 | 
				
			||||||
				Dt     TwtTime
 | 
									Dt        TwtTime
 | 
				
			||||||
				LastTwtOn TwtTime
 | 
									LastTwtOn TwtTime
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			err = rows.Scan(&o.FeedID, &o.URI, &o.Nick, &o.Dt, &o.LastTwtOn)
 | 
								err = rows.Scan(&o.FeedID, &o.URI, &o.Nick, &o.Dt, &o.LastTwtOn)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user