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"` } 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{ 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(), }) } 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(), }) } 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 }