owl-blogs/web/entry_handler.go

84 lines
1.8 KiB
Go
Raw Normal View History

2023-06-25 19:32:36 +00:00
package web
import (
"net/http"
2023-06-25 19:32:36 +00:00
"owl-blogs/app"
2023-07-17 18:44:59 +00:00
"owl-blogs/app/repository"
2023-07-13 19:20:00 +00:00
"owl-blogs/domain/model"
2023-07-09 17:51:49 +00:00
"owl-blogs/render"
2023-06-25 19:32:36 +00:00
"github.com/gofiber/fiber/v2"
)
type EntryHandler struct {
2023-08-09 18:36:44 +00:00
configRepo repository.ConfigRepository
entrySvc *app.EntryService
authorSvc *app.AuthorService
registry *app.EntryTypeRegistry
interactionRepo repository.InteractionRepository
2023-06-25 19:32:36 +00:00
}
2023-07-13 19:20:00 +00:00
type entryData struct {
2023-08-09 18:36:44 +00:00
Entry model.Entry
Author *model.Author
LoggedIn bool
Interactions []model.Interaction
2023-07-13 19:20:00 +00:00
}
2023-07-17 18:44:59 +00:00
func NewEntryHandler(
entryService *app.EntryService,
registry *app.EntryTypeRegistry,
authorService *app.AuthorService,
configRepo repository.ConfigRepository,
2023-08-09 18:36:44 +00:00
interactionRepo repository.InteractionRepository,
2023-07-17 18:44:59 +00:00
) *EntryHandler {
return &EntryHandler{
2023-08-09 18:36:44 +00:00
entrySvc: entryService,
authorSvc: authorService,
registry: registry,
configRepo: configRepo,
interactionRepo: interactionRepo,
2023-07-17 18:44:59 +00:00
}
2023-07-07 19:04:25 +00:00
}
2023-06-25 19:32:36 +00:00
func (h *EntryHandler) Handle(c *fiber.Ctx) error {
2023-07-07 19:04:25 +00:00
c.Set(fiber.HeaderContentType, fiber.MIMETextHTML)
url := c.OriginalURL()
if len(url) == 0 || url[len(url)-1] != '/' {
return c.Redirect(url+"/", http.StatusMovedPermanently)
}
loggedIn := c.Locals("author") != nil
2023-07-07 19:04:25 +00:00
entryId := c.Params("post")
entry, err := h.entrySvc.FindById(entryId)
if err != nil {
return err
}
if !loggedIn {
if entry.PublishedAt() == nil || entry.PublishedAt().IsZero() {
return fiber.NewError(fiber.StatusNotFound, "Entry not found")
}
2023-07-30 09:29:30 +00:00
}
2023-07-13 19:55:08 +00:00
author, err := h.authorSvc.FindByName(entry.AuthorId())
2023-07-13 19:20:00 +00:00
if err != nil {
2023-07-13 19:55:08 +00:00
author = &model.Author{}
2023-07-13 19:20:00 +00:00
}
2023-08-09 18:36:44 +00:00
inters, _ := h.interactionRepo.FindAll(entry.ID())
2023-07-25 19:31:03 +00:00
return render.RenderTemplateWithBase(
c,
"views/entry",
entryData{
2023-08-09 18:36:44 +00:00
Entry: entry,
Author: author,
LoggedIn: loggedIn,
Interactions: inters,
2023-07-25 19:31:03 +00:00
},
)
2023-06-25 19:32:36 +00:00
}