From f386403ced0adb44aa8d3ee4140660617ed78ffb Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sun, 22 Mar 2026 18:03:06 +1100 Subject: [PATCH] feat(pages): add pages handler and admin routes Co-Authored-By: Claude Sonnet 4.6 --- cmds/server.go | 9 ++++ handlers/pages.go | 118 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 handlers/pages.go diff --git a/cmds/server.go b/cmds/server.go index 56517e7..89310bd 100644 --- a/cmds/server.go +++ b/cmds/server.go @@ -113,6 +113,7 @@ Starting weiro without any arguments will start the server. uh := handlers.UploadsHandler{UploadsService: svcs.Uploads} ssh := handlers.SiteSettingsHandler{SiteService: svcs.Sites} ch := handlers.CategoriesHandler{CategoryService: svcs.Categories} + pgh := handlers.PagesHandler{PageService: svcs.Pages} app.Get("/login", lh.Login) app.Post("/login", lh.DoLogin) @@ -149,6 +150,14 @@ Starting weiro without any arguments will start the server. siteGroup.Post("/categories/:categoryID", ch.Update) siteGroup.Post("/categories/:categoryID/delete", ch.Delete) + siteGroup.Get("/pages", pgh.Index) + siteGroup.Get("/pages/new", pgh.New) + siteGroup.Get("/pages/:pageID", pgh.Edit) + siteGroup.Post("/pages", pgh.Create) + siteGroup.Post("/pages/reorder", pgh.Reorder) + siteGroup.Post("/pages/:pageID", pgh.Update) + siteGroup.Post("/pages/:pageID/delete", pgh.Delete) + app.Get("/", middleware.OptionalUser(svcs.Auth), ih.Index) app.Get("/first-run", ih.FirstRun) app.Post("/first-run", ih.FirstRunSubmit) diff --git a/handlers/pages.go b/handlers/pages.go new file mode 100644 index 0000000..2bdb04f --- /dev/null +++ b/handlers/pages.go @@ -0,0 +1,118 @@ +package handlers + +import ( + "fmt" + "strconv" + + "github.com/gofiber/fiber/v3" + "lmika.dev/lmika/weiro/models" + "lmika.dev/lmika/weiro/services/pages" +) + +type PagesHandler struct { + PageService *pages.Service +} + +func (ph PagesHandler) Index(c fiber.Ctx) error { + pagesList, err := ph.PageService.ListPages(c.Context()) + if err != nil { + return err + } + + return c.Render("pages/index", fiber.Map{ + "pages": pagesList, + }) +} + +func (ph PagesHandler) New(c fiber.Ctx) error { + page := models.Page{ + GUID: models.NewNanoID(), + } + return c.Render("pages/edit", fiber.Map{ + "page": page, + "isNew": true, + "bodyClass": "page-edit-page", + }) +} + +func (ph PagesHandler) Edit(c fiber.Ctx) error { + pageID, err := strconv.ParseInt(c.Params("pageID"), 10, 64) + if err != nil { + return fiber.ErrBadRequest + } + + page, err := ph.PageService.GetPage(c.Context(), pageID) + if err != nil { + return err + } + + return c.Render("pages/edit", fiber.Map{ + "page": page, + "isNew": false, + "bodyClass": "page-edit-page", + }) +} + +func (ph PagesHandler) Create(c fiber.Ctx) error { + var req pages.CreatePageParams + if err := c.Bind().Body(&req); err != nil { + return err + } + + _, err := ph.PageService.CreatePage(c.Context(), req) + if err != nil { + return err + } + + site := models.MustGetSite(c.Context()) + return c.Redirect().To(fmt.Sprintf("/sites/%v/pages", site.ID)) +} + +func (ph PagesHandler) Update(c fiber.Ctx) error { + pageID, err := strconv.ParseInt(c.Params("pageID"), 10, 64) + if err != nil { + return fiber.ErrBadRequest + } + + var req pages.CreatePageParams + if err := c.Bind().Body(&req); err != nil { + return err + } + + _, err = ph.PageService.UpdatePage(c.Context(), pageID, req) + if err != nil { + return err + } + + site := models.MustGetSite(c.Context()) + return c.Redirect().To(fmt.Sprintf("/sites/%v/pages", site.ID)) +} + +func (ph PagesHandler) Delete(c fiber.Ctx) error { + pageID, err := strconv.ParseInt(c.Params("pageID"), 10, 64) + if err != nil { + return fiber.ErrBadRequest + } + + if err := ph.PageService.DeletePage(c.Context(), pageID); err != nil { + return err + } + + site := models.MustGetSite(c.Context()) + return c.Redirect().To(fmt.Sprintf("/sites/%v/pages", site.ID)) +} + +func (ph PagesHandler) Reorder(c fiber.Ctx) error { + var req struct { + PageIDs []int64 `json:"page_ids"` + } + if err := c.Bind().Body(&req); err != nil { + return err + } + + if err := ph.PageService.ReorderPages(c.Context(), req.PageIDs); err != nil { + return err + } + + return c.JSON(fiber.Map{"ok": true}) +}