Fix: unique index check failed due to soft delete
This commit is contained in:
parent
fd02425547
commit
d28e5632d5
4 changed files with 35 additions and 38 deletions
|
@ -123,7 +123,7 @@ func RemoveFilesWithSoftLinks(files []File) ([]File, error) {
|
||||||
|
|
||||||
// DeleteFileByIDs 根据给定ID批量删除文件记录
|
// DeleteFileByIDs 根据给定ID批量删除文件记录
|
||||||
func DeleteFileByIDs(ids []uint) error {
|
func DeleteFileByIDs(ids []uint) error {
|
||||||
result := DB.Where("id in (?)", ids).Delete(&File{})
|
result := DB.Where("id in (?)", ids).Unscoped().Delete(&File{})
|
||||||
return result.Error
|
return result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,7 +52,7 @@ func GetRecursiveChildFolder(dirs []string, uid uint) ([]Folder, error) {
|
||||||
|
|
||||||
// DeleteFolderByIDs 根据给定ID批量删除目录记录
|
// DeleteFolderByIDs 根据给定ID批量删除目录记录
|
||||||
func DeleteFolderByIDs(ids []uint) error {
|
func DeleteFolderByIDs(ids []uint) error {
|
||||||
result := DB.Where("id in (?)", ids).Delete(&Folder{})
|
result := DB.Where("id in (?)", ids).Unscoped().Delete(&Folder{})
|
||||||
return result.Error
|
return result.Error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,14 +62,8 @@ func DeleteFolderByIDs(ids []uint) error {
|
||||||
|
|
||||||
// MoveFileTo 将此目录下的文件递归移动至dstFolder
|
// MoveFileTo 将此目录下的文件递归移动至dstFolder
|
||||||
func (folder *Folder) MoveFileTo(files []string, dstFolder *Folder) error {
|
func (folder *Folder) MoveFileTo(files []string, dstFolder *Folder) error {
|
||||||
// 生成绝对路径
|
|
||||||
fullFilePath := make([]string, len(files))
|
|
||||||
for i := 0; i < len(files); i++ {
|
|
||||||
fullFilePath[i] = path.Join(folder.PositionAbsolute, files[i])
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更改顶级要移动文件的父目录指向
|
// 更改顶级要移动文件的父目录指向
|
||||||
err := DB.Model(File{}).Where("dir in (?) and user_id = ?", fullFilePath, folder.OwnerID).
|
err := DB.Model(File{}).Where("dir in (?) and user_id = ?", folder.PositionAbsolute, folder.OwnerID).
|
||||||
Update(map[string]interface{}{
|
Update(map[string]interface{}{
|
||||||
"folder_id": dstFolder.ID,
|
"folder_id": dstFolder.ID,
|
||||||
"dir": dstFolder.PositionAbsolute,
|
"dir": dstFolder.PositionAbsolute,
|
||||||
|
|
|
@ -77,31 +77,32 @@ func (fs *FileSystem) Delete(ctx context.Context, dirs, files []string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
// 去除待删除文件中包含软连接的部分
|
}
|
||||||
filesToBeDelete, err := model.RemoveFilesWithSoftLinks(fs.FileTarget)
|
|
||||||
if err != nil {
|
// 去除待删除文件中包含软连接的部分
|
||||||
return ErrDBListObjects.WithError(err)
|
filesToBeDelete, err := model.RemoveFilesWithSoftLinks(fs.FileTarget)
|
||||||
}
|
if err != nil {
|
||||||
|
return ErrDBListObjects.WithError(err)
|
||||||
// 根据存储策略将文件分组
|
}
|
||||||
policyGroup := fs.GroupFileByPolicy(ctx, filesToBeDelete)
|
|
||||||
|
// 根据存储策略将文件分组
|
||||||
// 按照存储策略分组删除对象
|
policyGroup := fs.GroupFileByPolicy(ctx, filesToBeDelete)
|
||||||
failed := fs.deleteGroupedFile(ctx, policyGroup)
|
|
||||||
|
// 按照存储策略分组删除对象
|
||||||
for i := 0; i < len(fs.FileTarget); i++ {
|
failed := fs.deleteGroupedFile(ctx, policyGroup)
|
||||||
if util.ContainsString(failed[fs.FileTarget[i].PolicyID], fs.FileTarget[i].SourceName) {
|
|
||||||
// TODO 删除失败时不删除文件记录及父目录
|
for i := 0; i < len(fs.FileTarget); i++ {
|
||||||
} else {
|
if util.ContainsString(failed[fs.FileTarget[i].PolicyID], fs.FileTarget[i].SourceName) {
|
||||||
deletedFileIDs = append(deletedFileIDs, fs.FileTarget[i].ID)
|
// TODO 删除失败时不删除文件记录及父目录
|
||||||
}
|
} else {
|
||||||
deletedStorage[fs.FileTarget[i].ID] = fs.FileTarget[i].Size
|
deletedFileIDs = append(deletedFileIDs, fs.FileTarget[i].ID)
|
||||||
allFileIDs = append(allFileIDs, fs.FileTarget[i].ID)
|
|
||||||
}
|
}
|
||||||
|
deletedStorage[fs.FileTarget[i].ID] = fs.FileTarget[i].Size
|
||||||
|
allFileIDs = append(allFileIDs, fs.FileTarget[i].ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除文件记录
|
// 删除文件记录
|
||||||
err := model.DeleteFileByIDs(allFileIDs)
|
err = model.DeleteFileByIDs(allFileIDs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return ErrDBDeleteObjects.WithError(err)
|
return ErrDBDeleteObjects.WithError(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,10 +27,11 @@ type User struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Policy struct {
|
type Policy struct {
|
||||||
SaveType string `json:"saveType"`
|
SaveType string `json:"saveType"`
|
||||||
MaxSize string `json:"maxSize"`
|
MaxSize string `json:"maxSize"`
|
||||||
AllowedType []string `json:"allowedType"`
|
AllowedType []string `json:"allowedType"`
|
||||||
UploadURL string `json:"upUrl"`
|
UploadURL string `json:"upUrl"`
|
||||||
|
AllowGetSource bool `json:"allowSource"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Group struct {
|
type Group struct {
|
||||||
|
@ -51,10 +52,11 @@ func BuildUser(user model.User) User {
|
||||||
CreatedAt: user.CreatedAt.Unix(),
|
CreatedAt: user.CreatedAt.Unix(),
|
||||||
PreferredTheme: user.OptionsSerialized.PreferredTheme,
|
PreferredTheme: user.OptionsSerialized.PreferredTheme,
|
||||||
Policy: Policy{
|
Policy: Policy{
|
||||||
SaveType: user.Policy.Type,
|
SaveType: user.Policy.Type,
|
||||||
MaxSize: fmt.Sprintf("%.2fmb", float64(user.Policy.MaxSize)/1024*1024),
|
MaxSize: fmt.Sprintf("%.2fmb", float64(user.Policy.MaxSize)/1024*1024),
|
||||||
AllowedType: user.Policy.OptionsSerialized.FileType,
|
AllowedType: user.Policy.OptionsSerialized.FileType,
|
||||||
UploadURL: user.Policy.Server,
|
UploadURL: user.Policy.Server,
|
||||||
|
AllowGetSource: user.Policy.IsOriginLinkEnable,
|
||||||
},
|
},
|
||||||
Group: Group{
|
Group: Group{
|
||||||
AllowShare: user.Group.ShareEnabled,
|
AllowShare: user.Group.ShareEnabled,
|
||||||
|
|
Loading…
Add table
Reference in a new issue