2021-09-08 18:19:30 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package attachment
import (
"bytes"
2021-09-23 18:45:36 +03:00
"context"
2021-09-08 18:19:30 +03:00
"fmt"
"io"
2021-09-19 14:49:59 +03:00
"code.gitea.io/gitea/models/db"
2021-11-19 16:39:57 +03:00
repo_model "code.gitea.io/gitea/models/repo"
2021-09-08 18:19:30 +03:00
"code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/modules/upload"
2021-10-25 00:12:43 +03:00
"code.gitea.io/gitea/modules/util"
2021-09-08 18:19:30 +03:00
"github.com/google/uuid"
)
// NewAttachment creates a new attachment object, but do not verify.
2021-11-19 16:39:57 +03:00
func NewAttachment ( attach * repo_model . Attachment , file io . Reader ) ( * repo_model . Attachment , error ) {
2021-09-08 18:19:30 +03:00
if attach . RepoID == 0 {
return nil , fmt . Errorf ( "attachment %s should belong to a repository" , attach . Name )
}
2021-09-23 18:45:36 +03:00
err := db . WithTx ( func ( ctx context . Context ) error {
2021-09-08 18:19:30 +03:00
attach . UUID = uuid . New ( ) . String ( )
size , err := storage . Attachments . Save ( attach . RelativePath ( ) , file , - 1 )
if err != nil {
return fmt . Errorf ( "Create: %v" , err )
}
attach . Size = size
2021-09-19 14:49:59 +03:00
return db . Insert ( ctx , attach )
2021-09-08 18:19:30 +03:00
} )
return attach , err
}
// UploadAttachment upload new attachment into storage and update database
2021-12-20 07:41:31 +03:00
func UploadAttachment ( file io . Reader , actorID , repoID , releaseID int64 , fileName , allowedTypes string ) ( * repo_model . Attachment , error ) {
2021-09-08 18:19:30 +03:00
buf := make ( [ ] byte , 1024 )
2021-10-25 00:12:43 +03:00
n , _ := util . ReadAtMost ( file , buf )
buf = buf [ : n ]
2021-09-08 18:19:30 +03:00
if err := upload . Verify ( buf , fileName , allowedTypes ) ; err != nil {
return nil , err
}
2021-11-19 16:39:57 +03:00
return NewAttachment ( & repo_model . Attachment {
2021-09-08 18:19:30 +03:00
RepoID : repoID ,
UploaderID : actorID ,
ReleaseID : releaseID ,
Name : fileName ,
} , io . MultiReader ( bytes . NewReader ( buf ) , file ) )
}