forked from saltbo/zpan
-
Notifications
You must be signed in to change notification settings - Fork 0
/
folder.go
129 lines (104 loc) · 2.73 KB
/
folder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package fakefs
import (
"fmt"
"strings"
"time"
"gorm.io/gorm"
"github.com/saltbo/zpan/internal/app/dao"
"github.com/saltbo/zpan/internal/app/model"
)
type Folder struct {
dMatter *dao.Matter
}
func NewFolder() *Folder {
return &Folder{
dMatter: dao.NewMatter(),
}
}
func (f *Folder) Create(matter *model.Matter) error {
uploaded := time.Now()
matter.UploadedAt = &uploaded
return f.dMatter.Create(matter)
}
func (f *Folder) Rename(uid int64, alias, name string) error {
m, err := f.dMatter.FindUserMatter(uid, alias)
if err != nil {
return err
}
if _, ok := f.dMatter.Exist(uid, name, m.Parent); ok {
return fmt.Errorf("dir already exist a same name file")
}
children, err := f.dMatter.FindChildren(m.Uid, m.FullPath())
if err != nil {
return err
}
oldParent := fmt.Sprintf("%s%s/", m.Parent, m.Name)
newParent := fmt.Sprintf("%s%s/", m.Parent, name)
fc := func(tx *gorm.DB) error {
for _, v := range children {
parent := strings.Replace(v.Parent, oldParent, newParent, 1)
if err := tx.Model(v).Update("parent", parent).Error; err != nil {
return err
}
}
if err := tx.Model(m).Update("name", name).Error; err != nil {
return err
}
return nil
}
return dao.Transaction(fc)
}
func (f *Folder) Move(uid int64, alias, parent string) error {
m, err := f.dMatter.FindUserMatter(uid, alias)
if err != nil {
return err
}
if err := f.copyOrMoveValidation(m, uid, parent); err != nil {
return err
}
children, err := f.dMatter.FindChildren(m.Uid, m.FullPath())
if err != nil {
return err
}
fc := func(tx *gorm.DB) error {
for _, v := range children {
err := tx.Model(v).Update("parent", parent+m.Name+"/").Error
if err != nil {
return err
}
}
return tx.Model(m).Update("parent", parent).Error
}
return dao.Transaction(fc)
}
func (f *Folder) Remove(uid int64, alias string) error {
m, err := f.dMatter.FindUserMatter(uid, alias)
if err != nil {
return err
}
children, err := f.dMatter.FindChildren(m.Uid, m.FullPath())
if err != nil {
return err
}
for _, v := range children {
if err := f.dMatter.Remove(v.Id, m.Alias); err != nil {
return err
}
}
return f.dMatter.RemoveToRecycle(m.Alias)
}
func (f *Folder) copyOrMoveValidation(m *model.Matter, uid int64, parent string) error {
if !m.IsDir() {
return fmt.Errorf("only support direction")
} else if parent == m.Parent {
return fmt.Errorf("dir already in the dir")
} else if parent != "" && strings.HasPrefix(parent, m.Parent+m.Name+"/") {
return fmt.Errorf("can not move to itself")
} else if !f.dMatter.ParentExist(uid, parent) {
return fmt.Errorf("dir does not exists")
}
if _, ok := f.dMatter.Exist(m.Uid, m.Name, parent); ok {
return fmt.Errorf("dir already has the same name file")
}
return nil
}