2021-09-08 23:19:30 +08:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 13:20:29 -05:00
// SPDX-License-Identifier: MIT
2021-09-08 23:19:30 +08:00
package attachment
import (
"bytes"
2021-09-23 16:45:36 +01:00
"context"
2021-09-08 23:19:30 +08:00
"fmt"
"io"
2021-09-19 19:49:59 +08:00
"code.gitea.io/gitea/models/db"
2021-11-19 21:39:57 +08:00
repo_model "code.gitea.io/gitea/models/repo"
2021-09-08 23:19:30 +08:00
"code.gitea.io/gitea/modules/storage"
"code.gitea.io/gitea/modules/upload"
2021-10-24 23:12:43 +02:00
"code.gitea.io/gitea/modules/util"
2021-09-08 23:19:30 +08:00
"github.com/google/uuid"
)
// NewAttachment creates a new attachment object, but do not verify.
2023-10-03 12:30:41 +02:00
func NewAttachment ( ctx context . Context , attach * repo_model . Attachment , file io . Reader , size int64 ) ( * repo_model . Attachment , error ) {
2021-09-08 23:19:30 +08:00
if attach . RepoID == 0 {
return nil , fmt . Errorf ( "attachment %s should belong to a repository" , attach . Name )
}
2023-10-03 12:30:41 +02:00
err := db . WithTx ( ctx , func ( ctx context . Context ) error {
2021-09-08 23:19:30 +08:00
attach . UUID = uuid . New ( ) . String ( )
2023-03-12 08:48:07 +01:00
size , err := storage . Attachments . Save ( attach . RelativePath ( ) , file , size )
2021-09-08 23:19:30 +08:00
if err != nil {
2022-10-24 21:29:17 +02:00
return fmt . Errorf ( "Create: %w" , err )
2021-09-08 23:19:30 +08:00
}
attach . Size = size
2021-09-19 19:49:59 +08:00
return db . Insert ( ctx , attach )
2021-09-08 23:19:30 +08:00
} )
return attach , err
}
// UploadAttachment upload new attachment into storage and update database
2023-10-03 12:30:41 +02:00
func UploadAttachment ( ctx context . Context , file io . Reader , allowedTypes string , fileSize int64 , opts * repo_model . Attachment ) ( * repo_model . Attachment , error ) {
2021-09-08 23:19:30 +08:00
buf := make ( [ ] byte , 1024 )
2021-10-24 23:12:43 +02:00
n , _ := util . ReadAtMost ( file , buf )
buf = buf [ : n ]
2021-09-08 23:19:30 +08:00
2022-12-09 07:35:56 +01:00
if err := upload . Verify ( buf , opts . Name , allowedTypes ) ; err != nil {
2021-09-08 23:19:30 +08:00
return nil , err
}
2023-10-03 12:30:41 +02:00
return NewAttachment ( ctx , opts , io . MultiReader ( bytes . NewReader ( buf ) , file ) , fileSize )
2021-09-08 23:19:30 +08:00
}