Fix: unique index check failed due to soft delete

pull/247/head
HFO4 5 years ago
parent fd02425547
commit d28e5632d5

@ -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)
}
// 根据存储策略将文件分组 // 去除待删除文件中包含软连接的部分
policyGroup := fs.GroupFileByPolicy(ctx, filesToBeDelete) filesToBeDelete, err := model.RemoveFilesWithSoftLinks(fs.FileTarget)
if err != nil {
return ErrDBListObjects.WithError(err)
}
// 按照存储策略分组删除对象 // 根据存储策略将文件分组
failed := fs.deleteGroupedFile(ctx, policyGroup) policyGroup := fs.GroupFileByPolicy(ctx, filesToBeDelete)
for i := 0; i < len(fs.FileTarget); i++ { // 按照存储策略分组删除对象
if util.ContainsString(failed[fs.FileTarget[i].PolicyID], fs.FileTarget[i].SourceName) { failed := fs.deleteGroupedFile(ctx, policyGroup)
// TODO 删除失败时不删除文件记录及父目录
} else { for i := 0; i < len(fs.FileTarget); i++ {
deletedFileIDs = append(deletedFileIDs, fs.FileTarget[i].ID) if util.ContainsString(failed[fs.FileTarget[i].PolicyID], fs.FileTarget[i].SourceName) {
} // TODO 删除失败时不删除文件记录及父目录
deletedStorage[fs.FileTarget[i].ID] = fs.FileTarget[i].Size } else {
allFileIDs = append(allFileIDs, fs.FileTarget[i].ID) deletedFileIDs = append(deletedFileIDs, 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…
Cancel
Save