feat(pages): add pages handler and admin routes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Leon Mika 2026-03-22 18:03:06 +11:00
parent 1edcd7686c
commit f386403ced
2 changed files with 127 additions and 0 deletions

View file

@ -113,6 +113,7 @@ Starting weiro without any arguments will start the server.
uh := handlers.UploadsHandler{UploadsService: svcs.Uploads} uh := handlers.UploadsHandler{UploadsService: svcs.Uploads}
ssh := handlers.SiteSettingsHandler{SiteService: svcs.Sites} ssh := handlers.SiteSettingsHandler{SiteService: svcs.Sites}
ch := handlers.CategoriesHandler{CategoryService: svcs.Categories} ch := handlers.CategoriesHandler{CategoryService: svcs.Categories}
pgh := handlers.PagesHandler{PageService: svcs.Pages}
app.Get("/login", lh.Login) app.Get("/login", lh.Login)
app.Post("/login", lh.DoLogin) 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", ch.Update)
siteGroup.Post("/categories/:categoryID/delete", ch.Delete) 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("/", middleware.OptionalUser(svcs.Auth), ih.Index)
app.Get("/first-run", ih.FirstRun) app.Get("/first-run", ih.FirstRun)
app.Post("/first-run", ih.FirstRunSubmit) app.Post("/first-run", ih.FirstRunSubmit)

118
handlers/pages.go Normal file
View file

@ -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})
}