package handlers import ( "fmt" "github.com/gofiber/fiber/v2" "lmika.dev/lmika/hugo-cms/models" "lmika.dev/lmika/hugo-cms/services/posts" "net/http" ) type Post struct { Post *posts.Service } func (h *Post) Posts(c *fiber.Ctx) error { site := GetSite(c) posts, err := h.Post.ListPostOfSite(c.UserContext(), site) if err != nil { return err } return c.Render("posts/index", fiber.Map{ "posts": posts, }, "layouts/site") } func (h *Post) New(c *fiber.Ctx) error { return c.Render("posts/new", fiber.Map{ "post": models.Post{}, }, "layouts/site") } func (h *Post) Create(c *fiber.Ctx) error { site := GetSite(c) var req struct { Title string `json:"title" form:"title"` Body string `json:"body" form:"body"` } if err := c.BodyParser(&req); err != nil { return err } _, err := h.Post.Create(c.UserContext(), site, posts.NewPost{ Title: req.Title, Body: req.Body, }) if err != nil { return err } return c.Redirect(fmt.Sprintf("/sites/%v/posts", site.ID)) } func (h *Post) Edit(c *fiber.Ctx) error { site := GetSite(c) postID, err := c.ParamsInt("postId") if err != nil { return err } post, err := h.Post.GetPost(c.UserContext(), postID) if err != nil { return err } else if post.SiteID != site.ID { return fmt.Errorf("post id %v not equal to site id %v", postID, site.ID) } return c.Render("posts/new", fiber.Map{ "post": post, }, "layouts/site") } func (h *Post) Update(c *fiber.Ctx) error { site := GetSite(c) postID, err := c.ParamsInt("postId") if err != nil { return err } var req struct { Title string `json:"title" form:"title"` Body string `json:"body" form:"body"` } if err := c.BodyParser(&req); err != nil { return err } post, err := h.Post.GetPost(c.UserContext(), postID) if err != nil { return err } else if post.SiteID != site.ID { return fmt.Errorf("post id %v not equal to site id %v", postID, site.ID) } post.Title = req.Title post.Body = req.Body if err := h.Post.Save(c.UserContext(), site, &post); err != nil { return err } return c.Redirect(fmt.Sprintf("/sites/%v/posts", site.ID)) } func (h *Post) Delete(c *fiber.Ctx) error { site := GetSite(c) postID, err := c.ParamsInt("postId") if err != nil { return err } if err := h.Post.DeletePost(c.UserContext(), site, postID); err != nil { return err } return Select(c, HTMX(func(c *fiber.Ctx) error { return c.Status(http.StatusOK).SendString("") }), Otherwise(func(c *fiber.Ctx) error { return c.Redirect(fmt.Sprintf("/sites/%v/posts", site.ID), http.StatusSeeOther) }), ) }