2021-09-08 18:19:30 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-09-08 18:19:30 +03:00
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"
2021-10-25 00:12:43 +03:00
"code.gitea.io/gitea/modules/util"
2024-02-27 10:12:22 +03:00
"code.gitea.io/gitea/services/context/upload"
2021-09-08 18:19:30 +03:00
"github.com/google/uuid"
)
// NewAttachment creates a new attachment object, but do not verify.
2023-10-03 13:30:41 +03:00
func NewAttachment ( ctx context . Context , attach * repo_model . Attachment , file io . Reader , size int64 ) ( * 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 )
}
2023-10-03 13:30:41 +03:00
err := db . WithTx ( ctx , func ( ctx context . Context ) error {
2021-09-08 18:19:30 +03:00
attach . UUID = uuid . New ( ) . String ( )
2023-03-12 10:48:07 +03:00
size , err := storage . Attachments . Save ( attach . RelativePath ( ) , file , size )
2021-09-08 18:19:30 +03:00
if err != nil {
2022-10-24 22:29:17 +03:00
return fmt . Errorf ( "Create: %w" , err )
2021-09-08 18:19:30 +03:00
}
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
2024-03-02 20:02:01 +03:00
func UploadAttachment ( ctx context . Context , file io . Reader , allowedTypes string , fileSize int64 , attach * repo_model . Attachment ) ( * 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
2024-03-02 20:02:01 +03:00
if err := upload . Verify ( buf , attach . Name , allowedTypes ) ; err != nil {
2021-09-08 18:19:30 +03:00
return nil , err
}
2024-03-02 20:02:01 +03:00
return NewAttachment ( ctx , attach , io . MultiReader ( bytes . NewReader ( buf ) , file ) , fileSize )
2021-09-08 18:19:30 +03:00
}