holy shit i FUCKING HATE golang io.Readers

This commit is contained in:
hexlocation 2025-06-14 19:18:02 +02:00
parent bb52442373
commit f348e7d40f
2 changed files with 16 additions and 36 deletions

View file

@ -16,14 +16,10 @@ import (
"stereo.cat/backend/internal/types" "stereo.cat/backend/internal/types"
) )
func getLengthFromReader(r io.Reader) (io.Reader, int64, error) { func intoReader(buf []byte) io.Reader {
buf, err := io.ReadAll(r) return io.NopCloser(bytes.NewBuffer(buf))
if err != nil {
return nil, 0, err
} }
return io.NopCloser(bytes.NewBuffer(buf)), int64(len(buf)), nil
}
func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) { func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
api.POST("/upload", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { api.POST("/upload", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) {
@ -48,14 +44,20 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
} }
fileReader, err := file.Open() fileReader, err := file.Open()
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "couldn't open file"}) c.JSON(500, gin.H{"error": "couldn't open file"})
log.Println(err) log.Println(err)
return 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 { if err != nil {
c.JSON(500, gin.H{"error": "couldn't open file"}) 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{ fileMeta := types.File{
Owner: uid, Owner: uid,
CreatedAt: time.Now(), CreatedAt: time.Now(),
Size: file.Size, Size: int64(len(buf)),
Extension: fileType.Extension, Mime: fileType.MIME.Value,
} }
if err := cfg.Database.Create(&fileMeta).Error; err != nil { if err := cfg.Database.Create(&fileMeta).Error; err != nil {
@ -75,15 +77,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
return return
} }
newReader, length, err := getLengthFromReader(fileReader) _, 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": "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})
if err != nil { if err != nil {
c.JSON(500, gin.H{"error": "failed to upload file"}) c.JSON(500, gin.H{"error": "failed to upload file"})
@ -166,21 +160,7 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
return return
} }
stat, err := object.Stat() c.DataFromReader(200, file.Size, file.Mime, object, nil)
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)
}) })
api.GET("/list", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) { api.GET("/list", auth.JwtMiddleware(cfg.JWTSecret), func(c *gin.Context) {

View file

@ -35,7 +35,7 @@ type File struct {
Owner string `gorm:"not null;index"` Owner string `gorm:"not null;index"`
Size int64 `gorm:"not null;type:bigint"` Size int64 `gorm:"not null;type:bigint"`
CreatedAt time.Time `gorm:"autoCreateTime"` CreatedAt time.Time `gorm:"autoCreateTime"`
Extension string Mime string
} }
func (f *File) BeforeCreate(tx *gorm.DB) (err error) { func (f *File) BeforeCreate(tx *gorm.DB) (err error) {