all repos — nirvash @ b9d971140a92f8738c6ba1fa59577843e4a120b0

modular CMS using the quartzgun library

EurekaAdapter: flesh out CreatePage, SavePage, DeletePage and added TODO comments and the Config map; gofmt
Iris Lightshard nilix@nilfm.cc
PGP Signature
-----BEGIN PGP SIGNATURE-----

iQIzBAABCAAdFiEEkFh6dA+k/6CXFXU4O3+8IhROY5gFAmKc8TwACgkQO3+8IhRO
Y5gFwRAAlrcglqifvj+5NpDSU1ssneZvbT1sANSu+wtz8wyNaqwsgJKCr79/0/Pp
nZ2mHgrdv5rPgipzBE9T37EX7sigsUuXPEcqPPqxSoDdelnEXn4WhXEPf9Aw0n+b
aM+NmNipZxvGM6Mr17VmG4p4iJX8uAqOCTuJUqQIc9iERj6ziiI6tHPrm0FszeaK
dohLL9zLP0oJ+X0WkvFo6qZEoL9jXnKwsMPWD5sqGF6uLm8ngVtVJ0kBDf31531S
x8kFl0NCRxULR20KhddaLi3F/U2+gJ4xYn+Bxb2ZHg7kkSwQZxlp26wx+BhwFBGE
VsB266tdGqS1LKhskW1fGATgkNaUB2bzJ4Q2Ce3fW9oMwl4v3CcGpiKSx5qMuMYf
api8Faf8vp/qbSqMj2HRLk06DDP/+d6TN0oXkvWZAQ4j7VVKTp9Uc37K7EYcwJLl
N0KSxqW7/hud+7zOu5hCLwd7aOABCLSeatOj6SaqZmAvPL4ndJVRu6VHe54J0lPx
hQTF9b9nAjpNHtJ1VavT1T3cYYkTMRQSPRteLAFZoYWawiEmd6elVgJRqotHnLSi
Jg2n3Z25SMvyQ51FBWynmIs6vHTJjABzuwou6dNPm51itwrAfkWVpLefRQYuaBj/
RvJl9eKIPZGiDEWXn5zk/45XQw9FileQxMBAql6oLsAVjvp7LMc=
=Qr0S
-----END PGP SIGNATURE-----
commit

b9d971140a92f8738c6ba1fa59577843e4a120b0

parent

1bc8eac481e6ad86ef61535d51bbfe0c0bb8dd99

5 files changed, 62 insertions(+), 35 deletions(-)

jump to
M archetype/adapter.goarchetype/adapter.go

@@ -3,8 +3,8 @@

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
M archetype/eureka.goarchetype/eureka.go

@@ -9,7 +9,8 @@ "strings"

) type EurekaAdapter struct { - Root string + Root string + Config map[string]interface{} } func (self *EurekaAdapter) Init(cfg *Config) {

@@ -21,6 +22,8 @@ panic("SSG content root is not a directory!")

} self.Root = cfg.Root + + // TODO: read config.h and build self.Config } func (self *EurekaAdapter) Name() string {

@@ -28,11 +31,11 @@ return "eureka"

} 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 @@ content := string(f[:])

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" }
M archetype/page.goarchetype/page.go

@@ -6,7 +6,7 @@ )

type Page struct { Title string - Slug string + Slug string Content string Edited time.Time }
M lfo/middleware.golfo/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 @@ 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) -}+ 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) +}
M nirvash.gonirvash.go

@@ -33,7 +33,7 @@ "/static": cfg.AssetRoot,

}, } - 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 @@ renderer.Template(

"templates/cms_edit.html", "templates/header.html", "templates/footer.html"), cfg.Adapter), http.MethodGet, udb, "/login"))) - - rtr.Post(`/save/(?P<Slug>\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<Slug>\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) }