add leaf parser, http writer to limit title instances

master
Bel LaPointe 2022-02-17 10:49:45 -07:00
parent 3a9f2c831e
commit 3addc717a3
3 changed files with 50 additions and 21 deletions

View File

@ -1,6 +1,7 @@
package main package main
import ( import (
"bytes"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@ -354,12 +355,14 @@ func (server *Server) apiV0FilesPostHandler(w http.ResponseWriter, r *http.Reque
if err != nil { if err != nil {
return err return err
} }
r.Body = io.NopCloser(bytes.NewReader(b))
pid := server.fileId(r) pid := server.fileId(r)
id := NewID(pid).Push(strings.Split(uuid.New().String(), "-")[0]) id := NewID(pid).Push(strings.Split(uuid.New().String(), "-")[0])
leaf := Leaf{} leaf, err := NewHTTPRequestLeaf(r)
leaf.Meta.Title = r.Header.Get("Title") if err != nil {
leaf.Content = string(b) return err
}
if err := server.tree().Put(id, leaf); err != nil { if err := server.tree().Put(id, leaf); err != nil {
return err return err
} }
@ -384,9 +387,7 @@ func (server *Server) apiV0FilesIDGetHandler(w http.ResponseWriter, r *http.Requ
return err return err
} }
w.Header().Set("Title", leaf.Meta.Title) return leaf.WriteHTTP(w)
_, err = w.Write([]byte(leaf.Content))
return err
} }
func (server *Server) apiV0FilesIDDelHandler(w http.ResponseWriter, r *http.Request) error { 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 { } else if err != nil {
return err return err
} }
b, err := ioutil.ReadAll(r.Body)
updatedLeaf, err := NewHTTPRequestLeaf(r)
if err != nil { if err != nil {
return err return err
} }
leaf = leaf.Merge(updatedLeaf)
leaf.Content = string(b)
leaf.Meta.Title = r.Header.Get("Title")
leaf.Meta.Deleted = false
if err := server.tree().Put(id, leaf); err != nil { if err := server.tree().Put(id, leaf); err != nil {
return err return err

View File

@ -31,17 +31,15 @@ func TestServerRoutes(t *testing.T) {
ensureAndWrite(server.diskMediaPath("delid"), []byte("hi")) ensureAndWrite(server.diskMediaPath("delid"), []byte("hi"))
tree := server.tree() tree := server.tree()
leaf := Leaf{Content: "getfid body"} leaf, _ := NewLeaf("", "getfid body")
if err := tree.Put(NewID("getfid"), leaf); err != nil { if err := tree.Put(NewID("getfid"), leaf); err != nil {
t.Fatal(err) t.Fatal(err)
} }
leaf.Meta.Title = "putfid title" leaf, _ = NewLeaf("putfid title", "initial putfid body")
leaf.Content = "initial putfid body"
tree.Put(NewID("putfid"), leaf) tree.Put(NewID("putfid"), leaf)
leaf.Meta.Title = "delfid title" leaf, _ = NewLeaf("delfid title", "delfid body")
leaf.Content = "delfid body"
tree.Put(NewID("delfid"), leaf) tree.Put(NewID("delfid"), leaf)
t.Log(tree.GetRoot()) t.Log(tree.GetRoot())

View File

@ -2,13 +2,43 @@ package main
import ( import (
"encoding/json" "encoding/json"
"io"
"io/ioutil" "io/ioutil"
"net/http"
"os" "os"
"path" "path"
"strings"
yaml "gopkg.in/yaml.v2" 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 { type Branch struct {
Leaf Leaf Leaf Leaf
Branches map[ID]Branch Branches map[ID]Branch
@ -34,11 +64,13 @@ func (branch Branch) forEach(preid ID, foo func(ID, Leaf) error) error {
return nil return nil
} }
type Meta struct {
Title string
Deleted bool
}
type Leaf struct { type Leaf struct {
Meta struct { Meta Meta
Title string
Deleted bool
}
Content string Content string
} }
@ -150,7 +182,7 @@ func (tree Tree) getRoot(pid ID, withContent, withDeleted bool) (Branch, error)
m.Leaf.Content = "" m.Leaf.Content = ""
} }
if m.Leaf.Meta.Deleted && !withDeleted { if m.Leaf.Meta.Deleted && !withDeleted {
return m, nil return Branch{Branches: map[ID]Branch{}}, nil
} }
} else if entry.IsDir() { } else if entry.IsDir() {
subtree := tree.WithRoot(path.Join(tree.root, entry.Name())) subtree := tree.WithRoot(path.Join(tree.root, entry.Name()))