Compare commits

..

No commits in common. "3a6b24cb571799cceaf84ec80882ce3ad0ebd124" and "018e0b45ed1ce17adacb8fce7e593a4d050b0739" have entirely different histories.

2 changed files with 36 additions and 16 deletions

View file

@ -16,10 +16,14 @@ import (
"stereo.cat/backend/internal/types" "stereo.cat/backend/internal/types"
) )
func intoReader(buf []byte) io.Reader { func getLengthFromReader(r io.Reader) (io.Reader, int64, error) {
return io.NopCloser(bytes.NewBuffer(buf)) buf, err := io.ReadAll(r)
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) {
@ -44,20 +48,14 @@ 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
} }
buf, err := io.ReadAll(fileReader) fileType, err := filetype.MatchReader(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"})
@ -68,8 +66,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: int64(len(buf)), Size: file.Size,
Mime: fileType.MIME.Value, Extension: fileType.Extension,
} }
if err := cfg.Database.Create(&fileMeta).Error; err != nil { if err := cfg.Database.Create(&fileMeta).Error; err != nil {
@ -77,7 +75,15 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
return return
} }
_, err = cfg.MinioClient.PutObject(cfg.Context, cfg.Bucket, fileMeta.ID.String(), intoReader(buf), fileMeta.Size, minio.PutObjectOptions{ContentType: fileMeta.Mime}) 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})
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"})
@ -160,7 +166,21 @@ func RegisterFileRoutes(cfg *types.StereoConfig, api *gin.RouterGroup) {
return return
} }
c.DataFromReader(200, file.Size, file.Mime, object, nil) 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)
}) })
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"`
Mime string Extension string
} }
func (f *File) BeforeCreate(tx *gorm.DB) (err error) { func (f *File) BeforeCreate(tx *gorm.DB) (err error) {