weiro/handlers/imageedit.go

166 lines
3.5 KiB
Go
Raw Normal View History

2026-03-25 11:35:53 +00:00
package handlers
import (
"bufio"
"io"
"log"
"net/http"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"lmika.dev/lmika/weiro/services/imgedit"
)
type ImageEditHandlers struct {
ImageEditService *imgedit.Service
}
type sessionResponse struct {
Session *models.ImageEditSession `json:"session"`
PreviewURL string `json:"preview_url"`
}
2026-03-25 11:35:53 +00:00
func (ieh ImageEditHandlers) Create(c fiber.Ctx) error {
var req struct {
BaseUploadID int64 `json:"base_upload"`
}
if err := c.Bind().JSON(&req); err != nil {
return err
}
res, err := ieh.ImageEditService.NewSession(c.Context(), req.BaseUploadID)
if err != nil {
return err
}
var resp = sessionResponse{
2026-03-25 11:35:53 +00:00
Session: res,
PreviewURL: res.PreviewURL(),
}
return c.Status(http.StatusCreated).JSON(resp)
}
func (ieh ImageEditHandlers) Preview(c fiber.Ctx) error {
log.Printf("Previewing image edit session %v/%v", c.Params("sessionID"), c.Params("versionID"))
sessionID := c.Params("sessionID")
versionID := c.Params("versionID")
mimeTime, rw, err := ieh.ImageEditService.LoadImageVersion(c.Context(), sessionID, versionID)
if err != nil {
return err
}
c.Set("Content-Type", mimeTime)
c.Status(http.StatusOK)
return c.SendStreamWriter(func(w *bufio.Writer) {
rw, err := rw()
if err != nil {
return
}
defer rw.Close()
_, err = io.Copy(w, rw)
if err != nil {
return
}
})
}
func (ieh ImageEditHandlers) AddProcessor(c fiber.Ctx) error {
sessionID := c.Params("sessionID")
if sessionID == "" {
log.Println("No session ID")
return fiber.ErrBadRequest
}
var req imgedit.AddProcessorReq
if err := c.Bind().Body(&req); err != nil {
log.Printf("Failed to parse request body: %v", err)
return fiber.ErrBadRequest
}
res, err := ieh.ImageEditService.AddProcessor(c.Context(), sessionID, req)
if err != nil {
return err
}
return c.Status(http.StatusOK).JSON(sessionResponse{
Session: res,
PreviewURL: res.PreviewURL(),
})
}
2026-03-26 10:44:20 +00:00
func (ieh ImageEditHandlers) DeleteProcessor(c fiber.Ctx) error {
sessionID := c.Params("sessionID")
if sessionID == "" {
return fiber.ErrBadRequest
}
processorID := c.Params("processorID")
if processorID == "" {
return fiber.ErrBadRequest
}
res, err := ieh.ImageEditService.DeleteProcessor(c.Context(), sessionID, processorID)
if err != nil {
return err
}
return c.Status(http.StatusOK).JSON(sessionResponse{
Session: res,
PreviewURL: res.PreviewURL(),
})
}
2026-03-28 10:42:35 +00:00
func (ieh ImageEditHandlers) Save(c fiber.Ctx) error {
sessionID := c.Params("sessionID")
if sessionID == "" {
return fiber.ErrBadRequest
}
var req struct {
Mode string `json:"mode"`
}
if err := c.Bind().JSON(&req); err != nil {
return fiber.ErrBadRequest
}
result, err := ieh.ImageEditService.Save(c.Context(), sessionID, req.Mode)
if err != nil {
return err
}
return c.Status(http.StatusOK).JSON(result)
}
func (ieh ImageEditHandlers) PatchSession(c fiber.Ctx) error {
var req struct {
UpdateProc *imgedit.UpdateProcessorReq `json:"processor"`
}
sessionID := c.Params("sessionID")
if sessionID == "" {
return fiber.ErrBadRequest
}
if err := c.Bind().Body(&req); err != nil {
return err
}
log.Printf("Got request: %v", *req.UpdateProc)
if req.UpdateProc != nil {
res, err := ieh.ImageEditService.UpdateProcessor(c.Context(), sessionID, *req.UpdateProc)
if err != nil {
return err
}
return c.Status(http.StatusOK).JSON(sessionResponse{
Session: res,
PreviewURL: res.PreviewURL(),
})
}
return fiber.ErrBadRequest
}