2026-03-02 09:48:41 +00:00
|
|
|
package handlers
|
|
|
|
|
|
|
|
|
|
import (
|
2026-03-02 11:26:40 +00:00
|
|
|
"bufio"
|
|
|
|
|
"io"
|
|
|
|
|
"log"
|
|
|
|
|
"net/http"
|
|
|
|
|
"strconv"
|
|
|
|
|
|
2026-03-02 09:48:41 +00:00
|
|
|
"github.com/gofiber/fiber/v3"
|
|
|
|
|
"lmika.dev/lmika/weiro/services/uploads"
|
2026-03-02 11:26:40 +00:00
|
|
|
"lmika.dev/pkg/modash/moslice"
|
2026-03-02 09:48:41 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type UploadsHandler struct {
|
|
|
|
|
UploadsService *uploads.Service
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (uh UploadsHandler) Index(c fiber.Ctx) error {
|
2026-03-02 11:26:40 +00:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
|
2026-03-02 09:48:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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{})
|
|
|
|
|
}
|