52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package kv
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"net/http"
|
|
"sort"
|
|
|
|
"github.com/dgraph-io/badger/v4"
|
|
)
|
|
|
|
type AdminServer struct {
|
|
db *badger.DB
|
|
logger *slog.Logger
|
|
}
|
|
|
|
func NewAdminServer(db *badger.DB, logger *slog.Logger) *AdminServer {
|
|
return &AdminServer{db: db, logger: logger}
|
|
}
|
|
|
|
func (s *AdminServer) Start(address string) {
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc("/db", s.dbHandler)
|
|
s.logger.Info("admin server listening", "address", address)
|
|
if err := http.ListenAndServe(address, mux); err != nil {
|
|
s.logger.Error("admin server stopped", "error", err)
|
|
}
|
|
}
|
|
|
|
func (s *AdminServer) dbHandler(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
entries, err := ListByPrefix(s.db, r.URL.Query().Get("prefix"))
|
|
if err != nil {
|
|
http.Error(w, "db error: "+err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
keys := make([]string, 0, len(entries))
|
|
for k := range entries {
|
|
keys = append(keys, k)
|
|
}
|
|
sort.Strings(keys)
|
|
|
|
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
|
for _, k := range keys {
|
|
fmt.Fprintf(w, "%s=%s\n", k, entries[k])
|
|
}
|
|
}
|