From dba37137ff0bec0510efdcf5b829ae29d1697bd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?O=CC=81scar=20M=2E=20Lage?= Date: Mon, 28 Mar 2022 17:14:01 +0200 Subject: [PATCH] Add: Page versioning "MVP" --- TODO.md | 1 + model/store.go | 1 + model/store_gorm.go | 12 +++++++++++- server/app.go | 46 +++++++++++++++++++++++++++++++++++---------- server/server.go | 3 +++ views/edit.html | 2 +- views/list.html | 2 +- views/page.html | 2 +- 8 files changed, 55 insertions(+), 14 deletions(-) diff --git a/TODO.md b/TODO.md index 81ae39a..df5b24e 100644 --- a/TODO.md +++ b/TODO.md @@ -8,6 +8,7 @@ - [ ] Makefile helper - [ ] Reload if files changes [idea](https://medium.com/@olebedev/live-code-reloading-for-golang-web-projects-in-19-lines-8b2e8777b1ea#.gok9azrg4) - [ ] CI (gofmt, golint, more)? +- [x] Page versioning in a really basic way ## Bootstrap > Basic elements diff --git a/model/store.go b/model/store.go index 14347ae..c443fbf 100644 --- a/model/store.go +++ b/model/store.go @@ -6,5 +6,6 @@ type Store interface { AddPage(string, string) error CreatePage(Page) error GetPage(string) (Page, error) + GetPageVersion(string, string) (Page, error) GetAllPages() ([]Page, error) } diff --git a/model/store_gorm.go b/model/store_gorm.go index df3ea2d..baee55f 100644 --- a/model/store_gorm.go +++ b/model/store_gorm.go @@ -45,7 +45,7 @@ func (s *StoreGorm) CreatePage(page Page) error { newversion.Name = page.Name newversion.Body = page.Body newversion.Version = page.Version + 1 - tx := s.db.Save(newversion) + tx := s.db.Create(&newversion) return tx.Error } @@ -59,6 +59,16 @@ func (s *StoreGorm) GetPage(name string) (Page, error) { return page, nil } +func (s *StoreGorm) GetPageVersion(name string, version string) (Page, error) { + var page Page + tx := s.db.Where("Name = ?", name).Where("Version = ?", version).First(&page) + if tx.Error != nil { + return Page{}, tx.Error + } + fmt.Println(page) + return page, nil +} + func (s *StoreGorm) GetAllPages() ([]Page, error) { var pages []Page tx := s.db.Find(&pages) diff --git a/server/app.go b/server/app.go index 1e9ff75..17634a5 100644 --- a/server/app.go +++ b/server/app.go @@ -6,6 +6,8 @@ import ( "net/http" "strings" + "github.com/oscarmlage/wikingo/model" + "github.com/labstack/echo/v4" "github.com/microcosm-cc/bluemonday" "github.com/russross/blackfriday/v2" @@ -16,15 +18,31 @@ func WikiHome(c echo.Context) error { } func WikiPage(c echo.Context) error { - page_id := c.Param("page") + var page model.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, - }) + page_id := c.Param("page") + version := c.Param("version") + if version != "" { + fmt.Printf("version: %s", version) + page, err = store.GetPageVersion(page_id, version) + if err != nil { + // If record not found, show 404 + if err.Error() == "record not found" { + return c.Render(http.StatusOK, "notfound.html", map[string]interface{}{ + "name": page_id, + }) + } + } + } else { + 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) @@ -38,9 +56,17 @@ func WikiPage(c echo.Context) error { } func WikiPageEdit(c echo.Context) error { - page_id := c.Param("page") + var page model.Page var err error - page, err := store.GetPage(page_id) + page_id := c.Param("page") + version := c.Param("version") + if version != "" { + fmt.Printf("version; %s\n", version) + page, err = store.GetPageVersion(page_id, version) + } else { + fmt.Println("No version") + page, err = store.GetPage(page_id) + } if err != nil { // If record not found, create and show the form if err.Error() == "record not found" { diff --git a/server/server.go b/server/server.go index 3c74f8d..888ab4c 100644 --- a/server/server.go +++ b/server/server.go @@ -64,8 +64,11 @@ func Serve() { // Routes e.GET("/", WikiHome) e.GET("/:page", WikiPage) + e.GET("/:page/:version", WikiPage) e.GET("/:page/edit", WikiPageEdit) + e.GET("/:page/:version/edit", WikiPageEdit) e.POST("/:page/edit", WikiPagePostEdit) + e.POST("/:page/:version/edit", WikiPagePostEdit) e.GET("/list", WikiList) e.GET("/about", WikiAbout) e.GET("/about/:id", WikiAbout) diff --git a/views/edit.html b/views/edit.html index 9a319ba..cfe891e 100644 --- a/views/edit.html +++ b/views/edit.html @@ -9,6 +9,6 @@
- Cancel + Cancel {{end}} diff --git a/views/list.html b/views/list.html index 92bd19d..a3f9e5c 100644 --- a/views/list.html +++ b/views/list.html @@ -6,7 +6,7 @@

List

{{end}} diff --git a/views/page.html b/views/page.html index de63795..fc15fe9 100644 --- a/views/page.html +++ b/views/page.html @@ -6,7 +6,7 @@

{{ .page.Name }}

{{ .html | safeHTML }}
- Edit + Edit

Last modified: {{ .page.UpdatedAt }}

*{{ .page.Version }}*

{{end}}