diff options
| author | jason | 2014-12-30 22:08:30 -0700 |
|---|---|---|
| committer | jason | 2014-12-30 22:09:03 -0700 |
| commit | ff408df58ba6b7e21b9b0ce387c2fb477b19a53b (patch) | |
| tree | 24a047093b464d4a166b01f4c0f1c9d44f6e2762 | |
| parent | ad04b8eb19a6da1e78b75f6ba7b5722153f589ff (diff) | |
| download | dossier-ff408df58ba6b7e21b9b0ce387c2fb477b19a53b.tar.gz dossier-ff408df58ba6b7e21b9b0ce387c2fb477b19a53b.zip | |
Basic file saving web server.
| -rw-r--r-- | src/dossier/wiki/handlers.go | 44 | ||||
| -rw-r--r-- | src/dossier/wiki/page.go | 17 | ||||
| -rw-r--r-- | src/dossier/wiki/utils.go | 14 |
3 files changed, 75 insertions, 0 deletions
diff --git a/src/dossier/wiki/handlers.go b/src/dossier/wiki/handlers.go new file mode 100644 index 0000000..4f241eb --- /dev/null +++ b/src/dossier/wiki/handlers.go | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | package wiki | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "fmt" | ||
| 5 | "net/http" | ||
| 6 | ) | ||
| 7 | |||
| 8 | func SaveHandler(w http.ResponseWriter, r *http.Request) { | ||
| 9 | var title string = r.URL.Path[len("/save/"):] | ||
| 10 | body := r.FormValue("body") | ||
| 11 | p := &Page{Title: title, Body: []byte(body)} | ||
| 12 | var err error = p.Save() | ||
| 13 | if err != nil { | ||
| 14 | fmt.Fprintf(w, "500: %s", err) | ||
| 15 | return | ||
| 16 | } | ||
| 17 | http.Redirect(w, r, "/view/"+title, http.StatusFound) | ||
| 18 | } | ||
| 19 | |||
| 20 | func EditHandler(w http.ResponseWriter, r *http.Request) { | ||
| 21 | var title string = r.URL.Path[len("/edit/"):] | ||
| 22 | p, err := loadPage(title) | ||
| 23 | if err != nil { | ||
| 24 | p = &Page{Title: title} | ||
| 25 | } | ||
| 26 | fmt.Fprintf(w, "<h1>Editing %s</h1>"+ | ||
| 27 | "<form action=\"/save/%s\" method=\"POST\">"+ | ||
| 28 | "<textarea name=\"body\">%s</textarea><br>"+ | ||
| 29 | "<input type=\"submit\" value=\"Save\">"+ | ||
| 30 | "</form>", | ||
| 31 | p.Title, p.Title, p.Body) | ||
| 32 | } | ||
| 33 | |||
| 34 | func PageHandler(w http.ResponseWriter, r *http.Request) { | ||
| 35 | var title string = r.URL.Path[len("/view/"):] | ||
| 36 | |||
| 37 | p, err := loadPage(title) | ||
| 38 | if err != nil { | ||
| 39 | http.Redirect(w, r, "/edit/"+title, http.StatusFound) | ||
| 40 | return | ||
| 41 | } | ||
| 42 | |||
| 43 | fmt.Fprintf(w, "<h1>%s</h1><hr>%s", p.Title, p.Body) | ||
| 44 | } | ||
diff --git a/src/dossier/wiki/page.go b/src/dossier/wiki/page.go new file mode 100644 index 0000000..2bf1368 --- /dev/null +++ b/src/dossier/wiki/page.go | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | package wiki | ||
| 2 | |||
| 3 | import ( | ||
| 4 | "io/ioutil" | ||
| 5 | ) | ||
| 6 | |||
| 7 | const FILE_EXTENSION string = ".md" | ||
| 8 | |||
| 9 | type Page struct { | ||
| 10 | Title string | ||
| 11 | Body []byte // markdown filled body | ||
| 12 | } | ||
| 13 | |||
| 14 | func (p *Page) Save() error { | ||
| 15 | filename := p.Title + FILE_EXTENSION | ||
| 16 | return ioutil.WriteFile(filename, p.Body, 0600) | ||
| 17 | } | ||
diff --git a/src/dossier/wiki/utils.go b/src/dossier/wiki/utils.go new file mode 100644 index 0000000..58e98f7 --- /dev/null +++ b/src/dossier/wiki/utils.go | |||
| @@ -0,0 +1,14 @@ | |||
| 1 | package wiki | ||
| 2 | |||
| 3 | import "io/ioutil" | ||
| 4 | |||
| 5 | func loadPage(title string) (*Page, error) { | ||
| 6 | var filename string = title + FILE_EXTENSION | ||
| 7 | |||
| 8 | body, err := ioutil.ReadFile(filename) | ||
| 9 | if err != nil { | ||
| 10 | return nil, err | ||
| 11 | } | ||
| 12 | |||
| 13 | return &Page{Title: title, Body: body}, nil | ||
| 14 | } | ||