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 (
|
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
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