From a958cdeb99ef1458745506fcce8035ffca5086e1 Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Fri, 13 Mar 2020 14:59:38 +0100 Subject: [PATCH] Base project --- controllers/routes.go | 90 +++++++++++++++++++++++++++++++++++++++++++ data/TestPage.txt | 1 + data/chocolate.txt | 1 + data/test.txt | 1 + go.mod | 3 ++ main.go | 13 +++++++ models/page.go | 32 +++++++++++++++ templates/edit.html | 8 ++++ templates/home.html | 5 +++ templates/love.html | 1 + templates/view.html | 5 +++ 11 files changed, 160 insertions(+) create mode 100644 controllers/routes.go create mode 100644 data/TestPage.txt create mode 100644 data/chocolate.txt create mode 100644 data/test.txt create mode 100644 go.mod create mode 100644 main.go create mode 100644 models/page.go create mode 100644 templates/edit.html create mode 100644 templates/home.html create mode 100644 templates/love.html create mode 100644 templates/view.html diff --git a/controllers/routes.go b/controllers/routes.go new file mode 100644 index 0000000..8a06311 --- /dev/null +++ b/controllers/routes.go @@ -0,0 +1,90 @@ +package controllers + +import ( + "html/template" + "log" + "net/http" + "regexp" + + "github.com/rjNemo/go-wiki/models" +) + +// func ParseTemplates() *template.Template { +// return template.Must(template.ParseFiles("templates/edit.html", "templates/view.html")) // add slice of fileNAmes +// } + +func RegisteredRoutes() { + // http.HandleFunc("/", loveHandler) + http.HandleFunc("/view/", makeHandler(viewHandler)) + http.HandleFunc("/edit/", makeHandler(editHandler)) + http.HandleFunc("/save/", makeHandler(saveHandler)) + http.HandleFunc("/", homeHandler) + log.Fatal(http.ListenAndServe(":8080", nil)) +} + +// func loveHandler(w http.ResponseWriter, r *http.Request) { +// title := r.URL.Path[1:] +// p := models.NewPage(title, nil) // already a pointer +// renderTemplate(w, "love", p) +// } + +func homeHandler(w http.ResponseWriter, r *http.Request) { + // viewHandler(w, r, "FrontPage") + p := models.BlankPage() + renderTemplate(w, "home", p) +} + +func viewHandler(w http.ResponseWriter, r *http.Request, title string) { + p, err := models.LoadPage(title) + if err != nil { + http.Redirect(w, r, "/edit/"+title, http.StatusFound) + return + } + renderTemplate(w, "view", p) +} + +func editHandler(w http.ResponseWriter, r *http.Request, title string) { + p, err := models.LoadPage(title) + if err != nil { + p = models.NewPage(title, nil) + } + renderTemplate(w, "edit", p) +} + +func saveHandler(w http.ResponseWriter, r *http.Request, title string) { + body := r.FormValue("body") + p := models.NewPage(title, []byte(body)) + err := p.Save() + checkError(err, w) + http.Redirect(w, r, "/view/"+title, http.StatusFound) +} + +// var templates = template.Must(template.ParseFiles("templates/edit.html", "templates/view.html")) // add slice of fileNAmes + +func renderTemplate(w http.ResponseWriter, tmpl string, p *models.Page) { + // err := templates.ExecuteTemplate(w, "templates/"+tmpl+".html", p) + t, err := template.ParseFiles("templates/" + tmpl + ".html") + checkError(err, w) + err = t.Execute(w, p) + checkError(err, w) +} + +func checkError(err error, w http.ResponseWriter) { + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} + +var validPath = regexp.MustCompile("^/(edit|save|view)/([a-zA-Z0-9]+)$") + +func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { + return func(w http.ResponseWriter, r *http.Request) { + m := validPath.FindStringSubmatch(r.URL.Path) + if m == nil { + http.NotFound(w, r) + return + } + fn(w, r, m[2]) + } +} diff --git a/data/TestPage.txt b/data/TestPage.txt new file mode 100644 index 0000000..18ccb66 --- /dev/null +++ b/data/TestPage.txt @@ -0,0 +1 @@ +This is a sample page \ No newline at end of file diff --git a/data/chocolate.txt b/data/chocolate.txt new file mode 100644 index 0000000..e1853e6 --- /dev/null +++ b/data/chocolate.txt @@ -0,0 +1 @@ +I like it very much \ No newline at end of file diff --git a/data/test.txt b/data/test.txt new file mode 100644 index 0000000..5ab2f8a --- /dev/null +++ b/data/test.txt @@ -0,0 +1 @@ +Hello \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b22ca79 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/rjNemo/go-wiki + +go 1.14 diff --git a/main.go b/main.go new file mode 100644 index 0000000..681a71e --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "fmt" + "time" + + "github.com/rjNemo/go-wiki/controllers" +) + +func main() { + fmt.Printf("Start Go-wiki server at %s\n", time.Now()) + controllers.RegisteredRoutes() +} diff --git a/models/page.go b/models/page.go new file mode 100644 index 0000000..244bb81 --- /dev/null +++ b/models/page.go @@ -0,0 +1,32 @@ +package models + +import "io/ioutil" + +type Page struct { + Title string + Body []byte +} + +// write constructor blank page + +func BlankPage() *Page { + return &Page{Title: "Empty page", Body: []byte("Write some content")} +} + +func NewPage(title string, body []byte) *Page { + return &Page{Title: title, Body: body} +} + +func (p *Page) Save() error { + fileName := "data/" + p.Title + ".txt" + return ioutil.WriteFile(fileName, p.Body, 0600) +} + +func LoadPage(title string) (*Page, error) { + fileName := "data/" + title + ".txt" + body, err := ioutil.ReadFile(fileName) + if err != nil { + return nil, err + } + return &Page{Title: title, Body: body}, nil +} diff --git a/templates/edit.html b/templates/edit.html new file mode 100644 index 0000000..faa9be4 --- /dev/null +++ b/templates/edit.html @@ -0,0 +1,8 @@ +

Editing {{.Title}}

+ +
+
+ +
+
+
diff --git a/templates/home.html b/templates/home.html new file mode 100644 index 0000000..6106acc --- /dev/null +++ b/templates/home.html @@ -0,0 +1,5 @@ +

Hi there, Welcome to Go-Wiki

+ +
+

Useful links

+
diff --git a/templates/love.html b/templates/love.html new file mode 100644 index 0000000..ddc349c --- /dev/null +++ b/templates/love.html @@ -0,0 +1 @@ +

Hi there, I love {{.Title}}

diff --git a/templates/view.html b/templates/view.html new file mode 100644 index 0000000..b1e87ef --- /dev/null +++ b/templates/view.html @@ -0,0 +1,5 @@ +

{{.Title}}

+ +

[edit]

+ +
{{printf "%s" .Body}}