package handlers import ( "bufio" "io" "log" "net/http" "strconv" "github.com/gofiber/fiber/v3" "lmika.dev/lmika/weiro/services/uploads" "lmika.dev/pkg/modash/moslice" ) type UploadsHandler struct { UploadsService *uploads.Service } func (uh UploadsHandler) Index(c fiber.Ctx) error { uploads, err := uh.UploadsService.ListUploads(c.Context()) if err != nil { return err } rows := moslice.Batch(uploads, 5) return c.Render("uploads/index", fiber.Map{"uploads": rows}) } func (uh UploadsHandler) Show(c fiber.Ctx) error { uploadIDStr := c.Params("uploadID") if uploadIDStr == "" { return fiber.ErrBadRequest } uploadID, err := strconv.ParseInt(uploadIDStr, 10, 64) if err != nil { return fiber.ErrBadRequest } upload, err := uh.UploadsService.FetchUpload(c.Context(), uploadID) if err != nil { return err } return c.Render("uploads/show", fiber.Map{"upload": upload}) } func (uh UploadsHandler) ShowRaw(c fiber.Ctx) error { uploadIDStr := c.Params("uploadID") if uploadIDStr == "" { return fiber.ErrBadRequest } uploadID, err := strconv.ParseInt(uploadIDStr, 10, 64) if err != nil { return fiber.ErrBadRequest } upload, rwFn, err := uh.UploadsService.OpenUpload(c.Context(), uploadID) if err != nil { log.Print(err) return err } c.Set("Content-Type", upload.MIMEType) c.Status(http.StatusOK) return c.SendStreamWriter(func(w *bufio.Writer) { rw, err := rwFn() if err != nil { return } defer rw.Close() _, err = io.Copy(w, rw) if err != nil { return } }) } func (uh UploadsHandler) New(c fiber.Ctx) error { var req uploads.NewPendingRequest if err := c.Bind().Body(&req); err != nil { return err } res, err := uh.UploadsService.NewPending(c.Context(), req) if err != nil { return err } return c.JSON(res) } func (uh UploadsHandler) UploadPart(c fiber.Ctx) error { guid := c.Params("guid") if guid == "" { return fiber.ErrBadRequest } if err := uh.UploadsService.WriteToPending(c.Context(), guid, c.Body()); err != nil { return err } return c.Status(fiber.StatusAccepted).JSON(fiber.Map{}) } func (uh UploadsHandler) UploadComplete(c fiber.Ctx) error { guid := c.Params("guid") if guid == "" { return fiber.ErrBadRequest } var res struct { Hash string `json:"hash"` } if err := c.Bind().Body(&res); err != nil { return err } if err := uh.UploadsService.FinalizePending(c.Context(), guid, res.Hash); err != nil { return err } return c.Status(fiber.StatusAccepted).JSON(fiber.Map{}) }