mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
Implement s3 storage.
Use uuid as file id.
This commit is contained in:
@@ -2,6 +2,7 @@ package dao
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/google/uuid"
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"nysoure/server/model"
|
||||
@@ -73,17 +74,19 @@ func GetUploadingFilesOlderThan(time time.Time) ([]model.UploadingFile, error) {
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func CreateFile(filename string, description string, resourceID uint, storageID *uint, storageKey string, redirectUrl string) (*model.File, error) {
|
||||
func CreateFile(filename string, description string, resourceID uint, storageID *uint, storageKey string, redirectUrl string, size int64) (*model.File, error) {
|
||||
if storageID == nil && redirectUrl == "" {
|
||||
return nil, errors.New("storageID and redirectUrl cannot be both empty")
|
||||
}
|
||||
f := &model.File{
|
||||
UUID: uuid.NewString(),
|
||||
Filename: filename,
|
||||
Description: description,
|
||||
ResourceID: resourceID,
|
||||
StorageID: storageID,
|
||||
RedirectUrl: redirectUrl,
|
||||
StorageKey: storageKey,
|
||||
Size: size,
|
||||
}
|
||||
if err := db.Create(f).Error; err != nil {
|
||||
return nil, err
|
||||
@@ -91,9 +94,9 @@ func CreateFile(filename string, description string, resourceID uint, storageID
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func GetFile(id uint) (*model.File, error) {
|
||||
func GetFile(id string) (*model.File, error) {
|
||||
f := &model.File{}
|
||||
if err := db.Preload("Storage").Where("id = ?", id).First(f).Error; err != nil {
|
||||
if err := db.Preload("Storage").Where("uuid = ?", id).First(f).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, model.NewNotFoundError("file not found")
|
||||
}
|
||||
@@ -102,17 +105,9 @@ func GetFile(id uint) (*model.File, error) {
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func GetFilesByResourceID(rID uint) ([]model.File, error) {
|
||||
var files []model.File
|
||||
if err := db.Where("resource_id = ?", rID).Find(&files).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return files, nil
|
||||
}
|
||||
|
||||
func DeleteFile(id uint) error {
|
||||
func DeleteFile(id string) error {
|
||||
f := &model.File{}
|
||||
if err := db.Where("id = ?", id).First(f).Error; err != nil {
|
||||
if err := db.Where("uuid = ?", id).First(f).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return model.NewNotFoundError("file not found")
|
||||
}
|
||||
@@ -124,9 +119,9 @@ func DeleteFile(id uint) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func UpdateFile(id uint, filename string, description string) (*model.File, error) {
|
||||
func UpdateFile(id string, filename string, description string) (*model.File, error) {
|
||||
f := &model.File{}
|
||||
if err := db.Where("id = ?", id).First(f).Error; err != nil {
|
||||
if err := db.Where("uuid = ?", id).First(f).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if filename != "" {
|
||||
@@ -144,9 +139,9 @@ func UpdateFile(id uint, filename string, description string) (*model.File, erro
|
||||
return f, nil
|
||||
}
|
||||
|
||||
func SetFileStorageKey(id uint, storageKey string) error {
|
||||
func SetFileStorageKey(id string, storageKey string) error {
|
||||
f := &model.File{}
|
||||
if err := db.Where("id = ?", id).First(f).Error; err != nil {
|
||||
if err := db.Where("uuid = ?", id).First(f).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
f.StorageKey = storageKey
|
||||
|
@@ -1,6 +1,10 @@
|
||||
package dao
|
||||
|
||||
import "nysoure/server/model"
|
||||
import (
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
"nysoure/server/model"
|
||||
)
|
||||
|
||||
func CreateStorage(s model.Storage) (model.Storage, error) {
|
||||
err := db.Model(&s).Create(&s).Error
|
||||
@@ -22,3 +26,14 @@ func GetStorage(id uint) (model.Storage, error) {
|
||||
err := db.Model(&model.Storage{}).Where("id = ?", id).First(&storage).Error
|
||||
return storage, err
|
||||
}
|
||||
|
||||
func AddStorageUsage(id uint, offset int64) error {
|
||||
return db.Transaction(func(tx *gorm.DB) error {
|
||||
var storage model.Storage
|
||||
err := tx.Clauses(clause.Locking{Strength: clause.LockingStrengthUpdate}).Model(&model.Storage{}).Where("id = ?", id).First(&storage).Error
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return tx.Model(&model.Storage{}).Where("id = ?", id).Update("current_size", storage.CurrentSize+offset).Error
|
||||
})
|
||||
}
|
||||
|
Reference in New Issue
Block a user