From e7456651350df48a7093462997489ef02f2b4fda Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Sun, 5 Jun 2022 23:29:39 -0600 Subject: [PATCH] create, edit, and logout functionality all working --- archetype/eureka.go | 14 ++++-- lfo/middleware.go | 6 ++- nirvash.go | 93 +++++++++++++++++++++++++++++++-------- templates/cms_create.html | 14 ++++++ templates/cms_edit.html | 20 ++++++--- templates/cms_new.html | 20 +++++++++ templates/cms_save.html | 16 ++++++- templates/footer.html | 1 - templates/header.html | 5 ++- 9 files changed, 155 insertions(+), 34 deletions(-) create mode 100644 templates/cms_create.html create mode 100644 templates/cms_new.html diff --git a/archetype/eureka.go b/archetype/eureka.go index fed61f0..99e613b 100644 --- a/archetype/eureka.go +++ b/archetype/eureka.go @@ -101,8 +101,15 @@ func (self *EurekaAdapter) FormattingHelp() string { } func (self *EurekaAdapter) CreatePage(slug, title, content string) error { - // eureka makes titles from slugs, so we don't use title here - f, err := os.Create(filepath.Join(self.Root, "inc", newSlug)) + // eureka creates titles from slugs, so we transform the title into the slug + slug = strings.ReplaceAll(title, " ", "_") + ".htm" + path := filepath.Join(self.Root, "inc", slug) + + _, err := os.Stat(path) + if err == nil || !os.IsNotExist(err) { + return errors.New("File already exists") + } + f, err := os.Create(path) if err != nil { return err } @@ -112,7 +119,8 @@ func (self *EurekaAdapter) CreatePage(slug, title, content string) error { } func (self *EurekaAdapter) SavePage(oldSlug, newSlug, title, content string) error { - // eureka makes titles from slugs, so we don't use title here + // eureka creates titles from slugs, so we transform the title into the slug + newSlug = strings.ReplaceAll(title, " ", "_") + ".htm" f, err := os.Create(filepath.Join(self.Root, "inc", newSlug)) if err != nil { return err diff --git a/lfo/middleware.go b/lfo/middleware.go index bbb7587..9ae2192 100644 --- a/lfo/middleware.go +++ b/lfo/middleware.go @@ -16,15 +16,17 @@ func WithAdapter(next http.Handler, adapter core.Adapter) http.Handler { return http.HandlerFunc(handlerFunc) } -func EnsurePageData(next http.Handler) http.Handler { +func EnsurePageData(next http.Handler, adapter core.Adapter) http.Handler { handlerFunc := func(w http.ResponseWriter, req *http.Request) { pageTitle := req.FormValue("title") pageContent := req.FormValue("content") + newSlug := req.FormValue("slug") - if pageTitle == "" || pageContent == "" { + if pageTitle == "" || pageContent == "" || (adapter.EditableSlugs() && newSlug == "") { newUri := "/edit/" slug := strings.Join(strings.Split(req.URL.Path, "/")[2:], "/") newUri += slug + newUri += "?no-empty=1" req.Method = http.MethodGet http.Redirect(w, req, newUri, http.StatusSeeOther) } else { diff --git a/nirvash.go b/nirvash.go index ece1e74..50142ea 100644 --- a/nirvash.go +++ b/nirvash.go @@ -38,27 +38,84 @@ func main() { rtr.Post("/login", middleware.Authorize("/", udb, "/login?tryagain=1")) - rtr.Get("/", middleware.Protected( - shell.WithAdapter( - renderer.Template( - "templates/cms_list.html", - "templates/header.html", - "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login")) + rtr.Get("/logout", middleware.Bunt("/", udb, "/login?tryagain=1")) - 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"))) - - rtr.Post(`/save/(?P\S+)`, middleware.Defend(middleware.Protected( - shell.WithAdapter( - shell.EnsurePageData( + rtr.Get( + "/", + middleware.Protected( + shell.WithAdapter( renderer.Template( - "templates/cms_save.html", + "templates/cms_list.html", "templates/header.html", - "templates/footer.html")), cfg.Adapter), http.MethodGet, udb, "/login"), udb, "/")) + "templates/footer.html"), + cfg.Adapter), + http.MethodGet, + udb, + "/login")) + + 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"))) + + 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), + cfg.Adapter), + http.MethodGet, + udb, + "/login"), + udb, + "/")) + + rtr.Get( + `/new`, + middleware.Fortify( + middleware.Protected( + shell.WithAdapter( + renderer.Template( + "templates/cms_new.html", + "templates/header.html", + "templates/footer.html"), + cfg.Adapter), + http.MethodGet, + udb, + "/login"))) + + rtr.Post( + `/create`, + middleware.Defend( + middleware.Protected( + shell.WithAdapter( + shell.EnsurePageData( + renderer.Template( + "templates/cms_create.html", + "templates/header.html", + "templates/footer.html"), + cfg.Adapter), + cfg.Adapter), + http.MethodGet, + udb, + "/login"), + udb, + "/")) http.ListenAndServe(":8080", rtr) } diff --git a/templates/cms_create.html b/templates/cms_create.html new file mode 100644 index 0000000..c5b919d --- /dev/null +++ b/templates/cms_create.html @@ -0,0 +1,14 @@ +{{ $slug := .FormValue "slug" }} +{{ $title := .FormValue "title" }} +{{ $content := .FormValue "content" }} +{{ $createErr := ((.Context).Value "adapter").CreatePage "" $title $content }} + +{{ template "header" . }} + +{{ if $createErr }} + There was an error creating the page: {{ ($createErr).Error }} +{{ else }} + Page '{{ $title }}' created successfully +{{ end }} + +{{ template "footer" . }} \ No newline at end of file diff --git a/templates/cms_edit.html b/templates/cms_edit.html index a968ef5..35e4f0f 100644 --- a/templates/cms_edit.html +++ b/templates/cms_edit.html @@ -1,17 +1,23 @@ {{ $slug := ((.Context).Value "params").Slug }} {{ $page := ((.Context).Value "adapter").GetPage $slug }} {{ $editableSlugs := ((.Context).Value "adapter").EditableSlugs }} +{{ $csrfToken := (.Context).Value "csrfToken" }} +{{ $noEmpty := .FormValue "no-empty" }} {{ template "header" . }} « -
- - {{ if $editableSlugs }} - + + {{ if $noEmpty }} + Empty fields are not allowed - please try again
{{ end }} - - last edited {{($page).Edited}} - + + + {{ if $editableSlugs }} +
+ {{ end }} +
+ last edited {{($page).Edited}}
+
diff --git a/templates/cms_new.html b/templates/cms_new.html new file mode 100644 index 0000000..e2abd4c --- /dev/null +++ b/templates/cms_new.html @@ -0,0 +1,20 @@ +{{ $editableSlugs := ((.Context).Value "adapter").EditableSlugs }} +{{ $csrfToken := (.Context).Value "csrfToken" }} +{{ $noEmpty := .FormValue "no-empty" }} + +{{ template "header" . }} +« +
+ {{ if $noEmpty }} + Empty fields are not allowed - please try again
+ {{ end }} + + {{ if $editableSlugs }} +
+ {{ end }} +
+
+ +
+ +{{ template "footer" . }} \ No newline at end of file diff --git a/templates/cms_save.html b/templates/cms_save.html index 9048858..84ed709 100644 --- a/templates/cms_save.html +++ b/templates/cms_save.html @@ -1 +1,15 @@ -

Nothing here yet

\ No newline at end of file +{{ $slug := ((.Context).Value "params").Slug }} +{{ $newSlug := .FormValue "slug" }} +{{ $title := .FormValue "title" }} +{{ $content := .FormValue "content" }} +{{ $saveErr := ((.Context).Value "adapter").SavePage $slug $newSlug $title $content }} + +{{ template "header" . }} + +{{ if $saveErr }} + There was an error saving the page: {{ ($saveErr).Error }} +{{ else }} + Page '{{ $title }}' saved successfully +{{ end }} + +{{ template "footer" . }} \ No newline at end of file diff --git a/templates/footer.html b/templates/footer.html index cb0be69..0c38b62 100644 --- a/templates/footer.html +++ b/templates/footer.html @@ -1,5 +1,4 @@ {{define "footer"}} - TEST {{end}} \ No newline at end of file diff --git a/templates/header.html b/templates/header.html index 1786dac..7aea7d5 100644 --- a/templates/header.html +++ b/templates/header.html @@ -11,8 +11,9 @@ {{end}} \ No newline at end of file