add leaf parser, http writer to limit title instances
parent
3a9f2c831e
commit
3addc717a3
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
|
|
|
||||||
|
|
@ -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 Leaf struct {
|
type Meta struct {
|
||||||
Meta struct {
|
|
||||||
Title string
|
Title string
|
||||||
Deleted bool
|
Deleted bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Leaf struct {
|
||||||
|
Meta Meta
|
||||||
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()))
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue