From 1082d81963284c39ca06f8ce3e37d47d5a57ba6a Mon Sep 17 00:00:00 2001 From: Ruidy Nemausat Date: Wed, 18 Mar 2020 09:22:54 +0100 Subject: [PATCH] homeHandler + page index + template home; fixed page save/update flow,page data formatting --- controllers/home.go | 17 +++++++++++++---- controllers/page.go | 13 +++++++++---- controllers/router.go | 4 ++-- data/pageStore.go | 40 +++++++++++++++++++-------------------- main.go | 14 +++++++------- models/page.go | 14 +++++++++----- models/user.go | 3 +-- views/templates/home.html | 11 +++++++++++ 8 files changed, 72 insertions(+), 44 deletions(-) diff --git a/controllers/home.go b/controllers/home.go index 54cc680..7fbf9f7 100644 --- a/controllers/home.go +++ b/controllers/home.go @@ -4,15 +4,24 @@ import ( "log" "net/http" + "github.com/rjNemo/go-wiki/data" + "github.com/rjNemo/go-wiki/models" "github.com/rjNemo/go-wiki/services" "github.com/rjNemo/go-wiki/views" ) -// type HomeHandler struct { -// } +// HomeHandler responds to requests using Handlers +type HomeHandler struct { + Ctx data.Context +} -func homeHandler(w http.ResponseWriter, r *http.Request) { - views.Template(w, "home", nil) +func (hh HomeHandler) home(w http.ResponseWriter, r *http.Request) { + index, err := hh.Ctx.Pages.GetAll() + if err != nil { + log.Fatal(err) + } + + views.Template(w, "home", struct{ Wikis []models.Page }{index}) } func contactHandler(w http.ResponseWriter, r *http.Request) { diff --git a/controllers/page.go b/controllers/page.go index ce0c258..94c9d9c 100644 --- a/controllers/page.go +++ b/controllers/page.go @@ -1,6 +1,7 @@ package controllers import ( + "log" "net/http" "github.com/rjNemo/go-wiki/data" @@ -11,7 +12,7 @@ import ( // PageHandler will respond to requests using Handlers type PageHandler struct { Ctx data.Context -} //and add each actual handler as a method +} // func viewHandler(w http.ResponseWriter, r *http.Request, title string) { func (ph PageHandler) view(w http.ResponseWriter, r *http.Request, title string) { @@ -35,13 +36,17 @@ func (ph PageHandler) edit(w http.ResponseWriter, r *http.Request, title string) func (ph PageHandler) save(w http.ResponseWriter, r *http.Request, title string) { body := r.FormValue("body") - p := models.NewPage(0, title, []byte(body)) - // err := p.Save() if !ph.Ctx.Pages.Exists(title) { + p := models.NewPage(0, title, []byte(body)) ph.Ctx.Pages.Add(*p) } else { - ph.Ctx.Pages.Update(p.ID(), *p) + p, err := ph.Ctx.Pages.Get(title) + if err != nil { + log.Fatal(err) + } + p.SetBody([]byte(body)) + ph.Ctx.Pages.Update(p.ID(), p) } // checkError(err, w) diff --git a/controllers/router.go b/controllers/router.go index 8c7b25a..c15ce81 100644 --- a/controllers/router.go +++ b/controllers/router.go @@ -6,13 +6,13 @@ import ( ) // Router dispatch the request to the corresponding route handlers. -func Router(ph PageHandler) { +func Router(ph PageHandler, hh HomeHandler) { // http.HandleFunc("/", loveHandler) http.HandleFunc("/view/", makeHandler(ph.view)) http.HandleFunc("/edit/", makeHandler(ph.edit)) http.HandleFunc("/save/", makeHandler(ph.save)) http.HandleFunc("/contact/", contactHandler) - http.HandleFunc("/", homeHandler) + http.HandleFunc("/", hh.home) } func makeHandler(fn func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc { diff --git a/data/pageStore.go b/data/pageStore.go index b5c8e31..b86a62f 100644 --- a/data/pageStore.go +++ b/data/pageStore.go @@ -3,6 +3,7 @@ package data import ( "database/sql" "log" + "strings" "github.com/rjNemo/go-wiki/models" ) @@ -18,20 +19,20 @@ func NewPageStore(db *sql.DB) PageStore { } // CreateTable creates the page table in the database if it exits not yet. -func (us PageStore) CreateTable() { - if _, err := us.db.Exec(CreateTablePages); err != nil { +func (ps PageStore) CreateTable() { + if _, err := ps.db.Exec(CreateTablePages); err != nil { log.Fatal(err) } // log.Print("Table successfully created!") } // GetAll retrieves all the pages from the database. -func (us PageStore) GetAll() ([]models.Page, error) { +func (ps PageStore) GetAll() ([]models.Page, error) { var id int var title string var body []byte - rows, err := us.db.Query(GetAllPages) + rows, err := ps.db.Query(GetAllPages) if err != nil { return nil, err } @@ -49,12 +50,12 @@ func (us PageStore) GetAll() ([]models.Page, error) { } // Get retrieves the page identified by 'id' from database -func (us PageStore) Get(t string) (models.Page, error) { +func (ps PageStore) Get(t string) (models.Page, error) { var id int var title string var body []byte - - row := us.db.QueryRow(GetPage, t) + t = strings.Title(t) + row := ps.db.QueryRow(GetPage, t) switch err := row.Scan(&id, &title, &body); err { case sql.ErrNoRows: log.Println("No entry returned") @@ -68,9 +69,9 @@ func (us PageStore) Get(t string) (models.Page, error) { } // Add inserts a page in the database. -func (us PageStore) Add(u models.Page) { +func (ps PageStore) Add(u models.Page) { id := 0 - err := us.db.QueryRow(InsertPage, u.Title(), u.Body()).Scan(&id) + err := ps.db.QueryRow(InsertPage, u.Title(), u.Body()).Scan(&id) if err != nil { log.Fatal(err) // too severe } @@ -78,8 +79,8 @@ func (us PageStore) Add(u models.Page) { } // Update edits page identified by 'id' in the database -func (us PageStore) Update(id int, u models.Page) { - res, err := us.db.Exec(UpdatePage, id, u.Title(), u.Body()) +func (ps PageStore) Update(id int, u models.Page) { + res, err := ps.db.Exec(UpdatePage, id, u.Title(), string(u.Body())) if err != nil { log.Fatal(err) // too severe } @@ -93,8 +94,8 @@ func (us PageStore) Update(id int, u models.Page) { } // Delete removes page identified by 'id' from the database -func (us PageStore) Delete(id int) { - res, err := us.db.Exec(QueryDelete, id) +func (ps PageStore) Delete(id int) { + res, err := ps.db.Exec(QueryDelete, id) if err != nil { log.Fatal(err) // too severe } @@ -107,22 +108,21 @@ func (us PageStore) Delete(id int) { } } -func (ps PageStore) Exists(title string) bool { - var e bool - err := ps.db.QueryRow(ExistsPage, title).Scan(&e) - log.Println("e:", e) +// Exists returns true if the page named title exists, false otherwise +func (ps PageStore) Exists(title string) (e bool) { + err := ps.db.QueryRow(ExistsPage, strings.Title(title)).Scan(&e) if err != nil { log.Fatal(err) // too severe } - return e //== title + return e } // Find retrieves a page from the database using an expression -// func (us PageStore) Find(k interface{}, v interface{}) ([]models.Page, error) { +// func (ps PageStore) Find(k interface{}, v interface{}) ([]models.Page, error) { // var id, title int // var body, lastName, email string -// rows, err := us.db.Query(QueryFind, k, v) +// rows, err := ps.db.Query(QueryFind, k, v) // if err != nil { // return nil, err // } diff --git a/main.go b/main.go index 16dffb1..96d2cb7 100644 --- a/main.go +++ b/main.go @@ -10,6 +10,7 @@ import ( ) func main() { + log.Println("*** Go-wiki v0.1 ©2020 ***") // connect to db db, err := data.NewDB(settings.ConnStr) if err != nil { @@ -18,20 +19,19 @@ func main() { // register store and inject them in handlers ctx := data.NewContext(db) + + // Migrate db … ctx.Pages.CreateTable() // ctx.Users.CreateTable() + // create handlers around context + hh := controllers.HomeHandler{Ctx: ctx} ph := controllers.PageHandler{Ctx: ctx} // uh := controllers.UserHandler{Users: UserStore} - // startServer(, controllers.Router) + // startServer log.Printf("Start Go-wiki server on http://localhost:%s", settings.Port) port := ":" + settings.Port - controllers.Router(ph) + controllers.Router(ph, hh) log.Fatal(http.ListenAndServe(port, nil)) } - -// func startServer(p string, r func()) { -// } - -// // appBuilder diff --git a/models/page.go b/models/page.go index 2f5b42b..6af407f 100644 --- a/models/page.go +++ b/models/page.go @@ -2,6 +2,7 @@ package models import ( "io/ioutil" + "strings" ) // A Page own a wiki page data and has a title and a body. @@ -43,14 +44,17 @@ func BlankPage() *Page { // NewPage constructor returns a pointer to a sample Page. func NewPage(id int, title string, body []byte) *Page { - return &Page{id: id, title: title, body: body} + return &Page{ + id: id, + title: strings.Title(title), + body: body} } // Save a page to the 'data/' folder in txt format. -func (p *Page) Save() error { - fileName := "data/files/" + p.title + ".txt" - return ioutil.WriteFile(fileName, p.body, 0600) -} +// func (p *Page) Save() error { +// fileName := "data/files/" + p.title + ".txt" +// return ioutil.WriteFile(fileName, p.body, 0600) +// } // LoadPage reads a saved page data and returns a pointer to the Page. func LoadPage(title string) (*Page, error) { diff --git a/models/user.go b/models/user.go index 9bce789..3ffa6f0 100644 --- a/models/user.go +++ b/models/user.go @@ -30,8 +30,7 @@ func NewUser(id, age int, first, last, email string) User { firstName: strings.Title(first), lastName: strings.Title(last), email: strings.ToLower(email), - age: age, - } + age: age} } // ID is a getter diff --git a/views/templates/home.html b/views/templates/home.html index 9aa97ee..7094bfe 100644 --- a/views/templates/home.html +++ b/views/templates/home.html @@ -14,5 +14,16 @@ >Documentation +
+

Index

+

Some description

+ +
{{end}}