First usable version

This commit is contained in:
Óscar M. Lage 2022-03-22 16:36:18 +01:00
parent c5521ba101
commit 52056ef9a1
12 changed files with 183 additions and 53 deletions

View File

@ -6,6 +6,7 @@ import (
type Page struct { type Page struct {
gorm.Model gorm.Model
Code string Name string
Price uint Body string
Version uint
} }

View File

@ -3,7 +3,8 @@ package model
// Store interface // Store interface
type Store interface { type Store interface {
Open() error Open() error
AddPage() AddPage(string, string) error
GetPage() Page CreatePage(Page) error
GetPage(string) (Page, error)
GetAllPages() ([]Page, error) GetAllPages() ([]Page, error)
} }

View File

@ -2,6 +2,7 @@ package model
import ( import (
"fmt" "fmt"
"gorm.io/driver/sqlite" "gorm.io/driver/sqlite"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -26,15 +27,32 @@ func (s *StoreGorm) Open() error {
return nil return nil
} }
func (s *StoreGorm) AddPage() { func (s *StoreGorm) AddPage(name string, body string) error {
s.db.Create(&Page{Code: "D55", Price: 200}) var home Page
home.Name = name
home.Body = body
home.Version = 1
tx := s.db.Create(&home)
if tx.Error != nil {
return tx.Error
}
fmt.Println("Page created") fmt.Println("Page created")
return nil
} }
func (s *StoreGorm) GetPage() Page { func (s *StoreGorm) CreatePage(page Page) error {
tx := s.db.Save(&page)
return tx.Error
}
func (s *StoreGorm) GetPage(name string) (Page, error) {
var page Page var page Page
s.db.First(&page) tx := s.db.Where("Name = ?", name).First(&page)
return page if tx.Error != nil {
return Page{}, tx.Error
}
fmt.Println(page)
return page, nil
} }
func (s *StoreGorm) GetAllPages() ([]Page, error) { func (s *StoreGorm) GetAllPages() ([]Page, error) {

View File

@ -8,22 +8,85 @@ import (
) )
func WikiHome(c echo.Context) error { func WikiHome(c echo.Context) error {
res, err := store.GetAllPages() var err error
page, err := store.GetPage("WikiHome")
if err != nil {
fmt.Println(err.Error())
err := store.AddPage("WikiHome", "This is the home of the wiki")
if err != nil {
log.Panicln(err.Error())
}
}
fmt.Printf("res: %T\n", page)
return c.Render(http.StatusOK, "page.html", map[string]interface{}{
"page": page,
})
}
func WikiPage(c echo.Context) error {
page_id := c.Param("page")
var err error
page, err := store.GetPage(page_id)
if err != nil {
// If record not found, show the create
if err.Error() == "record not found" {
return c.Render(http.StatusOK, "notfound.html", map[string]interface{}{
"name": page_id,
})
}
}
fmt.Printf("res: %T\n", page)
return c.Render(http.StatusOK, "page.html", map[string]interface{}{
"page": page,
})
}
func WikiPageEdit(c echo.Context) error {
page_id := c.Param("page")
var err error
page, err := store.GetPage(page_id)
if err != nil {
// If record not found, create and show the form
if err.Error() == "record not found" {
err := store.AddPage(page_id, "# "+page_id)
if err != nil {
log.Panicln(err.Error())
}
page, err = store.GetPage(page_id)
if err != nil {
log.Panicln(err)
}
}
}
fmt.Printf("res: %T\n", page)
return c.Render(http.StatusOK, "edit.html", map[string]interface{}{
"page": page,
})
}
func WikiPagePostEdit(c echo.Context) error {
page_id := c.Param("page")
var err error
page, err := store.GetPage(page_id)
if err != nil {
log.Panic(err.Error())
}
page.Body = c.FormValue("html")
store.CreatePage(page)
return c.Redirect(http.StatusMovedPermanently, "/"+page.Name)
}
func WikiList(c echo.Context) error {
pages, err := store.GetAllPages()
if err != nil { if err != nil {
log.Panicln(err) log.Panicln(err)
} }
fmt.Printf("res: %T", res) fmt.Printf("res: %T\n", pages)
return c.Render(http.StatusOK, "home.html", map[string]interface{}{ return c.Render(http.StatusOK, "list.html", map[string]interface{}{
"name": "HOME", "pages": pages,
"msg": "This is the home page.",
"pages": res,
}) })
} }
func WikiAbout(c echo.Context) error { func WikiAbout(c echo.Context) error {
id := c.Param("id") return c.Render(http.StatusOK, "about.html", map[string]interface{}{})
return c.Render(http.StatusOK, "about.html", map[string]interface{}{
"name": "ABOUT",
"msg": "About Wikingo (id:)" + id,
})
} }

View File

@ -47,14 +47,21 @@ func Serve() {
// Instantiate a template registry with an array of template set // Instantiate a template registry with an array of template set
// Ref: https://gist.github.com/rand99/808e6e9702c00ce64803d94abff65678 // Ref: https://gist.github.com/rand99/808e6e9702c00ce64803d94abff65678
templates := make(map[string]*template.Template) templates := make(map[string]*template.Template)
templates["home.html"] = template.Must(template.ParseFiles("views/home.html", "views/base.html")) templates["page.html"] = template.Must(template.ParseFiles("views/page.html", "views/base.html"))
templates["list.html"] = template.Must(template.ParseFiles("views/list.html", "views/base.html"))
templates["edit.html"] = template.Must(template.ParseFiles("views/edit.html", "views/base.html"))
templates["about.html"] = template.Must(template.ParseFiles("views/about.html", "views/base.html")) templates["about.html"] = template.Must(template.ParseFiles("views/about.html", "views/base.html"))
templates["notfound.html"] = template.Must(template.ParseFiles("views/notfound.html", "views/base.html"))
e.Renderer = &TemplateRegistry{ e.Renderer = &TemplateRegistry{
templates: templates, templates: templates,
} }
// Routes // Routes
e.GET("/", WikiHome) e.GET("/", WikiHome)
e.GET("/:page", WikiPage)
e.GET("/:page/edit", WikiPageEdit)
e.POST("/:page/edit", WikiPagePostEdit)
e.GET("/list", WikiList)
e.GET("/about", WikiAbout) e.GET("/about", WikiAbout)
e.GET("/about/:id", WikiAbout) e.GET("/about/:id", WikiAbout)

View File

@ -1,9 +1,9 @@
{{define "title"}} {{define "title"}}
Wikingo | {{index . "name"}} Wikingo - About
{{end}} {{end}}
{{define "body"}} {{define "body"}}
<h1>Wikingo | {{index . "name"}}</h1> <h1>About Wikingo</h1>
<h2>{{index . "msg"}}</h2> <h2>Personal Wiki written in Go</h2>
<p>About Wikingo, Lorem ipsum...</p> <p>About Wikingo, Lorem ipsum...</p>
{{end}} {{end}}

View File

@ -1,17 +1,19 @@
{{define "base.html"}} {{ define "base.html" }}
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>{{template "title" .}}</title> <title>{{ template "title" . }}</title>
</head> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/water.css@2/out/water.css">
<body> </head>
<nav> <body>
<ul> <nav>
<li><a href="/">Home</a></li> <ul>
<li><a href="/about">About</a></li> <li><a href="/">Home</a></li>
</ul> <li><a href="/list">List</a></li>
</nav> <li><a href="/about">About</a></li>
{{template "body" .}} </ul>
</body> </nav>
</html> {{ template "body" . }}
</body>
</html>
{{end}} {{end}}

14
views/edit.html Normal file
View File

@ -0,0 +1,14 @@
{{define "title"}}
Wikingo - Edit {{ .page.Name }}
{{end}}
{{define "body"}}
<h1>{{ .page.Name }}</h1>
<h2>Edit page: {{ .page.Name }}</h2>
<form method="POST">
<textarea name="html">{{ .page.Body }}</textarea>
<hr />
<button>Save</button>
<a href="/{{ .page.Name }}">Cancel</a>
</form>
{{end}}

View File

@ -1,13 +0,0 @@
{{define "title"}}
Wikingo | {{index . "name"}}
{{end}}
{{define "body"}}
<h1>Wikingo | {{index . "name"}}</h1>
<h2>{{index . "msg"}}</h2>
<ul>
{{ range .pages }}
<li>{{ .Code }}.- {{ .Price }}</li>
{{ end }}
</ul>
{{end}}

12
views/list.html Normal file
View File

@ -0,0 +1,12 @@
{{define "title"}}
Wikingo - List
{{end}}
{{define "body"}}
<h1>List</h1>
<ul>
{{ range .pages }}
<li><a href="{{ .Name }}">{{ .Name }}</a>.- {{ .Body }}</li>
{{ end }}
</ul>
{{end}}

12
views/notfound.html Normal file
View File

@ -0,0 +1,12 @@
{{define "title"}}
Wikingo | {{index . "name"}}
{{end}}
{{define "body"}}
<h1>Page not found</h1>
<h2>Actions:</h2>
<ul>
<li>Create <a href="{{ .name }}/edit">{{ .name }}</a></li>
<li>Go to <a href="/">WikiHome</a></li>
</ul>
{{end}}

13
views/page.html Normal file
View File

@ -0,0 +1,13 @@
{{define "title"}}
Wikingo - {{ .page.Name }}
{{end}}
{{define "body"}}
<h1>{{ .page.Name }}</h1>
<h2>{{ .page.Name }}</h2>
{{ .page.Body }}
<hr />
<a href="{{ .page.Name }}/edit">Edit</a>
<p style="float: right">Last modified: {{ .page.UpdatedAt }}</p>
<p style="float: right">*{{ .page.Version }}*</p>
{{end}}