From f513205cc30e13aa3873eddf42635e39cdb76b20 Mon Sep 17 00:00:00 2001 From: Niko Abeler Date: Sun, 9 Jul 2023 19:51:49 +0200 Subject: [PATCH] listing entries --- domain/model/article.go | 15 +++++- domain/model/entry.go | 4 +- domain/model/image.go | 15 +++++- render/templates.go | 52 +++++++++++++++++++ {web => render}/templates/base.tmpl | 0 render/templates/entry/Article.tmpl | 1 + render/templates/entry/Image.tmpl | 8 +++ .../templates/views/editor_list.tmpl | 0 .../templates/views/entry.tmpl | 15 +++--- render/templates/views/index.tmpl | 22 ++++++++ {web => render}/templates/views/login.tmpl | 0 web/editor_list_handler.go | 3 +- web/entry_handler.go | 22 +------- web/index_handler.go | 11 +++- web/login_handler.go | 3 +- web/templates.go | 34 ------------ web/templates/views/entry/Image.tmpl | 17 ------ 17 files changed, 138 insertions(+), 84 deletions(-) create mode 100644 render/templates.go rename {web => render}/templates/base.tmpl (100%) create mode 100644 render/templates/entry/Article.tmpl create mode 100644 render/templates/entry/Image.tmpl rename {web => render}/templates/views/editor_list.tmpl (100%) rename web/templates/views/entry/Post.tmpl => render/templates/views/entry.tmpl (52%) create mode 100644 render/templates/views/index.tmpl rename {web => render}/templates/views/login.tmpl (100%) delete mode 100644 web/templates.go delete mode 100644 web/templates/views/entry/Image.tmpl diff --git a/domain/model/article.go b/domain/model/article.go index b783477..b07120f 100644 --- a/domain/model/article.go +++ b/domain/model/article.go @@ -1,5 +1,10 @@ package model +import ( + "fmt" + "owl-blogs/render" +) + type Article struct { EntryBase meta ArticleMetaData @@ -10,8 +15,16 @@ type ArticleMetaData struct { Content string `owl:"inputType=text widget=textarea"` } +func (e *Article) Title() string { + return e.meta.Title +} + func (e *Article) Content() EntryContent { - return EntryContent(e.meta.Content) + str, err := render.RenderTemplateToString("entry/Article", e) + if err != nil { + fmt.Println(err) + } + return EntryContent(str) } func (e *Article) MetaData() interface{} { diff --git a/domain/model/entry.go b/domain/model/entry.go index a23d66d..4f499f8 100644 --- a/domain/model/entry.go +++ b/domain/model/entry.go @@ -9,7 +9,9 @@ type Entry interface { Content() EntryContent PublishedAt() *time.Time MetaData() interface{} - // Create(id string, publishedAt *time.Time, metaData EntryMetaData) error + + // Optional: can return empty string + Title() string SetID(id string) SetPublishedAt(publishedAt *time.Time) diff --git a/domain/model/image.go b/domain/model/image.go index 1429941..176d8a5 100644 --- a/domain/model/image.go +++ b/domain/model/image.go @@ -1,5 +1,10 @@ package model +import ( + "fmt" + "owl-blogs/render" +) + type Image struct { EntryBase meta ImageMetaData @@ -10,8 +15,16 @@ type ImageMetaData struct { Content string `owl:"inputType=text widget=textarea"` } +func (e *Image) Title() string { + return "" +} + func (e *Image) Content() EntryContent { - return EntryContent(e.meta.Content) + str, err := render.RenderTemplateToString("entry/Image", e) + if err != nil { + fmt.Println(err) + } + return EntryContent(str) } func (e *Image) MetaData() interface{} { diff --git a/render/templates.go b/render/templates.go new file mode 100644 index 0000000..251168b --- /dev/null +++ b/render/templates.go @@ -0,0 +1,52 @@ +package render + +import ( + "bytes" + "embed" + "io" + "text/template" +) + +//go:embed templates +var templates embed.FS + +func CreateTemplateWithBase(templateName string) (*template.Template, error) { + + return template.ParseFS( + templates, + "templates/base.tmpl", + "templates/"+templateName+".tmpl", + ) + +} + +func RenderTemplateWithBase(w io.Writer, templateName string, data interface{}) error { + + t, err := CreateTemplateWithBase(templateName) + + if err != nil { + return err + } + + err = t.ExecuteTemplate(w, "base", data) + + return err + +} + +func RenderTemplateToString(templateName string, data interface{}) (string, error) { + + t, err := template.ParseFS( + templates, + "templates/"+templateName+".tmpl", + ) + + if err != nil { + return "", err + } + + var output bytes.Buffer + + err = t.Execute(&output, data) + return output.String(), err +} diff --git a/web/templates/base.tmpl b/render/templates/base.tmpl similarity index 100% rename from web/templates/base.tmpl rename to render/templates/base.tmpl diff --git a/render/templates/entry/Article.tmpl b/render/templates/entry/Article.tmpl new file mode 100644 index 0000000..bac8848 --- /dev/null +++ b/render/templates/entry/Article.tmpl @@ -0,0 +1 @@ +{{.MetaData.Content}} diff --git a/render/templates/entry/Image.tmpl b/render/templates/entry/Image.tmpl new file mode 100644 index 0000000..c616146 --- /dev/null +++ b/render/templates/entry/Image.tmpl @@ -0,0 +1,8 @@ +

+ {{.MetaData.Title}} +

+ + + +{{.MetaData.Content}} + diff --git a/web/templates/views/editor_list.tmpl b/render/templates/views/editor_list.tmpl similarity index 100% rename from web/templates/views/editor_list.tmpl rename to render/templates/views/editor_list.tmpl diff --git a/web/templates/views/entry/Post.tmpl b/render/templates/views/entry.tmpl similarity index 52% rename from web/templates/views/entry/Post.tmpl rename to render/templates/views/entry.tmpl index 2ddd89e..8af2b7d 100644 --- a/web/templates/views/entry/Post.tmpl +++ b/render/templates/views/entry.tmpl @@ -1,17 +1,18 @@ -{{define "title"}}{{.MetaData.Title}}{{end}} +{{define "title"}}{{.Title}}{{end}} {{define "main"}} -

{{.MetaData.Title}}

- -

-{{.Content}} -

- +{{if .Title}} +

{{.Title}}

+{{end}}

Published: {{.PublishedAt}}

+ +{{.Content}} + + {{end}} diff --git a/render/templates/views/index.tmpl b/render/templates/views/index.tmpl new file mode 100644 index 0000000..8ec0e75 --- /dev/null +++ b/render/templates/views/index.tmpl @@ -0,0 +1,22 @@ +{{define "title"}}Index{{end}} + +{{define "main"}} + +{{ range . }} +
+

+ + {{if .Title}} + {{ .Title }} + {{else}} + # + {{end}} + +

+

{{ .PublishedAt }}

+ {{ .Content }} +
+
+{{ end }} + +{{end}} \ No newline at end of file diff --git a/web/templates/views/login.tmpl b/render/templates/views/login.tmpl similarity index 100% rename from web/templates/views/login.tmpl rename to render/templates/views/login.tmpl diff --git a/web/editor_list_handler.go b/web/editor_list_handler.go index ef7c52f..771e6ad 100644 --- a/web/editor_list_handler.go +++ b/web/editor_list_handler.go @@ -2,6 +2,7 @@ package web import ( "owl-blogs/app" + "owl-blogs/render" "github.com/gofiber/fiber/v2" ) @@ -32,5 +33,5 @@ func (h *EditorListHandler) Handle(c *fiber.Ctx) error { typeNames = append(typeNames, name) } - return RenderTemplate(c, "views/editor_list", &EditorListContext{Types: typeNames}) + return render.RenderTemplateWithBase(c, "views/editor_list", &EditorListContext{Types: typeNames}) } diff --git a/web/entry_handler.go b/web/entry_handler.go index 3b81401..50e3640 100644 --- a/web/entry_handler.go +++ b/web/entry_handler.go @@ -2,8 +2,7 @@ package web import ( "owl-blogs/app" - "owl-blogs/domain/model" - "text/template" + "owl-blogs/render" "github.com/gofiber/fiber/v2" ) @@ -17,18 +16,6 @@ func NewEntryHandler(entryService *app.EntryService, registry *app.EntryTypeRegi return &EntryHandler{entrySvc: entryService, registry: registry} } -func (h *EntryHandler) getTemplate(entry model.Entry) (*template.Template, error) { - name, err := h.registry.TypeName(entry) - if err != nil { - return nil, err - } - return template.ParseFS( - templates, - "templates/base.tmpl", - "templates/views/entry/"+name+".tmpl", - ) -} - func (h *EntryHandler) Handle(c *fiber.Ctx) error { c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) @@ -38,10 +25,5 @@ func (h *EntryHandler) Handle(c *fiber.Ctx) error { return err } - template, err := h.getTemplate(entry) - if err != nil { - return err - } - - return template.ExecuteTemplate(c, "base", entry) + return render.RenderTemplateWithBase(c, "views/entry", entry) } diff --git a/web/index_handler.go b/web/index_handler.go index e043134..2a0575d 100644 --- a/web/index_handler.go +++ b/web/index_handler.go @@ -2,6 +2,7 @@ package web import ( "owl-blogs/app" + "owl-blogs/render" "github.com/gofiber/fiber/v2" ) @@ -15,5 +16,13 @@ func NewIndexHandler(entryService *app.EntryService) *IndexHandler { } func (h *IndexHandler) Handle(c *fiber.Ctx) error { - return c.SendString("Hello, World 👋!") + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + entries, err := h.entrySvc.FindAll() + + if err != nil { + return err + } + + return render.RenderTemplateWithBase(c, "views/index", entries) + } diff --git a/web/login_handler.go b/web/login_handler.go index 99af413..6ffe7a6 100644 --- a/web/login_handler.go +++ b/web/login_handler.go @@ -2,6 +2,7 @@ package web import ( "owl-blogs/app" + "owl-blogs/render" "time" "github.com/gofiber/fiber/v2" @@ -17,7 +18,7 @@ func NewLoginHandler(authorService *app.AuthorService) *LoginHandler { func (h *LoginHandler) HandleGet(c *fiber.Ctx) error { c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) - return RenderTemplate(c, "views/login", nil) + return render.RenderTemplateWithBase(c, "views/login", nil) } func (h *LoginHandler) HandlePost(c *fiber.Ctx) error { diff --git a/web/templates.go b/web/templates.go deleted file mode 100644 index 7dee3a1..0000000 --- a/web/templates.go +++ /dev/null @@ -1,34 +0,0 @@ -package web - -import ( - "embed" - "io" - "text/template" -) - -//go:embed templates -var templates embed.FS - -func CreateTemplate(templateName string) (*template.Template, error) { - - return template.ParseFS( - templates, - "templates/base.tmpl", - "templates/"+templateName+".tmpl", - ) - -} - -func RenderTemplate(w io.Writer, templateName string, data interface{}) error { - - t, err := CreateTemplate(templateName) - - if err != nil { - return err - } - - err = t.ExecuteTemplate(w, "base", data) - - return err - -} diff --git a/web/templates/views/entry/Image.tmpl b/web/templates/views/entry/Image.tmpl deleted file mode 100644 index 71521c8..0000000 --- a/web/templates/views/entry/Image.tmpl +++ /dev/null @@ -1,17 +0,0 @@ -{{define "title"}}Image Entry{{end}} - -{{define "main"}} - - - -

-{{.Content}} -

- -

- Published: {{.PublishedAt}} -

- - -{{end}} -