mirror of
https://github.com/halejohn/Cloudreve.git
synced 2026-01-26 09:34:57 +08:00
Feat: save re-save single shared file
This commit is contained in:
@@ -13,7 +13,7 @@ type Folder struct {
|
||||
// 表字段
|
||||
gorm.Model
|
||||
Name string `gorm:"unique_index:idx_only_one_name"`
|
||||
ParentID uint `gorm:"index:parent_id;unique_index:idx_only_one_name"`
|
||||
ParentID *uint `gorm:"index:parent_id;unique_index:idx_only_one_name"`
|
||||
OwnerID uint `gorm:"index:owner_id"`
|
||||
|
||||
// 数据库忽略字段
|
||||
@@ -192,7 +192,7 @@ func (folder *Folder) CopyFolderTo(folderID uint, dstFolder *Folder) (size uint6
|
||||
// 顶级目录直接指向新的目的目录
|
||||
if folder.ID == folderID {
|
||||
newID = dstFolder.ID
|
||||
} else if IDCache, ok := newIDCache[folder.ParentID]; ok {
|
||||
} else if IDCache, ok := newIDCache[*folder.ParentID]; ok {
|
||||
newID = IDCache
|
||||
} else {
|
||||
util.Log().Warning("无法取得新的父目录:%d", folder.ParentID)
|
||||
@@ -202,7 +202,7 @@ func (folder *Folder) CopyFolderTo(folderID uint, dstFolder *Folder) (size uint6
|
||||
// 插入新的目录记录
|
||||
oldID := folder.ID
|
||||
folder.Model = gorm.Model{}
|
||||
folder.ParentID = newID
|
||||
folder.ParentID = &newID
|
||||
if err = DB.Create(&folder).Error; err != nil {
|
||||
return size, err
|
||||
}
|
||||
@@ -262,6 +262,40 @@ func (folder *Folder) Rename(new string) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// CopyChildFrom 将给定文件和拷贝至自身,并更改所有者ID
|
||||
func (folder *Folder) CopyChildFrom(folders []Folder, files []File) error {
|
||||
// 开启事务
|
||||
tx := DB.Begin()
|
||||
defer func() {
|
||||
if r := recover(); r != nil {
|
||||
tx.Rollback()
|
||||
}
|
||||
}()
|
||||
|
||||
// 记录文件父目录对应复制的新目录ID
|
||||
var newParent = make(map[uint]uint, len(folders))
|
||||
|
||||
// TODO 复制目录结构
|
||||
|
||||
// 复制子文件
|
||||
for _, file := range files {
|
||||
file.ID = 0
|
||||
file.UserID = folder.OwnerID
|
||||
if newParentID, ok := newParent[file.FolderID]; ok {
|
||||
file.FolderID = newParentID
|
||||
} else {
|
||||
file.FolderID = folder.ID
|
||||
}
|
||||
if err := tx.Create(&file).Error; err != nil {
|
||||
tx.Rollback()
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return tx.Commit().Error
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
实现 FileInfo.FileInfo 接口
|
||||
TODO 测试
|
||||
|
||||
@@ -515,7 +515,6 @@ func TestFolder_FileInfoInterface(t *testing.T) {
|
||||
UpdatedAt: time.Date(2019, 12, 21, 12, 40, 0, 0, time.UTC),
|
||||
},
|
||||
Name: "test_name",
|
||||
ParentID: 0,
|
||||
OwnerID: 0,
|
||||
Position: "/test",
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ func Init() {
|
||||
|
||||
// Debug模式下,输出所有 SQL 日志
|
||||
if conf.SystemConfig.Debug {
|
||||
db.LogMode(false)
|
||||
db.LogMode(true)
|
||||
}
|
||||
|
||||
//db.SetLogger(util.Log())
|
||||
|
||||
@@ -60,7 +60,7 @@ type UserOption struct {
|
||||
// Root 获取用户的根目录
|
||||
func (user *User) Root() (*Folder, error) {
|
||||
var folder Folder
|
||||
err := DB.Where("parent_id = 0 AND owner_id = ?", user.ID).First(&folder).Error
|
||||
err := DB.Where("parent_id is NULL AND owner_id = ?", user.ID).First(&folder).Error
|
||||
return &folder, err
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user