|
|
|
@ -13,6 +13,7 @@ import ( |
|
|
|
"net/http" |
|
|
|
"os" |
|
|
|
"path" |
|
|
|
"path/filepath" |
|
|
|
"regexp" |
|
|
|
"strings" |
|
|
|
"time" |
|
|
|
@ -284,7 +285,6 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U |
|
|
|
} |
|
|
|
|
|
|
|
dirAbsolutePath := dirMatter.AbsolutePath() |
|
|
|
dirRelativePath := dirMatter.Path |
|
|
|
|
|
|
|
count := this.matterDao.CountByUserUuidAndPuuidAndDirAndName(user.Uuid, dirMatter.Uuid, false, filename) |
|
|
|
if count > 0 { |
|
|
|
@ -292,7 +292,6 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U |
|
|
|
} |
|
|
|
|
|
|
|
fileAbsolutePath := dirAbsolutePath + "/" + filename |
|
|
|
fileRelativePath := dirRelativePath + "/" + filename |
|
|
|
|
|
|
|
util.MakeDirAll(dirAbsolutePath) |
|
|
|
|
|
|
|
@ -340,6 +339,16 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
matter := this.CreateNonDirMatter(dirMatter, filename, fileSize, privacy, user) |
|
|
|
|
|
|
|
return matter |
|
|
|
} |
|
|
|
|
|
|
|
// create a non dir matter.
|
|
|
|
func (this *MatterService) CreateNonDirMatter(dirMatter *Matter, filename string, fileSize int64, privacy bool, user *User) *Matter { |
|
|
|
dirRelativePath := dirMatter.Path |
|
|
|
fileRelativePath := dirRelativePath + "/" + filename |
|
|
|
|
|
|
|
//write to db.
|
|
|
|
matter := &Matter{ |
|
|
|
Puuid: dirMatter.Uuid, |
|
|
|
@ -363,6 +372,21 @@ func (this *MatterService) Upload(request *http.Request, file io.Reader, user *U |
|
|
|
return matter |
|
|
|
} |
|
|
|
|
|
|
|
// create a non dir matter.
|
|
|
|
func (this *MatterService) UpdateNonDirMatter(matter *Matter, fileSize int64, user *User) *Matter { |
|
|
|
|
|
|
|
matter.Size = fileSize |
|
|
|
|
|
|
|
matter = this.matterDao.Save(matter) |
|
|
|
|
|
|
|
//compute the size of directory
|
|
|
|
go core.RunWithRecovery(func() { |
|
|
|
this.ComputeRouteSize(matter.Puuid, user) |
|
|
|
}) |
|
|
|
|
|
|
|
return matter |
|
|
|
} |
|
|
|
|
|
|
|
// compute route size. It will compute upward until root directory
|
|
|
|
func (this *MatterService) ComputeRouteSize(matterUuid string, user *User) { |
|
|
|
|
|
|
|
@ -1051,21 +1075,38 @@ func (this *MatterService) adjustPath(matter *Matter, parentMatter *Matter) { |
|
|
|
} |
|
|
|
|
|
|
|
//delete someone's EyeblueTank files according to physics files.
|
|
|
|
func (this *MatterService) DeleteByPhysics(user *User) { |
|
|
|
func (this *MatterService) DeleteByPhysics(request *http.Request, user *User) { |
|
|
|
|
|
|
|
if user == nil { |
|
|
|
panic(result.BadRequest("user cannot be nil.")) |
|
|
|
} |
|
|
|
|
|
|
|
//scan user's file.
|
|
|
|
this.matterDao.PageHandle("", user.Uuid, "", "", func(matter *Matter) { |
|
|
|
this.logger.Info("handle %s", matter.Name) |
|
|
|
}) |
|
|
|
//scan user's file. scan level by level.
|
|
|
|
rootMatter := NewRootMatter(user) |
|
|
|
this.deleteFolderByPhysics(request, rootMatter, user) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
func (this *MatterService) deleteFolderByPhysics(request *http.Request, dirMatter *Matter, user *User) { |
|
|
|
|
|
|
|
//scan user's file. scan level by level.
|
|
|
|
this.matterDao.PageHandle(dirMatter.Uuid, user.Uuid, "", "", func(matter *Matter) { |
|
|
|
|
|
|
|
if matter.Dir { |
|
|
|
//delete children first.
|
|
|
|
this.deleteFolderByPhysics(request, matter, user) |
|
|
|
} |
|
|
|
|
|
|
|
if !util.PathExists(matter.AbsolutePath()) { |
|
|
|
this.logger.Info("physics file not exist. delete from tank. %s", matter.Name) |
|
|
|
this.AtomicDelete(nil, matter, user) |
|
|
|
} |
|
|
|
|
|
|
|
}) |
|
|
|
} |
|
|
|
|
|
|
|
//scan someone's physics files to EyeblueTank
|
|
|
|
func (this *MatterService) Scan(user *User) { |
|
|
|
func (this *MatterService) ScanPhysics(request *http.Request, user *User) { |
|
|
|
|
|
|
|
if user == nil { |
|
|
|
panic(result.BadRequest("user cannot be nil.")) |
|
|
|
@ -1074,4 +1115,77 @@ func (this *MatterService) Scan(user *User) { |
|
|
|
rootDirPath := GetUserMatterRootDir(user.Username) |
|
|
|
this.logger.Info("scan %s's root dir %s", user.Username, rootDirPath) |
|
|
|
|
|
|
|
rootExists := util.PathExists(rootDirPath) |
|
|
|
if !rootExists { |
|
|
|
util.MakeDirAll(rootDirPath) |
|
|
|
} |
|
|
|
rootFileInfo, err := os.Lstat(rootDirPath) |
|
|
|
if err != nil { |
|
|
|
panic(result.BadRequest("cannot get root file info.")) |
|
|
|
} |
|
|
|
|
|
|
|
rootMatter := NewRootMatter(user) |
|
|
|
this.scanPhysicsFolder(request, rootFileInfo, rootMatter, user) |
|
|
|
} |
|
|
|
|
|
|
|
func (this *MatterService) scanPhysicsFolder(request *http.Request, dirInfo os.FileInfo, dirMatter *Matter, user *User) { |
|
|
|
if !dirInfo.IsDir() { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
//fetch all matters under this folder.
|
|
|
|
_, matters := this.matterDao.PlainPage(0, 1000, dirMatter.Uuid, user.Uuid, "", "", nil, nil) |
|
|
|
nameMatterMap := make(map[string]*Matter) |
|
|
|
for _, m := range matters { |
|
|
|
nameMatterMap[m.Name] = m |
|
|
|
} |
|
|
|
|
|
|
|
dirPath := dirMatter.AbsolutePath() |
|
|
|
names, err := util.ReadDirNames(dirPath) |
|
|
|
if err != nil { |
|
|
|
this.logger.Error("occur error when ReadDirNames %s %s", dirPath, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
for _, name := range names { |
|
|
|
fileFullPath := filepath.Join(dirPath, name) |
|
|
|
fileInfo, err := os.Lstat(fileFullPath) |
|
|
|
if err != nil { |
|
|
|
this.logger.Error("occur error when Lstat %s %s", name, err.Error()) |
|
|
|
continue |
|
|
|
} |
|
|
|
|
|
|
|
//find ther matter
|
|
|
|
var matter *Matter |
|
|
|
_, ok := nameMatterMap[name] |
|
|
|
if ok { |
|
|
|
//exits. check the basic info.
|
|
|
|
matter = nameMatterMap[name] |
|
|
|
//only check the fileSize.
|
|
|
|
if !matter.Dir { |
|
|
|
if matter.Size != fileInfo.Size() { |
|
|
|
this.logger.Info("update matter: %s size %d -> %d", name, matter.Size, fileInfo.Size()) |
|
|
|
this.UpdateNonDirMatter(matter, fileInfo.Size(), user) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
if fileInfo.IsDir() { |
|
|
|
|
|
|
|
//create folder.
|
|
|
|
matter = this.createDirectory(request, dirMatter, name, user) |
|
|
|
|
|
|
|
//recursive scan this folder.
|
|
|
|
this.scanPhysicsFolder(request, fileInfo, matter, user) |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
//not exist. add basic info.
|
|
|
|
this.logger.Info("Create matter: %s size %d", name, fileInfo.Size()) |
|
|
|
matter = this.CreateNonDirMatter(dirMatter, name, fileInfo.Size(), true, user) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|