new error system (+ some quick fixes)
This commit is contained in:
parent
09d8ffa82c
commit
c99c202bc8
2 changed files with 92 additions and 36 deletions
|
@ -3,7 +3,6 @@ package routes
|
|||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
|
@ -27,40 +26,42 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
|
||||
uid := user.ID
|
||||
if uid == "" {
|
||||
c.JSON(401, gin.H{"error": "unauthorized"})
|
||||
types.ErrorInvalidParams.Throw(c, nil)
|
||||
return
|
||||
}
|
||||
|
||||
file, err := c.FormFile("file")
|
||||
if err != nil {
|
||||
c.JSON(400, gin.H{"error": "file is required"})
|
||||
types.ErrorInvalidParams.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
if file.Size <= 0 {
|
||||
c.JSON(400, gin.H{"error": "file size must be greater than zero"})
|
||||
types.ErrorInvalidParams.Throw(c, nil)
|
||||
return
|
||||
}
|
||||
|
||||
fileReader, err := file.Open()
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "couldn't open file"})
|
||||
log.Println(err)
|
||||
types.ErrorReaderOpen.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
buf, err := io.ReadAll(fileReader)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "couldn't open file"})
|
||||
log.Println(err)
|
||||
types.ErrorReaderOpen.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
if !filetype.IsImage(buf) {
|
||||
types.ErrorInvalidFile.Throw(c, nil)
|
||||
return
|
||||
}
|
||||
|
||||
fileType, err := filetype.Match(buf)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "couldn't open file"})
|
||||
log.Println(err)
|
||||
types.ErrorReaderOpen.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -73,15 +74,14 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
_, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), intoReader(buf), fileMeta.Size, minio.PutObjectOptions{ContentType: fileMeta.Mime})
|
||||
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "failed to upload file"})
|
||||
log.Println(err)
|
||||
types.ErrorS3.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -92,21 +92,9 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
claims := c.MustGet("claims").(jwt.MapClaims)
|
||||
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")))
|
||||
if err != nil {
|
||||
c.JSON(404, gin.H{"error": "file not found"})
|
||||
types.ErrorInvalidFile.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -115,17 +103,22 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
cfg.Database.First(&file, fileID)
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
@ -140,23 +133,20 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
|
||||
id, err := uuid.FromString(fileID)
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "invalid file id"})
|
||||
log.Println(err)
|
||||
types.ErrorInvalidFile.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
cfg.Database.First(&file, id)
|
||||
|
||||
if file == nil {
|
||||
c.JSON(500, gin.H{"error": "file does not exist"})
|
||||
log.Println(err)
|
||||
types.ErrorFileNotFound.Throw(c, nil)
|
||||
return
|
||||
}
|
||||
|
||||
object, err := cfg.MinioClient.GetObject(cfg.Context, cfg.Bucket, fileID, minio.GetObjectOptions{})
|
||||
if err != nil {
|
||||
c.JSON(500, gin.H{"error": "failed to retrieve file"})
|
||||
log.Println(err)
|
||||
types.ErrorS3.Throw(c, err)
|
||||
return
|
||||
}
|
||||
|
||||
|
@ -169,7 +159,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
|
|||
|
||||
var files []types.File
|
||||
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
|
||||
}
|
||||
|
||||
|
|
66
internal/types/errors.go
Normal file
66
internal/types/errors.go
Normal 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,
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue