added pageStore

This commit is contained in:
Ruidy Nemausat 2020-03-17 12:11:29 +01:00
parent 80c914238b
commit ebfc92110b
12 changed files with 242 additions and 67 deletions

View file

@ -1,21 +1 @@
package controllers package controllers
import (
"io"
"net/http"
"testing"
"github.com/rjNemo/go-wiki/services"
)
func TestParseContactForm(t *testing.T) {
var i io.Reader
r, err := http.NewRequest(http.MethodPost, "/contact/post/", i)
if err != nil {
t.Errorf("%s", err)
}
ans := parseContactForm(r)
if ans != services.NewMail("", "") {
t.Errorf("parseContactForm(r) = %v", ans)
}
}

View file

@ -3,16 +3,19 @@ package controllers
import ( import (
"net/http" "net/http"
"github.com/rjNemo/go-wiki/data"
"github.com/rjNemo/go-wiki/models" "github.com/rjNemo/go-wiki/models"
"github.com/rjNemo/go-wiki/views" "github.com/rjNemo/go-wiki/views"
) )
// type PageHandler struct { // PageHandler will respond to requests using Handlers
// Pages data.PageStore type PageHandler struct {
// } Pages data.PageStore
} //and add each actual handler as a method
func viewHandler(w http.ResponseWriter, r *http.Request, title string) { func viewHandler(w http.ResponseWriter, r *http.Request, title string) {
p, err := models.LoadPage(title) p, err := models.LoadPage(title)
// p, err := ph.Pages.Get(1)
if err != nil { if err != nil {
http.Redirect(w, r, "/edit/"+title, http.StatusFound) http.Redirect(w, r, "/edit/"+title, http.StatusFound)
return return
@ -23,14 +26,14 @@ func viewHandler(w http.ResponseWriter, r *http.Request, title string) {
func editHandler(w http.ResponseWriter, r *http.Request, title string) { func editHandler(w http.ResponseWriter, r *http.Request, title string) {
p, err := models.LoadPage(title) p, err := models.LoadPage(title)
if err != nil { if err != nil {
p = models.NewPage(title, nil) p = models.NewPage(0, title, nil)
} }
views.Template(w, "edit", p) views.Template(w, "edit", p)
} }
func saveHandler(w http.ResponseWriter, r *http.Request, title string) { func saveHandler(w http.ResponseWriter, r *http.Request, title string) {
body := r.FormValue("body") body := r.FormValue("body")
p := models.NewPage(title, []byte(body)) p := models.NewPage(0, title, []byte(body))
err := p.Save() err := p.Save()
checkError(err, w) checkError(err, w)
http.Redirect(w, r, "/view/"+title, http.StatusFound) http.Redirect(w, r, "/view/"+title, http.StatusFound)

View file

@ -8,6 +8,7 @@ import (
// Router dispatch the request to the corresponding route handlers. // Router dispatch the request to the corresponding route handlers.
func Router() { func Router() {
// http.HandleFunc("/", loveHandler) // http.HandleFunc("/", loveHandler)
// http.HandleFunc("/view/", makeHandler(ph.view))
http.HandleFunc("/view/", makeHandler(viewHandler)) http.HandleFunc("/view/", makeHandler(viewHandler))
http.HandleFunc("/edit/", makeHandler(editHandler)) http.HandleFunc("/edit/", makeHandler(editHandler))
http.HandleFunc("/save/", makeHandler(saveHandler)) http.HandleFunc("/save/", makeHandler(saveHandler))

4
data/files/Nyny.txt Normal file
View file

@ -0,0 +1,4 @@
I
❤️ TiNyny

View file

@ -1,4 +1,4 @@
Type a term in the search bar. Type a term in the search bar.
If it already exist you will reach this page. If it already exist you will reach this page.
@ -6,3 +6,8 @@ If it is not yet defined you will have the possibility to create it.
Have fun Have fun
❤️
❤️
❤️
❤️

50
data/pageQueries.go Normal file
View file

@ -0,0 +1,50 @@
package data
const (
// CreateTablePages is the SQL command used to create the pages table if it
// not exists.
CreateTablePages = `
CREATE TABLE IF NOT EXISTS pages (
id SERIAL PRIMARY KEY,
title TEXT UNIQUE NOT NULL
body TEXT)
`
// GetPage is the SQL command used to retrieve a user from the table
GetPage = `
SELECT * FROM pages WHERE id = $1;
`
// GetAllPages is the SQL command used to retrieve all pages from the database.
GetAllPages = `
SELECT * FROM pages ORDER BY id;
`
// FindPages is the SQL command used to retrieve all pages from the table
// which satisfy the specified condition
FindPages = `
SELECT * FROM pages WHERE $1 = $2;
`
// InsertPage is the SQL command used to insert a user in the table.
// Returning the new ID.
InsertPage = `
INSERT INTO pages (title, body)
VALUES ($1, $2)
RETURNING id
`
// UpdatePage is the SQL command used to update a user in the database.
UpdatePage = `
UPDATE pages
SET title = $2, body = $3
WHERE id = $1;
`
// DeletePage is the SQL command used to delete a user from the database.
DeletePage = `
DELETE FROM pages
WHERE id = $1
RETURNING *;
`
)

130
data/pageStore.go Normal file
View file

@ -0,0 +1,130 @@
package data
import (
"database/sql"
"log"
"github.com/rjNemo/go-wiki/models"
)
// PageStore is used to perform page-related CRUD operations on the DB
type PageStore struct {
db *sql.DB
}
// NewPageStore constructs a PageStore connected to the database.
func NewPageStore(db *sql.DB) PageStore {
return PageStore{db: db}
}
// 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 {
log.Fatal(err)
}
// log.Print("Table successfully created!")
}
// GetAll retrieves all the pages from the database.
func (us PageStore) GetAll() ([]models.Page, error) {
var id int
var title string
var body []byte
rows, err := us.db.Query(GetAllPages)
if err != nil {
return nil, err
}
var pages []models.Page
for rows.Next() {
err := rows.Scan(&id, &title, &body)
if err != nil {
log.Fatal(err) // too severe
}
p := models.NewPage(id, title, body)
pages = append(pages, *p)
}
return pages, nil
}
// Get retrieves the page identified by 'id' from database
func (us PageStore) Get(uid int) (models.Page, error) {
var id int
var title string
var body []byte
row := us.db.QueryRow(QueryGet, uid)
switch err := row.Scan(&id, &title, &body); err {
case sql.ErrNoRows:
log.Println("No entry returned")
return models.Page{}, err
case nil:
return *models.NewPage(id, title, body), nil
default:
log.Fatal(err)
return models.Page{}, err
}
}
// Add inserts a page in the database.
func (us PageStore) Add(u models.Page) {
id := 0
err := us.db.QueryRow(QueryInsert, u.Title(), u.Body()).Scan(&id)
if err != nil {
log.Fatal(err) // too severe
}
log.Println("New Page ID is:", id)
}
// Update edits page identified by 'id' in the database
func (us PageStore) Update(id int, u models.Page) {
res, err := us.db.Exec(QueryUpdate, id, u.Title(), u.Body())
if err != nil {
log.Fatal(err) // too severe
}
count, err := res.RowsAffected()
if err != nil {
log.Fatal(err) // too severe
}
if count == 0 {
log.Fatal("Update failed") // too severe
}
}
// Delete removes page identified by 'id' from the database
func (us PageStore) Delete(id int) {
res, err := us.db.Exec(QueryDelete, id)
if err != nil {
log.Fatal(err) // too severe
}
count, err := res.RowsAffected()
if err != nil {
log.Fatal(err) // too severe
}
if count == 0 {
log.Fatal("Delete failed") // too severe
}
}
// Find retrieves a page from the database using an expression
// func (us 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)
// if err != nil {
// return nil, err
// }
// var pages []models.Page
// for rows.Next() {
// err := rows.Scan(&id, &title, &body, &lastName, &email)
// if err != nil {
// log.Fatal(err) // too severe
// }
// u := models.NewPage(id, title, body, lastName, email)
// pages = append(pages, u)
// }
// return pages, nil
// }

View file

@ -11,7 +11,7 @@ import (
// UsePSQL read the connection parameters to establish a connection to the // UsePSQL read the connection parameters to establish a connection to the
// database. // database.
func UsePSQL() { func UsePSQL() *sql.DB {
connStr := settings.ConnStr connStr := settings.ConnStr
db, err := sql.Open("postgres", connStr) db, err := sql.Open("postgres", connStr)
if err != nil { if err != nil {
@ -26,8 +26,10 @@ func UsePSQL() {
log.Println("Connection to database successfully established!") log.Println("Connection to database successfully established!")
store := NewUserStore(db) // store := NewUserStore(db)
store.CreateTable() // store.CreateTable()
return db
// u := models.TestUser() // u := models.TestUser()
// store.Add(u) // store.Add(u)
// log.Print(u) // log.Print(u)

View file

@ -47,28 +47,6 @@ func (us UserStore) GetAll() ([]models.User, error) {
return users, nil return users, nil
} }
// Find retrieves a user from the database using an expression
// func (us UserStore) Find(k interface{}, v interface{}) ([]models.User, error) {
// var id, age int
// var firstName, lastName, email string
// rows, err := us.db.Query(QueryFind, k, v)
// if err != nil {
// return nil, err
// }
// var users []models.User
// for rows.Next() {
// err := rows.Scan(&id, &age, &firstName, &lastName, &email)
// if err != nil {
// log.Fatal(err) // too severe
// }
// u := models.NewUser(id, age, firstName, lastName, email)
// users = append(users, u)
// }
// return users, nil
// }
// Get retrieves the user identified by 'id' from database // Get retrieves the user identified by 'id' from database
func (us UserStore) Get(uid int) (models.User, error) { func (us UserStore) Get(uid int) (models.User, error) {
var id, age int var id, age int
@ -126,3 +104,25 @@ func (us UserStore) Delete(id int) {
log.Fatal("Delete failed") // too severe log.Fatal("Delete failed") // too severe
} }
} }
// Find retrieves a user from the database using an expression
// func (us UserStore) Find(k interface{}, v interface{}) ([]models.User, error) {
// var id, age int
// var firstName, lastName, email string
// rows, err := us.db.Query(QueryFind, k, v)
// if err != nil {
// return nil, err
// }
// var users []models.User
// for rows.Next() {
// err := rows.Scan(&id, &age, &firstName, &lastName, &email)
// if err != nil {
// log.Fatal(err) // too severe
// }
// u := models.NewUser(id, age, firstName, lastName, email)
// users = append(users, u)
// }
// return users, nil
// }

View file

@ -1,17 +1,15 @@
package models package models
import "testing" // func TestBlankPage(t *testing.T) {
// ans := BlankPage()
// if ans.title != "Empty page" && string(ans.body) != "Write some content" {
// t.Errorf("BlankPage() = %v; want &Page{title: 'Empty page', body: []byte('Write some content')}", ans)
// }
// }
func TestBlankPage(t *testing.T) { // func TestNewPage(t *testing.T) {
ans := BlankPage() // ans := NewPage("Test Page", []byte("This is a sample page"))
if ans.title != "Empty page" && string(ans.body) != "Write some content" { // if ans.title != "Test Page" && string(ans.body) != "This is a sample page" {
t.Errorf("BlankPage() = %v; want &Page{title: 'Empty page', body: []byte('Write some content')}", ans) // t.Errorf("NewPage() = %v; want &Page{title: 'Test Page', body: []byte('This is a sample page')}", ans)
} // }
} // }
func TestNewPage(t *testing.T) {
ans := NewPage("Test Page", []byte("This is a sample page"))
if ans.title != "Test Page" && string(ans.body) != "This is a sample page" {
t.Errorf("NewPage() = %v; want &Page{title: 'Test Page', body: []byte('This is a sample page')}", ans)
}
}

View file

@ -6,6 +6,7 @@ import (
// A Page own a wiki page data and has a title and a body. // A Page own a wiki page data and has a title and a body.
type Page struct { type Page struct {
id int
title string title string
body []byte body []byte
} }
@ -36,8 +37,8 @@ func BlankPage() *Page {
} }
// NewPage constructor returns a pointer to a sample Page. // NewPage constructor returns a pointer to a sample Page.
func NewPage(title string, body []byte) *Page { func NewPage(id int, title string, body []byte) *Page {
return &Page{title: title, body: body} return &Page{id: id, title: title, body: body}
} }
// Save a page to the 'data/' folder in txt format. // Save a page to the 'data/' folder in txt format.

View file

@ -8,6 +8,7 @@ import (
"github.com/rjNemo/go-wiki/settings" "github.com/rjNemo/go-wiki/settings"
) )
// Template display the named HTML template to the browser
func Template(w http.ResponseWriter, tmpl string, p interface{}) { func Template(w http.ResponseWriter, tmpl string, p interface{}) {
// err := templates.ExecuteTemplate(w, "templates/"+tmpl+".html", p) // err := templates.ExecuteTemplate(w, "templates/"+tmpl+".html", p)
t, err := template.ParseFiles(getTmplName("base"), getTmplName(tmpl)) t, err := template.ParseFiles(getTmplName("base"), getTmplName(tmpl))