♻️ Fragment based multipart upload API
This commit is contained in:
@@ -3,7 +3,6 @@ package services
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"math"
|
||||
"mime"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
@@ -15,8 +14,6 @@ import (
|
||||
"github.com/eko/gocache/lib/v4/cache"
|
||||
"github.com/eko/gocache/lib/v4/marshaler"
|
||||
"github.com/eko/gocache/lib/v4/store"
|
||||
"github.com/spf13/viper"
|
||||
"gorm.io/datatypes"
|
||||
|
||||
localCache "git.solsynth.dev/hypernet/paperclip/pkg/internal/cache"
|
||||
"git.solsynth.dev/hypernet/paperclip/pkg/internal/database"
|
||||
@@ -54,7 +51,7 @@ func GetAttachmentByRID(rid string) (models.Attachment, error) {
|
||||
GetAttachmentCacheKey(rid),
|
||||
new(models.Attachment),
|
||||
); err == nil {
|
||||
return val.(models.Attachment), nil
|
||||
return *val.(*models.Attachment), nil
|
||||
}
|
||||
|
||||
var attachment models.Attachment
|
||||
@@ -147,37 +144,6 @@ func NewAttachmentMetadata(tx *gorm.DB, user *sec.UserInfo, file *multipart.File
|
||||
return attachment, nil
|
||||
}
|
||||
|
||||
func NewAttachmentPlaceholder(tx *gorm.DB, user *sec.UserInfo, attachment models.Attachment) (models.Attachment, error) {
|
||||
attachment.Uuid = uuid.NewString()
|
||||
attachment.Rid = RandString(16)
|
||||
attachment.IsUploaded = false
|
||||
attachment.FileChunks = datatypes.JSONMap{}
|
||||
attachment.AccountID = user.ID
|
||||
|
||||
chunkSize := viper.GetInt64("performance.file_chunk_size")
|
||||
chunkCount := math.Ceil(float64(attachment.Size) / float64(chunkSize))
|
||||
for idx := 0; idx < int(chunkCount); idx++ {
|
||||
cid := RandString(8)
|
||||
attachment.FileChunks[cid] = idx
|
||||
}
|
||||
|
||||
// If the user didn't provide file mimetype manually, we have to detect it
|
||||
if len(attachment.MimeType) == 0 {
|
||||
if ext := filepath.Ext(attachment.Name); len(ext) > 0 {
|
||||
// Detect mimetype by file extensions
|
||||
attachment.MimeType = mime.TypeByExtension(ext)
|
||||
}
|
||||
}
|
||||
|
||||
if err := tx.Save(&attachment).Error; err != nil {
|
||||
return attachment, fmt.Errorf("failed to save attachment record: %v", err)
|
||||
} else {
|
||||
CacheAttachment(attachment)
|
||||
}
|
||||
|
||||
return attachment, nil
|
||||
}
|
||||
|
||||
func TryLinkAttachment(tx *gorm.DB, og models.Attachment, hash string) (bool, error) {
|
||||
prev, err := GetAttachmentByHash(hash)
|
||||
if err != nil {
|
||||
|
Reference in New Issue
Block a user