new error system (+ some quick fixes)

This commit is contained in:
hexlocation 2025-06-14 23:39:20 +02:00
parent 09d8ffa82c
commit c99c202bc8
2 changed files with 92 additions and 36 deletions

View file

@ -3,7 +3,6 @@ package routes
import ( import (
"bytes" "bytes"
"io" "io"
"log"
"strings" "strings"
"time" "time"
@ -27,40 +26,42 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
uid := user.ID uid := user.ID
if uid == "" { if uid == "" {
c.JSON(401, gin.H{"error": "unauthorized"}) types.ErrorInvalidParams.Throw(c, nil)
return return
} }
file, err := c.FormFile("file") file, err := c.FormFile("file")
if err != nil { if err != nil {
c.JSON(400, gin.H{"error": "file is required"}) types.ErrorInvalidParams.Throw(c, err)
return return
} }
if file.Size <= 0 { if file.Size <= 0 {
c.JSON(400, gin.H{"error": "file size must be greater than zero"}) types.ErrorInvalidParams.Throw(c, nil)
return return
} }
fileReader, err := file.Open() fileReader, err := file.Open()
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "couldn't open file"}) types.ErrorReaderOpen.Throw(c, err)
log.Println(err)
return return
} }
buf, err := io.ReadAll(fileReader) buf, err := io.ReadAll(fileReader)
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "couldn't open file"}) types.ErrorReaderOpen.Throw(c, err)
log.Println(err) return
}
if !filetype.IsImage(buf) {
types.ErrorInvalidFile.Throw(c, nil)
return return
} }
fileType, err := filetype.Match(buf) fileType, err := filetype.Match(buf)
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "couldn't open file"}) types.ErrorReaderOpen.Throw(c, err)
log.Println(err)
return return
} }
@ -73,15 +74,14 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
} }
if err := cfg.Database.Create(&fileMeta).Error; err != nil { if err := cfg.Database.Create(&fileMeta).Error; err != nil {
c.JSON(500, gin.H{"error": "failed to save file metadata"}) types.ErrorDatabase.Throw(c, err)
return return
} }
_, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), intoReader(buf), fileMeta.Size, minio.PutObjectOptions{ContentType: fileMeta.Mime}) _, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), intoReader(buf), fileMeta.Size, minio.PutObjectOptions{ContentType: fileMeta.Mime})
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "failed to upload file"}) types.ErrorS3.Throw(c, err)
log.Println(err)
return return
} }
@ -92,21 +92,9 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
claims := c.MustGet("claims").(jwt.MapClaims) claims := c.MustGet("claims").(jwt.MapClaims)
user := claims["user"].(auth.User) user := claims["user"].(auth.User)
uid := c.Param("uid")
uid = strings.TrimSpace(uid)
if uid == "" {
c.JSON(400, gin.H{"error": "uid is required"})
return
}
if uid != user.ID {
c.JSON(403, gin.H{"error": "you can only delete your own files"})
return
}
fileID, err := uuid.FromString(strings.TrimSpace(c.Param("id"))) fileID, err := uuid.FromString(strings.TrimSpace(c.Param("id")))
if err != nil { if err != nil {
c.JSON(404, gin.H{"error": "file not found"}) types.ErrorInvalidFile.Throw(c, err)
return return
} }
@ -115,17 +103,22 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
cfg.Database.First(&file, fileID) cfg.Database.First(&file, fileID)
if file == nil { if file == nil {
c.JSON(404, gin.H{"error": "file not found"}) types.ErrorFileNotFound.Throw(c, nil)
return
}
if file.Owner != user.ID {
types.ErrorUnauthorized.Throw(c, nil)
return return
} }
if err := cfg.MinioClient.RemoveObject(cfg.Context, cfg.Bucket, fileID.String(), minio.RemoveObjectOptions{}); err != nil { if err := cfg.MinioClient.RemoveObject(cfg.Context, cfg.Bucket, fileID.String(), minio.RemoveObjectOptions{}); err != nil {
c.JSON(500, gin.H{"error": "failed to delete file"}) types.ErrorS3.Throw(c, err)
return return
} }
if err := cfg.Database.Delete(&file).Error; err != nil { if err := cfg.Database.Delete(&file).Error; err != nil {
c.JSON(500, gin.H{"error": "failed to delete file metadata"}) types.ErrorDatabase.Throw(c, err)
return return
} }
@ -140,23 +133,20 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
id, err := uuid.FromString(fileID) id, err := uuid.FromString(fileID)
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "invalid file id"}) types.ErrorInvalidFile.Throw(c, err)
log.Println(err)
return return
} }
cfg.Database.First(&file, id) cfg.Database.First(&file, id)
if file == nil { if file == nil {
c.JSON(500, gin.H{"error": "file does not exist"}) types.ErrorFileNotFound.Throw(c, nil)
log.Println(err)
return return
} }
object, err := cfg.MinioClient.GetObject(cfg.Context, cfg.Bucket, fileID, minio.GetObjectOptions{}) object, err := cfg.MinioClient.GetObject(cfg.Context, cfg.Bucket, fileID, minio.GetObjectOptions{})
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "failed to retrieve file"}) types.ErrorS3.Throw(c, err)
log.Println(err)
return return
} }
@ -169,7 +159,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
var files []types.File var files []types.File
if err := cfg.Database.Where("owner = ?", user.ID).Find(&files).Error; err != nil { if err := cfg.Database.Where("owner = ?", user.ID).Find(&files).Error; err != nil {
c.JSON(500, gin.H{"error": "failed to retrieve files"}) types.ErrorDatabase.Throw(c, err)
return return
} }

66
internal/types/errors.go Normal file
View file

@ -0,0 +1,66 @@
package types
import (
"errors"
"fmt"
"github.com/gin-gonic/gin"
)
type StereoError struct {
Code int
StatusCode int
}
func (e *StereoError) Throw(c *gin.Context, err error) {
c.JSON(e.StatusCode, gin.H{
"code": e.Code,
"success": false,
})
if err != nil {
c.Error(err)
} else {
c.Error(errors.New(fmt.Sprintf("Got an error with code: %v", e.Code)))
}
}
var ErrorFileNotFound = StereoError{
Code: 0,
StatusCode: 404,
}
var ErrorReaderOpen = StereoError{
Code: 1,
StatusCode: 500,
}
var ErrorUnauthorized = StereoError{
Code: 2,
StatusCode: 401,
}
var ErrorInvalidParams = StereoError{
Code: 3,
StatusCode: 400,
}
var ErrorEmptyFile = StereoError{
Code: 4,
StatusCode: 400,
}
var ErrorInvalidFile = StereoError{
Code: 5,
StatusCode: 400,
}
var ErrorDatabase = StereoError{
Code: 6,
StatusCode: 500,
}
var ErrorS3 = StereoError{
Code: 7,
StatusCode: 500,
}