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
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2026-03-26 10:16:50 +00:00
|
|
|
|
|
|
|
|
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-27 10:43:03 +00:00
|
|
|
|
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)
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-27 10:43:03 +00:00
|
|
|
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
|
|
|
|
|
}
|