aboutsummaryrefslogtreecommitdiff
path: root/controllers
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-07-17 12:39:44 +0530
committerBobby <[email protected]>2025-07-17 12:39:44 +0530
commit46e41088bab946856867253c4fa268f9084b86a5 (patch)
tree617b5b31de5b2c0fe0cfd27f29b5580a784d468f /controllers
parentb0ba363696a758a8d0637107bd29a0a9ac1382d4 (diff)
downloadimageboard-46e41088bab946856867253c4fa268f9084b86a5.tar.xz
imageboard-46e41088bab946856867253c4fa268f9084b86a5.zip
webp support, decode and transformation functions
Diffstat (limited to 'controllers')
-rw-r--r--controllers/posts.go68
1 files changed, 61 insertions, 7 deletions
diff --git a/controllers/posts.go b/controllers/posts.go
index 2ebd6b2..dd612fb 100644
--- a/controllers/posts.go
+++ b/controllers/posts.go
@@ -1,8 +1,10 @@
package controllers
import (
+ "image"
"imageboard/config"
"imageboard/database"
+ "imageboard/models"
"imageboard/utils/auth"
"imageboard/utils/format"
"imageboard/utils/shortcuts"
@@ -100,27 +102,79 @@ func PostsUploadPostController(ctx *fiber.Ctx) error {
imageFile := imageFiles[0]
- rating := ctx.FormValue("rating")
- if rating == "" {
- rating = "safe"
+ contentType := imageFile.Header.Get("Content-Type")
+ if !strings.HasPrefix(contentType, "image/") {
+ return fiber.NewError(fiber.StatusBadRequest, "Uploaded file is not an image")
}
- sourceURL := ctx.FormValue("source_url")
+ if !strings.Contains(config.Upload.AllowedTypes, contentType) {
+ return fiber.NewError(fiber.StatusBadRequest, "Uploaded image type is not allowed")
+ }
- // Validate file size
maxSize := int64(config.Upload.MaxSize)
if imageFile.Size > maxSize {
return fiber.NewError(fiber.StatusRequestEntityTooLarge,
"File size exceeds maximum allowed size of "+format.FileSize(maxSize))
}
- // Validate content type
+ sourceURL := ctx.FormValue("source_url")
+
file, err := imageFile.Open()
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, "Failed to open uploaded file")
}
defer file.Close()
+ imageData, err := io.ReadAll(file)
+ if err != nil {
+ return fiber.NewError(fiber.StatusInternalServerError, "Failed to read uploaded file")
+ }
+
+ decodedImage, format, err := format.DecodeImage(imageData)
+ if err != nil {
+ return fiber.NewError(fiber.StatusInternalServerError, "Failed to decode image: "+err.Error())
+ }
+
+ var fileName string
+ if sourceURL != "" {
+ fileName = transformers.CreateUniqueFileName(sourceURL, format)
+ } else {
+ fileName = transformers.CreateUniqueFileName(imageFile.Filename, format)
+ }
+
+ rating := ctx.FormValue("rating")
+ if rating == "" {
+ rating = "safe"
+ }
+
+ imageSizes := make(map[config.ImageSizeType]struct {
+ imageSize models.ImageSize
+ image image.Image
+ })
+ isizeArray := []config.ImageSizeType{
+ config.ImageSizeTypeIcon,
+ config.ImageSizeTypeThumbnail,
+ config.ImageSizeTypeSmall,
+ config.ImageSizeTypeMedium,
+ config.ImageSizeTypeLarge,
+ config.ImageSizeTypeOriginal,
+ }
+
+ for _, sizeType := range isizeArray {
+ size, img, err := transformers.TransformImageToVariant(decodedImage, sizeType)
+ if err != nil {
+ return fiber.NewError(fiber.StatusInternalServerError, "Failed to process image: "+err.Error())
+ }
+ size.ImageID = 0 // This will be set later when saving the image
+ imageSizes[sizeType] = struct {
+ imageSize models.ImageSize
+ image image.Image
+ }{
+ imageSize: size,
+ image: img,
+ }
+ }
+
// For now, just return success - in a full implementation:
// 1. Generate unique filename
// 2. Calculate MD5 hash
@@ -133,7 +187,7 @@ func PostsUploadPostController(ctx *fiber.Ctx) error {
"success": true,
"message": "Image uploaded successfully",
"data": fiber.Map{
- "filename": imageFile.Filename,
+ "filename": fileName,
"size": imageFile.Size,
"rating": rating,
"source_url": sourceURL,