From 59c7fbcc741b86cdca442dccbe9dba3869771930 Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Sat, 4 Jun 2022 22:34:20 -0600 Subject: [PATCH] bootstraping page save process --- archetype/adapter.go | 17 +++++------------ archetype/eureka.go | 15 ++++++++------- archetype/page.go | 1 + go.mod | 2 +- go.sum | 4 ++++ lfo/middleware.go | 30 +++++++++++++++++++----------- nirvash.go | 14 +++++++++++--- templates/cms_edit.html | 21 ++++++++++----------- templates/cms_save.html | 1 + templates/header.html | 7 +++++++ 10 files changed, 67 insertions(+), 45 deletions(-) create mode 100644 templates/cms_save.html diff --git a/archetype/adapter.go b/archetype/adapter.go index af6e17b..fb3171f 100644 --- a/archetype/adapter.go +++ b/archetype/adapter.go @@ -1,24 +1,17 @@ package archetype -type EditMode int - -const ( - EditModeLiteralTextArea EditMode = iota - EditModeEscapedContentEditable -) - type Adapter interface { Init(cfg *Config) Name() string - EditMode() EditMode + EditableSlugs() bool GetConfig(key string) (interface{}, error) SetConfig(key string, value interface{}) error ListPages() map[string]string GetPage(string) (Page, error) FormatPage(string) string FormattingHelp() string - CreatePage(page Page) error - EditPage(old Page, new Page) error - DeletePage(page Page) error - Build() string + CreatePage(slug, title, content string) error + SavePage(oldSlug, newSlug, title, content string) error + DeletePage(slug string) error + Build() (bool, string) } diff --git a/archetype/eureka.go b/archetype/eureka.go index bfcfa8f..133dd5b 100644 --- a/archetype/eureka.go +++ b/archetype/eureka.go @@ -27,8 +27,8 @@ func (self *EurekaAdapter) Name() string { return "eureka" } -func (self *EurekaAdapter) EditMode() EditMode { - return EditModeLiteralTextArea +func (self *EurekaAdapter) EditableSlugs() bool { + return false } func (self *EurekaAdapter) GetConfig(key string) (interface{}, error) { @@ -77,6 +77,7 @@ func (self *EurekaAdapter) GetPage(filename string) (Page, error) { return Page{ Title: title, + Slug: filename, Content: content, Edited: fileInfo.ModTime(), }, nil @@ -90,18 +91,18 @@ func (self *EurekaAdapter) FormattingHelp() string { return "help!" } -func (self *EurekaAdapter) CreatePage(page Page) error { +func (self *EurekaAdapter) CreatePage(slug, title, content string) error { return nil } -func (self *EurekaAdapter) EditPage(old Page, new Page) error { +func (self *EurekaAdapter) SavePage(oldSlug, newSlug, title, content string) error { return nil } -func (self *EurekaAdapter) DeletePage(page Page) error { +func (self *EurekaAdapter) DeletePage(slug string) error { return nil } -func (self *EurekaAdapter) Build() string { - return "Build successful" +func (self *EurekaAdapter) Build() (bool, string) { + return true, "Build successful" } diff --git a/archetype/page.go b/archetype/page.go index 6054646..14dead6 100644 --- a/archetype/page.go +++ b/archetype/page.go @@ -6,6 +6,7 @@ import ( type Page struct { Title string + Slug string Content string Edited time.Time } diff --git a/go.mod b/go.mod index 7f100e7..01c1e10 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,6 @@ module nilfm.cc/git/nirvash go 1.17 -require nilfm.cc/git/quartzgun v0.1.0 +require nilfm.cc/git/quartzgun v0.1.2 require golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898 // indirect diff --git a/go.sum b/go.sum index 1e975db..64b79ee 100644 --- a/go.sum +++ b/go.sum @@ -23,3 +23,7 @@ nilfm.cc/git/quartzgun v0.0.0-20220516061509-0e5a81f27b63 h1:HlIWrDDJjOFLrxPQzld nilfm.cc/git/quartzgun v0.0.0-20220516061509-0e5a81f27b63/go.mod h1:/DDvt1DtzNuUf3HHaP29WMei/kkdaRW+ySmEzybvVto= nilfm.cc/git/quartzgun v0.1.0 h1:G+f/UnGpm5FAEqaY3Lj5UHvq0eB5sytM5s4FLesLC3E= nilfm.cc/git/quartzgun v0.1.0/go.mod h1:/DDvt1DtzNuUf3HHaP29WMei/kkdaRW+ySmEzybvVto= +nilfm.cc/git/quartzgun v0.1.1 h1:swJg3im4YsD64MnfJHa2Bxm0adGT/ArAMHLAPeEjuS0= +nilfm.cc/git/quartzgun v0.1.1/go.mod h1:/DDvt1DtzNuUf3HHaP29WMei/kkdaRW+ySmEzybvVto= +nilfm.cc/git/quartzgun v0.1.2 h1:B0IN24Y1Bg2IVvKxXXVtTUNFdVL8h3k/r0+LFAyqtMI= +nilfm.cc/git/quartzgun v0.1.2/go.mod h1:/DDvt1DtzNuUf3HHaP29WMei/kkdaRW+ySmEzybvVto= diff --git a/lfo/middleware.go b/lfo/middleware.go index a6c29ee..719411e 100644 --- a/lfo/middleware.go +++ b/lfo/middleware.go @@ -2,6 +2,7 @@ package lfo import ( "context" + "strings" "net/http" core "nilfm.cc/git/nirvash/archetype" ) @@ -15,14 +16,21 @@ func WithAdapter(next http.Handler, adapter core.Adapter) http.Handler { return http.HandlerFunc(handlerFunc) } -func WithEditModes(next http.Handler) http.Handler { - handlerFunc := func(w http.ResponseWriter, req *http.Request) { - *req = *req.WithContext(context.WithValue(req.Context(), "edit-modes", map[string]core.EditMode{ - "Literal": core.EditModeLiteralTextArea, - "Escaped": core.EditModeEscapedContentEditable, - })) - next.ServeHTTP(w, req) - } - - return http.HandlerFunc(handlerFunc) -} +func EnsurePageData(next http.Handler) http.Handler { + handlerFunc := func(w http.ResponseWriter, req *http.Request) { + pageTitle := req.FormValue("title") + pageContent := req.FormValue("content") + + if pageTitle == "" || pageContent == "" { + newUri := "/edit/" + slug := strings.Join(strings.Split(req.URL.Path, "/")[2:], "/") + newUri += slug + req.Method = http.MethodGet + http.Redirect(w, req, newUri, http.StatusSeeOther) + } else { + next.ServeHTTP(w, req) + } + } + + return http.HandlerFunc(handlerFunc) +} \ No newline at end of file diff --git a/nirvash.go b/nirvash.go index a4235ac..20b9b21 100644 --- a/nirvash.go +++ b/nirvash.go @@ -33,7 +33,7 @@ func main() { }, } - rtr.Get("/login", renderer.Template( + rtr.Get("/login",renderer.Template( "templates/login.html")) rtr.Post("/login", middleware.Authorize("/", udb, "/login?tryagain=1")) @@ -45,12 +45,20 @@ func main() { "templates/header.html", "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) - rtr.Get(`/edit/(?P\S+)`, middleware.Protected( + rtr.Get(`/edit/(?P\S+)`, middleware.Fortify(middleware.Protected( shell.WithAdapter( renderer.Template( "templates/cms_edit.html", "templates/header.html", - "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) + "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login"))) + + rtr.Post(`/save/(?P\S+)`, middleware.Defend(middleware.Protected( + shell.WithAdapter( + shell.EnsurePageData( + renderer.Template( + "templates/cms_save.html", + "templates/header.html", + "templates/footer.html")), cfg.Adapter), http.MethodGet, udb, "/login"), udb, "/")) http.ListenAndServe(":8080", rtr) } diff --git a/templates/cms_edit.html b/templates/cms_edit.html index 083453b..a968ef5 100644 --- a/templates/cms_edit.html +++ b/templates/cms_edit.html @@ -1,19 +1,18 @@ {{ $slug := ((.Context).Value "params").Slug }} {{ $page := ((.Context).Value "adapter").GetPage $slug }} -{{ $editMode := ((.Context).Value "adapter").EditMode }} -{{ $editModes := (.Context).Value "edit-modes" }} +{{ $editableSlugs := ((.Context).Value "adapter").EditableSlugs }} {{ template "header" . }} - -
- -last edited {{($page).Edited}} -{{ if eq $editMode 0 }} +« + + + {{ if $editableSlugs }} + + {{ end }} + + last edited {{($page).Edited}} -{{ else }} -
{{($page).Content}}
-{{ end }} - +
{{ template "footer" . }} \ No newline at end of file diff --git a/templates/cms_save.html b/templates/cms_save.html new file mode 100644 index 0000000..9048858 --- /dev/null +++ b/templates/cms_save.html @@ -0,0 +1 @@ +

Nothing here yet

\ No newline at end of file diff --git a/templates/header.html b/templates/header.html index 0f00ca5..1786dac 100644 --- a/templates/header.html +++ b/templates/header.html @@ -8,4 +8,11 @@ Nirvash — CMS + {{end}} \ No newline at end of file