weiro/handlers/categories.go

102 lines
2.2 KiB
Go
Raw Normal View History

package handlers
import (
"fmt"
"strconv"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/services/categories"
)
type CategoriesHandler struct {
CategoryService *categories.Service
}
func (ch CategoriesHandler) Index(c fiber.Ctx) error {
cats, err := ch.CategoryService.ListCategoriesWithCounts(c.Context())
if err != nil {
return err
}
return c.Render("categories/index", fiber.Map{
"categories": cats,
})
}
func (ch CategoriesHandler) New(c fiber.Ctx) error {
cat := models.Category{
GUID: models.NewNanoID(),
}
return c.Render("categories/edit", fiber.Map{
"category": cat,
"isNew": true,
})
}
func (ch CategoriesHandler) Edit(c fiber.Ctx) error {
catID, err := strconv.ParseInt(c.Params("categoryID"), 10, 64)
if err != nil {
return fiber.ErrBadRequest
}
cat, err := ch.CategoryService.GetCategory(c.Context(), catID)
if err != nil {
return err
}
return c.Render("categories/edit", fiber.Map{
"category": cat,
"isNew": false,
})
}
func (ch CategoriesHandler) Create(c fiber.Ctx) error {
var req categories.CreateCategoryParams
if err := c.Bind().Body(&req); err != nil {
return err
}
_, err := ch.CategoryService.CreateCategory(c.Context(), req)
if err != nil {
return err
}
site := models.MustGetSite(c.Context())
return c.Redirect().To(fmt.Sprintf("/sites/%v/categories", site.ID))
}
func (ch CategoriesHandler) Update(c fiber.Ctx) error {
catID, err := strconv.ParseInt(c.Params("categoryID"), 10, 64)
if err != nil {
return fiber.ErrBadRequest
}
var req categories.CreateCategoryParams
if err := c.Bind().Body(&req); err != nil {
return err
}
_, err = ch.CategoryService.UpdateCategory(c.Context(), catID, req)
if err != nil {
return err
}
site := models.MustGetSite(c.Context())
return c.Redirect().To(fmt.Sprintf("/sites/%v/categories", site.ID))
}
func (ch CategoriesHandler) Delete(c fiber.Ctx) error {
catID, err := strconv.ParseInt(c.Params("categoryID"), 10, 64)
if err != nil {
return fiber.ErrBadRequest
}
if err := ch.CategoryService.DeleteCategory(c.Context(), catID); err != nil {
return err
}
site := models.MustGetSite(c.Context())
return c.Redirect().To(fmt.Sprintf("/sites/%v/categories", site.ID))
}