weiro/handlers/uploads.go
Leon Mika 199ff9feb9 More changes to uploads:
- Have got upload images appearing in the post list
- Allowed for deleting uploads
- Allowed for seeing the upload progress
- Fixed the setting of upload properties like the MIME type
- Removed the stripe exif logic with just re-encoding PNGs and JPEGs by loading them and saving them
2026-03-04 22:33:39 +11:00

165 lines
3.4 KiB
Go

package handlers
import (
"bufio"
"fmt"
"io"
"log"
"net/http"
"strconv"
"github.com/gofiber/fiber/v3"
"lmika.dev/lmika/weiro/models"
"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) Delete(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
}
if err := uh.UploadsService.DeleteUpload(c.Context(), uploadID); err != nil {
return err
}
return c.Redirect().To(fmt.Sprintf("/sites/%v/uploads", models.MustGetSite(c.Context()).ID))
}
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
}
return uh.serveUpload(c, upload, rwFn)
}
func (uh UploadsHandler) ShowFromSlug(c fiber.Ctx) error {
uploadSlug := c.Params("+")
if uploadSlug == "" {
return fiber.ErrBadRequest
}
upload, rwFn, err := uh.UploadsService.OpenUploadFromSlug(c.Context(), uploadSlug)
if err != nil {
log.Print(err)
return err
}
return uh.serveUpload(c, upload, rwFn)
}
func (uh UploadsHandler) serveUpload(c fiber.Ctx, upload models.Upload, uploadReader func() (io.ReadCloser, error)) error {
c.Set("Content-Type", upload.MIMEType)
c.Status(http.StatusOK)
return c.SendStreamWriter(func(w *bufio.Writer) {
rw, err := uploadReader()
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{})
}