Files
Atay-Makhzan/services/attachment/attachment.go
T

59 lines
1.6 KiB
Go
Raw Normal View History

2021-09-08 23:19:30 +08: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 16:45:36 +01:00
"context"
2021-09-08 23:19:30 +08:00
"fmt"
"io"
"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.
2021-11-19 21:39:57 +08:00
func NewAttachment(attach *repo_model.Attachment, file io.Reader) (*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)
}
2021-09-23 16:45:36 +01:00
err := db.WithTx(func(ctx context.Context) error {
2021-09-08 23:19:30 +08: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
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
2021-12-20 05:41:31 +01:00
func UploadAttachment(file io.Reader, actorID, repoID, releaseID int64, fileName, allowedTypes string) (*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
if err := upload.Verify(buf, fileName, allowedTypes); err != nil {
return nil, err
}
2021-11-19 21:39:57 +08:00
return NewAttachment(&repo_model.Attachment{
2021-09-08 23:19:30 +08:00
RepoID: repoID,
UploaderID: actorID,
ReleaseID: releaseID,
Name: fileName,
}, io.MultiReader(bytes.NewReader(buf), file))
}