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 }}
+
+
+
+
+
+
+
+ {{ .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,
+ })
+
}