From f348e7d40f19f072b0bebf1be54d78bf5fe42c21 Mon Sep 17 00:00:00 2001 From: hex Date: Sat, 14 Jun 2025 19:18:02 +0200 Subject: [PATCH] holy shit i FUCKING HATE golang io.Readers --- internal/api/routes/files.go | 50 +++++++++++------------------------- internal/types/types.go | 2 +- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/internal/api/routes/files.go b/internal/api/routes/files.go index 09a8cbb..3a3f48e 100644 --- a/internal/api/routes/files.go +++ b/internal/api/routes/files.go @@ -16,15 +16,11 @@ import ( "stereo.cat/backend/internal/types" ) -func getLengthFromReader(r io.Reader) (io.Reader, int64, error) { - buf, err := io.ReadAll(r) - if err != nil { - return nil, 0, err - } - - return io.NopCloser(bytes.NewBuffer(buf)), int64(len(buf)), nil +func intoReader(buf []byte) io.Reader { + return io.NopCloser(bytes.NewBuffer(buf)) } + func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { api.POST("/upload", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { claims := c.MustGet("claims").(jwt.MapClaims) @@ -48,14 +44,20 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { } fileReader, err := file.Open() - if err != nil { c.JSON(500, gin.H{"error": "couldn't open file"}) log.Println(err) return } - fileType, err := filetype.MatchReader(fileReader) + buf, err := io.ReadAll(fileReader) + if err != nil { + c.JSON(500, gin.H{"error": "couldn't open file"}) + log.Println(err) + return + } + + fileType, err := filetype.Match(buf) if err != nil { c.JSON(500, gin.H{"error": "couldn't open file"}) @@ -66,8 +68,8 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { fileMeta := types.File{ Owner: uid, CreatedAt: time.Now(), - Size: file.Size, - Extension: fileType.Extension, + Size: int64(len(buf)), + Mime: fileType.MIME.Value, } if err := cfg.Database.Create(&fileMeta).Error; err != nil { @@ -75,15 +77,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { return } - newReader, length, err := getLengthFromReader(fileReader) - - if err != nil { - c.JSON(500, gin.H{"error": "couldn't open file"}) - log.Println(err) - return - } - - _, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), newReader, length, minio.PutObjectOptions{ContentType: fileType.MIME.Value}) + _, 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"}) @@ -166,21 +160,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { return } - stat, err := object.Stat() - if err != nil { - c.JSON(500, gin.H{"error": "failed to retrieve file"}) - log.Println(err) - return - } - - fileType := filetype.GetType(file.Extension) - if err != nil { - c.JSON(500, gin.H{"error": "failed to retrieve file"}) - log.Println(err) - return - } - - c.DataFromReader(200, stat.Size, fileType.MIME.Value, object, nil) + c.DataFromReader(200, file.Size, file.Mime, object, nil) }) api.GET("/list", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { diff --git a/internal/types/types.go b/internal/types/types.go index 70ab2cb..eeb81c2 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -35,7 +35,7 @@ type File struct { Owner string `gorm:"not null;index"` Size int64 `gorm:"not null;type:bigint"` CreatedAt time.Time `gorm:"autoCreateTime"` - Extension string + Mime string } func (f *File) BeforeCreate(tx *gorm.DB) (err error) {