From 3addc717a3bf3673d72a5857d03dfd8cc7f3170b Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Thu, 17 Feb 2022 10:49:45 -0700 Subject: [PATCH] add leaf parser, http writer to limit title instances --- server/server.go | 21 ++++++++++----------- server/server_test.go | 8 +++----- server/tree.go | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 50 insertions(+), 21 deletions(-) diff --git a/server/server.go b/server/server.go index c1b3a2a..154e439 100644 --- a/server/server.go +++ b/server/server.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/json" "errors" "fmt" @@ -354,12 +355,14 @@ func (server *Server) apiV0FilesPostHandler(w http.ResponseWriter, r *http.Reque if err != nil { return err } + r.Body = io.NopCloser(bytes.NewReader(b)) pid := server.fileId(r) id := NewID(pid).Push(strings.Split(uuid.New().String(), "-")[0]) - leaf := Leaf{} - leaf.Meta.Title = r.Header.Get("Title") - leaf.Content = string(b) + leaf, err := NewHTTPRequestLeaf(r) + if err != nil { + return err + } if err := server.tree().Put(id, leaf); err != nil { return err } @@ -384,9 +387,7 @@ func (server *Server) apiV0FilesIDGetHandler(w http.ResponseWriter, r *http.Requ return err } - w.Header().Set("Title", leaf.Meta.Title) - _, err = w.Write([]byte(leaf.Content)) - return err + return leaf.WriteHTTP(w) } func (server *Server) apiV0FilesIDDelHandler(w http.ResponseWriter, r *http.Request) error { @@ -427,14 +428,12 @@ func (server *Server) apiV0FilesIDPutHandler(w http.ResponseWriter, r *http.Requ } else if err != nil { return err } - b, err := ioutil.ReadAll(r.Body) + + updatedLeaf, err := NewHTTPRequestLeaf(r) if err != nil { return err } - - leaf.Content = string(b) - leaf.Meta.Title = r.Header.Get("Title") - leaf.Meta.Deleted = false + leaf = leaf.Merge(updatedLeaf) if err := server.tree().Put(id, leaf); err != nil { return err diff --git a/server/server_test.go b/server/server_test.go index df5d51c..3785817 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -31,17 +31,15 @@ func TestServerRoutes(t *testing.T) { ensureAndWrite(server.diskMediaPath("delid"), []byte("hi")) tree := server.tree() - leaf := Leaf{Content: "getfid body"} + leaf, _ := NewLeaf("", "getfid body") if err := tree.Put(NewID("getfid"), leaf); err != nil { t.Fatal(err) } - leaf.Meta.Title = "putfid title" - leaf.Content = "initial putfid body" + leaf, _ = NewLeaf("putfid title", "initial putfid body") tree.Put(NewID("putfid"), leaf) - leaf.Meta.Title = "delfid title" - leaf.Content = "delfid body" + leaf, _ = NewLeaf("delfid title", "delfid body") tree.Put(NewID("delfid"), leaf) t.Log(tree.GetRoot()) diff --git a/server/tree.go b/server/tree.go index ea3f7f0..535ba38 100644 --- a/server/tree.go +++ b/server/tree.go @@ -2,13 +2,43 @@ package main import ( "encoding/json" + "io" "io/ioutil" + "net/http" "os" "path" + "strings" yaml "gopkg.in/yaml.v2" ) +func NewHTTPRequestLeaf(r *http.Request) (Leaf, error) { + var leaf Leaf + if b, err := ioutil.ReadAll(r.Body); err != nil { + return leaf, err + } else { + leaf.Content = string(b) + } + if leaf.Meta.Title = r.Header.Get("Title"); leaf.Meta.Title == "" { + leaf.Meta.Title = "Untitled" + } + leaf.Meta.Deleted = r.Method == http.MethodDelete + return leaf, nil +} + +func NewLeaf(title string, content string) (Leaf, error) { + return NewHTTPRequestLeaf(&http.Request{ + Header: http.Header{"Title": []string{title}}, + Body: io.NopCloser(strings.NewReader(content)), + }) +} + +func (leaf Leaf) WriteHTTP(w http.ResponseWriter) error { + w.Header().Set("Title", leaf.Meta.Title) + _, err := w.Write([]byte(leaf.Content)) + return err +} + type Branch struct { Leaf Leaf Branches map[ID]Branch @@ -34,11 +64,13 @@ func (branch Branch) forEach(preid ID, foo func(ID, Leaf) error) error { return nil } +type Meta struct { + Title string + Deleted bool +} + type Leaf struct { - Meta struct { - Title string - Deleted bool - } + Meta Meta Content string } @@ -150,7 +182,7 @@ func (tree Tree) getRoot(pid ID, withContent, withDeleted bool) (Branch, error) m.Leaf.Content = "" } if m.Leaf.Meta.Deleted && !withDeleted { - return m, nil + return Branch{Branches: map[ID]Branch{}}, nil } } else if entry.IsDir() { subtree := tree.WithRoot(path.Join(tree.root, entry.Name()))