diff --git a/app/entry_service.go b/app/entry_service.go index 79b11fe..3528c4e 100644 --- a/app/entry_service.go +++ b/app/entry_service.go @@ -29,21 +29,26 @@ func (s *EntryService) FindById(id string) (model.Entry, error) { return s.EntryRepository.FindById(id) } -func (s *EntryService) FindAllByType(types *[]string) ([]model.Entry, error) { - return s.EntryRepository.FindAll(types) +func (s *EntryService) filterEntries(entries []model.Entry, published bool, drafts bool) []model.Entry { + filteredEntries := make([]model.Entry, 0) + for _, entry := range entries { + if published && entry.PublishedAt() != nil && !entry.PublishedAt().IsZero() { + filteredEntries = append(filteredEntries, entry) + } + if drafts && (entry.PublishedAt() == nil || entry.PublishedAt().IsZero()) { + filteredEntries = append(filteredEntries, entry) + } + } + return filteredEntries +} + +func (s *EntryService) FindAllByType(types *[]string, published bool, drafts bool) ([]model.Entry, error) { + entries, err := s.EntryRepository.FindAll(types) + return s.filterEntries(entries, published, drafts), err + } func (s *EntryService) FindAll() ([]model.Entry, error) { entries, err := s.EntryRepository.FindAll(nil) - if err != nil { - return nil, err - } - // filter unpublished entries - publishedEntries := make([]model.Entry, 0) - for _, entry := range entries { - if entry.PublishedAt() != nil && !entry.PublishedAt().IsZero() { - publishedEntries = append(publishedEntries, entry) - } - } - return publishedEntries, nil + return s.filterEntries(entries, true, true), err } diff --git a/cmd/owl/import_v1.go b/cmd/owl/import_v1.go index 8604a49..d545d12 100644 --- a/cmd/owl/import_v1.go +++ b/cmd/owl/import_v1.go @@ -96,7 +96,7 @@ var importCmd = &cobra.Command{ v2Config.AuthorName = v1Config.AuthorName v2Config.Me = mes v2Config.Lists = lists - v2Config.PrimaryListInclude = v1Config.PrimaryListInclude + v2Config.PrimaryListInclude = importer.ConvertTypeList(v1Config.PrimaryListInclude, app.Registry) v2Config.HeaderMenu = headerMenu v2Config.FooterMenu = footerMenu diff --git a/render/templates/views/list.tmpl b/render/templates/views/list.tmpl new file mode 100644 index 0000000..6a65d14 --- /dev/null +++ b/render/templates/views/list.tmpl @@ -0,0 +1,44 @@ +{{define "title"}}Index{{end}} + +{{define "main"}} + +
+{{ range .Entries }} +
+
+

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

+ + + +
+ {{ .Content }} +
+
+{{ end }} +
+ +
+ +{{end}} \ No newline at end of file diff --git a/web/app.go b/web/app.go index 3ec68fc..738f2df 100644 --- a/web/app.go +++ b/web/app.go @@ -28,18 +28,18 @@ func NewWebApp( typeRegistry *app.EntryTypeRegistry, binService *app.BinaryService, authorService *app.AuthorService, - siteConfigRepo repository.ConfigRepository, + configRepo repository.ConfigRepository, ) *WebApp { app := fiber.New() - indexHandler := NewIndexHandler(entryService, siteConfigRepo) - listHandler := NewListHandler(entryService) - entryHandler := NewEntryHandler(entryService, typeRegistry, authorService, siteConfigRepo) + indexHandler := NewIndexHandler(entryService, configRepo) + listHandler := NewListHandler(entryService, configRepo) + entryHandler := NewEntryHandler(entryService, typeRegistry, authorService, configRepo) mediaHandler := NewMediaHandler(binService) rssHandler := NewRSSHandler(entryService) - loginHandler := NewLoginHandler(authorService, siteConfigRepo) - editorListHandler := NewEditorListHandler(typeRegistry, siteConfigRepo) - editorHandler := NewEditorHandler(entryService, typeRegistry, binService, siteConfigRepo) + loginHandler := NewLoginHandler(authorService, configRepo) + editorListHandler := NewEditorListHandler(typeRegistry, configRepo) + editorHandler := NewEditorHandler(entryService, typeRegistry, binService, configRepo) // Login app.Get("/auth/login", loginHandler.HandleGet) @@ -56,21 +56,21 @@ func NewWebApp( siteConfig := app.Group("/site-config") siteConfig.Use(middleware.NewAuthMiddleware(authorService).Handle) - siteConfigHandler := NewSiteConfigHandler(siteConfigRepo) + siteConfigHandler := NewSiteConfigHandler(configRepo) siteConfig.Get("/", siteConfigHandler.HandleGet) siteConfig.Post("/", siteConfigHandler.HandlePost) - siteConfigMeHandler := NewSiteConfigMeHandler(siteConfigRepo) + siteConfigMeHandler := NewSiteConfigMeHandler(configRepo) siteConfig.Get("/me", siteConfigMeHandler.HandleGet) siteConfig.Post("/me/create/", siteConfigMeHandler.HandleCreate) siteConfig.Post("/me/delete/", siteConfigMeHandler.HandleDelete) - siteConfigListHandler := NewSiteConfigListHandler(siteConfigRepo, typeRegistry) + siteConfigListHandler := NewSiteConfigListHandler(configRepo, typeRegistry) siteConfig.Get("/lists", siteConfigListHandler.HandleGet) siteConfig.Post("/lists/create/", siteConfigListHandler.HandleCreate) siteConfig.Post("/lists/delete/", siteConfigListHandler.HandleDelete) - siteConfigMenusHandler := NewSiteConfigMenusHandler(siteConfigRepo) + siteConfigMenusHandler := NewSiteConfigMenusHandler(configRepo) siteConfig.Get("/menus", siteConfigMenusHandler.HandleGet) siteConfig.Post("/menus/create/", siteConfigMenusHandler.HandleCreate) siteConfig.Post("/menus/delete/", siteConfigMenusHandler.HandleDelete) @@ -106,7 +106,7 @@ func NewWebApp( Registry: typeRegistry, BinaryService: binService, AuthorService: authorService, - SiteConfigRepo: siteConfigRepo, + SiteConfigRepo: configRepo, } } diff --git a/web/index_handler.go b/web/index_handler.go index 59551ba..459d183 100644 --- a/web/index_handler.go +++ b/web/index_handler.go @@ -37,7 +37,10 @@ type indexRenderData struct { func (h *IndexHandler) Handle(c *fiber.Ctx) error { c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) - entries, err := h.entrySvc.FindAll() + + siteConfig := getSiteConfig(h.configRepo) + + entries, err := h.entrySvc.FindAllByType(&siteConfig.PrimaryListInclude, true, false) if err != nil { return err } @@ -73,7 +76,7 @@ func (h *IndexHandler) Handle(c *fiber.Ctx) error { return err } - return render.RenderTemplateWithBase(c, getSiteConfig(h.configRepo), "views/index", indexRenderData{ + return render.RenderTemplateWithBase(c, siteConfig, "views/index", indexRenderData{ Entries: entries, Page: pageNum, NextPage: pageNum + 1, diff --git a/web/list_handler.go b/web/list_handler.go index 8602f80..221b033 100644 --- a/web/list_handler.go +++ b/web/list_handler.go @@ -2,18 +2,99 @@ package web import ( "owl-blogs/app" + "owl-blogs/app/repository" + "owl-blogs/domain/model" + "owl-blogs/render" + "sort" + "strconv" "github.com/gofiber/fiber/v2" ) type ListHandler struct { - entrySvc *app.EntryService + configRepo repository.ConfigRepository + entrySvc *app.EntryService } -func NewListHandler(entryService *app.EntryService) *ListHandler { - return &ListHandler{entrySvc: entryService} +func NewListHandler( + entryService *app.EntryService, + configRepo repository.ConfigRepository, +) *ListHandler { + return &ListHandler{ + entrySvc: entryService, + configRepo: configRepo, + } +} + +type listRenderData struct { + List model.EntryList + Entries []model.Entry + Page int + NextPage int + PrevPage int + FirstPage bool + LastPage bool } func (h *ListHandler) Handle(c *fiber.Ctx) error { - return c.SendString("Hello, List!") + c.Set(fiber.HeaderContentType, fiber.MIMETextHTML) + + siteConfig := getSiteConfig(h.configRepo) + listId := c.Params("list") + list := model.EntryList{} + for _, l := range siteConfig.Lists { + if l.Id == listId { + list = l + } + } + if list.Id == "" { + return c.SendStatus(404) + } + + entries, err := h.entrySvc.FindAllByType(&list.Include, true, false) + if err != nil { + return err + } + + // sort entries by date descending + sort.Slice(entries, func(i, j int) bool { + return entries[i].PublishedAt().After(*entries[j].PublishedAt()) + }) + + // pagination + page := c.Query("page") + if page == "" { + page = "1" + } + pageNum, err := strconv.Atoi(page) + if err != nil { + pageNum = 1 + } + limit := 10 + offset := (pageNum - 1) * limit + lastPage := false + if offset > len(entries) { + offset = len(entries) + lastPage = true + } + if offset+limit > len(entries) { + limit = len(entries) - offset + lastPage = true + } + entries = entries[offset : offset+limit] + + if err != nil { + return err + } + + return render.RenderTemplateWithBase(c, siteConfig, "views/list", listRenderData{ + List: list, + Entries: entries, + Page: pageNum, + NextPage: pageNum + 1, + PrevPage: pageNum - 1, + FirstPage: pageNum == 1, + LastPage: lastPage, + }) + }