From b9d971140a92f8738c6ba1fa59577843e4a120b0 Mon Sep 17 00:00:00 2001 From: Derek Stevens Date: Sun, 5 Jun 2022 12:09:00 -0600 Subject: [PATCH] EurekaAdapter: flesh out CreatePage, SavePage, DeletePage and added TODO comments and the Config map; gofmt --- archetype/adapter.go | 4 ++-- archetype/eureka.go | 37 ++++++++++++++++++++++++++++++++----- archetype/page.go | 2 +- lfo/middleware.go | 36 ++++++++++++++++++------------------ nirvash.go | 18 +++++++++--------- 5 files changed, 62 insertions(+), 35 deletions(-) diff --git a/archetype/adapter.go b/archetype/adapter.go index ad1f6fc..a8caf13 100644 --- a/archetype/adapter.go +++ b/archetype/adapter.go @@ -3,8 +3,8 @@ package archetype type Adapter interface { Init(cfg *Config) Name() string - EditableSlugs() bool - BuildOptions() ([]string) + EditableSlugs() bool + BuildOptions() []string GetConfig(key string) (interface{}, error) SetConfig(key string, value interface{}) error ListPages() map[string]string diff --git a/archetype/eureka.go b/archetype/eureka.go index 51c16c2..fed61f0 100644 --- a/archetype/eureka.go +++ b/archetype/eureka.go @@ -9,7 +9,8 @@ import ( ) type EurekaAdapter struct { - Root string + Root string + Config map[string]interface{} } func (self *EurekaAdapter) Init(cfg *Config) { @@ -21,6 +22,8 @@ func (self *EurekaAdapter) Init(cfg *Config) { } self.Root = cfg.Root + + // TODO: read config.h and build self.Config } func (self *EurekaAdapter) Name() string { @@ -28,11 +31,11 @@ func (self *EurekaAdapter) Name() string { } func (self *EurekaAdapter) EditableSlugs() bool { - return false + return false } func (self *EurekaAdapter) BuildOptions() []string { - return []string{"twtxt"} + return []string{"twtxt"} } func (self *EurekaAdapter) GetConfig(key string) (interface{}, error) { @@ -81,32 +84,56 @@ func (self *EurekaAdapter) GetPage(filename string) (Page, error) { return Page{ Title: title, - Slug: filename, + Slug: filename, Content: content, Edited: fileInfo.ModTime(), }, nil } func (self *EurekaAdapter) FormatPage(raw string) string { + // TODO: implement Eureka formatter to show preview return raw } func (self *EurekaAdapter) FormattingHelp() string { + // TODO: show Eureka formatting guide return "help!" } 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)) + if err != nil { + return err + } + defer f.Close() + f.WriteString(content) return nil } func (self *EurekaAdapter) SavePage(oldSlug, newSlug, 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)) + if err != nil { + return err + } + defer f.Close() + + if oldSlug != newSlug { + // TODO: delete old html as well + os.Remove(filepath.Join(self.Root, "inc", oldSlug)) + } + + f.WriteString(content) return nil } func (self *EurekaAdapter) DeletePage(slug string) error { - return nil + // TODO: delete old html as well + return os.Remove(filepath.Join(self.Root, "inc", slug)) } func (self *EurekaAdapter) Build(buildOptions map[string]string) (bool, string) { + // TODO: shell out to build.sh with buildOptions, record exit status and output return true, "Build successful" } diff --git a/archetype/page.go b/archetype/page.go index 14dead6..fa5695c 100644 --- a/archetype/page.go +++ b/archetype/page.go @@ -6,7 +6,7 @@ import ( type Page struct { Title string - Slug string + Slug string Content string Edited time.Time } diff --git a/lfo/middleware.go b/lfo/middleware.go index 719411e..bbb7587 100644 --- a/lfo/middleware.go +++ b/lfo/middleware.go @@ -2,9 +2,9 @@ package lfo import ( "context" - "strings" "net/http" core "nilfm.cc/git/nirvash/archetype" + "strings" ) func WithAdapter(next http.Handler, adapter core.Adapter) http.Handler { @@ -17,20 +17,20 @@ func WithAdapter(next http.Handler, adapter core.Adapter) http.Handler { } 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 + 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) +} diff --git a/nirvash.go b/nirvash.go index 20b9b21..ece1e74 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")) @@ -51,14 +51,14 @@ func main() { "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), http.MethodGet, udb, "/login"), udb, "/")) + + 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) }