Finish the migrate program.
This commit is contained in:
@@ -1 +1 @@
|
|||||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>tank-front-tmp</title><link href=/css/app.a576a8d2.css rel=preload as=style><link href=/css/chunk-vendors.cb22afd2.css rel=preload as=style><link href=/js/app.4452d0c8.js rel=preload as=script><link href=/js/chunk-vendors.220ccae9.js rel=preload as=script><link href=/css/chunk-vendors.cb22afd2.css rel=stylesheet><link href=/css/app.a576a8d2.css rel=stylesheet></head><body><noscript><strong>We're sorry but tank-front-tmp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.220ccae9.js></script><script src=/js/app.4452d0c8.js></script></body></html>
|
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=/favicon.ico><title>tank-front-tmp</title><link href=/css/app.a576a8d2.css rel=preload as=style><link href=/css/chunk-vendors.cb22afd2.css rel=preload as=style><link href=/js/app.ce972e7b.js rel=preload as=script><link href=/js/chunk-vendors.220ccae9.js rel=preload as=script><link href=/css/chunk-vendors.cb22afd2.css rel=stylesheet><link href=/css/app.a576a8d2.css rel=stylesheet></head><body><noscript><strong>We're sorry but tank-front-tmp doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id=app></div><script src=/js/chunk-vendors.220ccae9.js></script><script src=/js/app.ce972e7b.js></script></body></html>
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -166,7 +166,7 @@ func (this *DavService) HandlePropfind(writer http.ResponseWriter, request *http
|
|||||||
matters = []*Matter{matter}
|
matters = []*Matter{matter}
|
||||||
} else {
|
} else {
|
||||||
// len(matters) == 0 means empty directory
|
// len(matters) == 0 means empty directory
|
||||||
matters = this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
|
matters = this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
|
||||||
|
|
||||||
//add this matter to head.
|
//add this matter to head.
|
||||||
matters = append([]*Matter{matter}, matters...)
|
matters = append([]*Matter{matter}, matters...)
|
||||||
|
|||||||
@@ -456,7 +456,7 @@ func (this *MatterController) Zip(writer http.ResponseWriter, request *http.Requ
|
|||||||
|
|
||||||
uuidArray := strings.Split(uuids, ",")
|
uuidArray := strings.Split(uuids, ",")
|
||||||
|
|
||||||
matters := this.matterDao.ListByUuids(uuidArray, nil)
|
matters := this.matterDao.FindByUuids(uuidArray, nil)
|
||||||
|
|
||||||
if matters == nil || len(matters) == 0 {
|
if matters == nil || len(matters) == 0 {
|
||||||
panic(result.BadRequest("matters cannot be nil."))
|
panic(result.BadRequest("matters cannot be nil."))
|
||||||
|
|||||||
+48
-17
@@ -120,6 +120,30 @@ func (this *MatterDao) FindByUserUuidAndPuuidAndNameAndDirTrue(userUuid string,
|
|||||||
return matter
|
return matter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *MatterDao) FindByUserUuidAndPuuidAndDirTrue(userUuid string, puuid string) []*Matter {
|
||||||
|
|
||||||
|
var wp = &builder.WherePair{}
|
||||||
|
|
||||||
|
if userUuid != "" {
|
||||||
|
wp = wp.And(&builder.WherePair{Query: "user_uuid = ?", Args: []interface{}{userUuid}})
|
||||||
|
}
|
||||||
|
|
||||||
|
if puuid != "" {
|
||||||
|
wp = wp.And(&builder.WherePair{Query: "puuid = ?", Args: []interface{}{puuid}})
|
||||||
|
}
|
||||||
|
|
||||||
|
wp = wp.And(&builder.WherePair{Query: "dir = ?", Args: []interface{}{1}})
|
||||||
|
|
||||||
|
var matters []*Matter
|
||||||
|
db := core.CONTEXT.GetDB().Model(&Matter{}).Where(wp.Query, wp.Args...).First(&matters)
|
||||||
|
|
||||||
|
if db.Error != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return matters
|
||||||
|
}
|
||||||
|
|
||||||
func (this *MatterDao) CheckByUuidAndUserUuid(uuid string, userUuid string) *Matter {
|
func (this *MatterDao) CheckByUuidAndUserUuid(uuid string, userUuid string) *Matter {
|
||||||
|
|
||||||
var matter = &Matter{}
|
var matter = &Matter{}
|
||||||
@@ -193,20 +217,11 @@ func (this *MatterDao) FindByUserUuidAndPuuidAndDirAndName(userUuid string, puui
|
|||||||
return matter
|
return matter
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *MatterDao) ListByUserUuidAndPuuidAndDirAndName(userUuid string, puuid string, dir bool, name string) []*Matter {
|
func (this *MatterDao) FindByPuuidAndUserUuid(puuid string, userUuid string, sortArray []builder.OrderPair) []*Matter {
|
||||||
|
|
||||||
var matters []*Matter
|
var matters []*Matter
|
||||||
|
|
||||||
db := core.CONTEXT.GetDB().
|
var wp = &builder.WherePair{}
|
||||||
Where(Matter{UserUuid: userUuid, Puuid: puuid, Dir: dir, Name: name}).
|
wp = wp.And(&builder.WherePair{Query: "puuid = ? AND user_uuid = ?", Args: []interface{}{puuid, userUuid}})
|
||||||
Find(&matters)
|
|
||||||
this.PanicError(db.Error)
|
|
||||||
|
|
||||||
return matters
|
|
||||||
}
|
|
||||||
|
|
||||||
func (this *MatterDao) ListByPuuidAndUserUuid(puuid string, userUuid string, sortArray []builder.OrderPair) []*Matter {
|
|
||||||
var matters []*Matter
|
|
||||||
|
|
||||||
if sortArray == nil {
|
if sortArray == nil {
|
||||||
|
|
||||||
@@ -222,13 +237,13 @@ func (this *MatterDao) ListByPuuidAndUserUuid(puuid string, userUuid string, sor
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db := core.CONTEXT.GetDB().Where(Matter{UserUuid: userUuid, Puuid: puuid}).Order(this.GetSortString(sortArray)).Find(&matters)
|
db := core.CONTEXT.GetDB().Model(&Matter{}).Where(wp.Query, wp.Args...).Order(this.GetSortString(sortArray)).Find(&matters)
|
||||||
this.PanicError(db.Error)
|
this.PanicError(db.Error)
|
||||||
|
|
||||||
return matters
|
return matters
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *MatterDao) ListByUuids(uuids []string, sortArray []builder.OrderPair) []*Matter {
|
func (this *MatterDao) FindByUuids(uuids []string, sortArray []builder.OrderPair) []*Matter {
|
||||||
var matters []*Matter
|
var matters []*Matter
|
||||||
|
|
||||||
db := core.CONTEXT.GetDB().Where(uuids).Order(this.GetSortString(sortArray)).Find(&matters)
|
db := core.CONTEXT.GetDB().Where(uuids).Order(this.GetSortString(sortArray)).Find(&matters)
|
||||||
@@ -236,8 +251,7 @@ func (this *MatterDao) ListByUuids(uuids []string, sortArray []builder.OrderPair
|
|||||||
|
|
||||||
return matters
|
return matters
|
||||||
}
|
}
|
||||||
|
func (this *MatterDao) PlainPage(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) (int, []*Matter) {
|
||||||
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) *Pager {
|
|
||||||
|
|
||||||
var wp = &builder.WherePair{}
|
var wp = &builder.WherePair{}
|
||||||
|
|
||||||
@@ -279,6 +293,12 @@ func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid strin
|
|||||||
var matters []*Matter
|
var matters []*Matter
|
||||||
db = conditionDB.Order(this.GetSortString(sortArray)).Offset(page * pageSize).Limit(pageSize).Find(&matters)
|
db = conditionDB.Order(this.GetSortString(sortArray)).Offset(page * pageSize).Limit(pageSize).Find(&matters)
|
||||||
this.PanicError(db.Error)
|
this.PanicError(db.Error)
|
||||||
|
|
||||||
|
return count, matters
|
||||||
|
}
|
||||||
|
func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, extensions []string, sortArray []builder.OrderPair) *Pager {
|
||||||
|
|
||||||
|
count, matters := this.PlainPage(page, pageSize, puuid, userUuid, name, dir, extensions, sortArray)
|
||||||
pager := NewPager(page, pageSize, count, matters)
|
pager := NewPager(page, pageSize, count, matters)
|
||||||
|
|
||||||
return pager
|
return pager
|
||||||
@@ -337,7 +357,7 @@ func (this *MatterDao) Delete(matter *Matter) {
|
|||||||
|
|
||||||
// recursive if dir
|
// recursive if dir
|
||||||
if matter.Dir {
|
if matter.Dir {
|
||||||
matters := this.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
matters := this.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
||||||
|
|
||||||
for _, f := range matters {
|
for _, f := range matters {
|
||||||
this.Delete(f)
|
this.Delete(f)
|
||||||
@@ -461,6 +481,17 @@ func (this *MatterDao) CountByUserUuidAndPath(userUuid string, path string) int6
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//统计总共有多少条。
|
||||||
|
func (this *MatterDao) Count() int64 {
|
||||||
|
|
||||||
|
var count int64
|
||||||
|
db := core.CONTEXT.GetDB().Model(&Matter{}).Count(&count)
|
||||||
|
core.PanicError(db.Error)
|
||||||
|
|
||||||
|
return count
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//System cleanup.
|
//System cleanup.
|
||||||
func (this *MatterDao) Cleanup() {
|
func (this *MatterDao) Cleanup() {
|
||||||
this.logger.Info("[MatterDao] clean up. Delete all Matter record in db and on disk.")
|
this.logger.Info("[MatterDao] clean up. Delete all Matter record in db and on disk.")
|
||||||
|
|||||||
@@ -393,6 +393,50 @@ func (this *MatterService) ComputeRouteSize(matterUuid string, user *User) {
|
|||||||
this.ComputeRouteSize(matter.Puuid, user)
|
this.ComputeRouteSize(matter.Puuid, user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// compute all dir's size.
|
||||||
|
func (this *MatterService) ComputeAllDirSize(user *User) {
|
||||||
|
|
||||||
|
this.logger.Info("Compute all dir's size for user %s %s", user.Uuid, user.Username)
|
||||||
|
|
||||||
|
rootMatter := NewRootMatter(user)
|
||||||
|
this.ComputeDirSize(rootMatter, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute a dir's size.
|
||||||
|
func (this *MatterService) ComputeDirSize(dirMatter *Matter, user *User) {
|
||||||
|
|
||||||
|
this.logger.Info("Compute dir's size %s %s", dirMatter.Uuid, dirMatter.Name)
|
||||||
|
|
||||||
|
//update sub dir first
|
||||||
|
childrenDirMatters := this.matterDao.FindByUserUuidAndPuuidAndDirTrue(user.Uuid, dirMatter.Uuid)
|
||||||
|
for _, childrenDirMatter := range childrenDirMatters {
|
||||||
|
this.ComputeDirSize(childrenDirMatter, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
//if to root directory, then update to user's info.
|
||||||
|
if dirMatter.Uuid == MATTER_ROOT {
|
||||||
|
|
||||||
|
size := this.matterDao.SizeByPuuidAndUserUuid(MATTER_ROOT, user.Uuid)
|
||||||
|
|
||||||
|
db := core.CONTEXT.GetDB().Model(&User{}).Where("uuid = ?", user.Uuid).Update("total_size", size)
|
||||||
|
this.PanicError(db.Error)
|
||||||
|
|
||||||
|
//update user total size info in cache.
|
||||||
|
user.TotalSize = size
|
||||||
|
} else {
|
||||||
|
|
||||||
|
//compute self.
|
||||||
|
size := this.matterDao.SizeByPuuidAndUserUuid(dirMatter.Uuid, user.Uuid)
|
||||||
|
|
||||||
|
//when changed, we update
|
||||||
|
if dirMatter.Size != size {
|
||||||
|
db := core.CONTEXT.GetDB().Model(&Matter{}).Where("uuid = ?", dirMatter.Uuid).Update("size", size)
|
||||||
|
this.PanicError(db.Error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//inner create directory.
|
//inner create directory.
|
||||||
func (this *MatterService) createDirectory(request *http.Request, dirMatter *Matter, name string, user *User) *Matter {
|
func (this *MatterService) createDirectory(request *http.Request, dirMatter *Matter, name string, user *User) *Matter {
|
||||||
|
|
||||||
@@ -515,7 +559,7 @@ func (this *MatterService) move(request *http.Request, srcMatter *Matter, destDi
|
|||||||
srcMatter = this.matterDao.Save(srcMatter)
|
srcMatter = this.matterDao.Save(srcMatter)
|
||||||
|
|
||||||
//reCompute the path.
|
//reCompute the path.
|
||||||
matters := this.matterDao.ListByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
matters := this.matterDao.FindByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
||||||
for _, m := range matters {
|
for _, m := range matters {
|
||||||
this.adjustPath(m, srcMatter)
|
this.adjustPath(m, srcMatter)
|
||||||
}
|
}
|
||||||
@@ -638,7 +682,7 @@ func (this *MatterService) copy(request *http.Request, srcMatter *Matter, destDi
|
|||||||
newMatter = this.matterDao.Create(newMatter)
|
newMatter = this.matterDao.Create(newMatter)
|
||||||
|
|
||||||
//copy children
|
//copy children
|
||||||
matters := this.matterDao.ListByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
matters := this.matterDao.FindByPuuidAndUserUuid(srcMatter.Uuid, srcMatter.UserUuid, nil)
|
||||||
for _, m := range matters {
|
for _, m := range matters {
|
||||||
this.copy(request, m, newMatter, m.Name)
|
this.copy(request, m, newMatter, m.Name)
|
||||||
}
|
}
|
||||||
@@ -729,7 +773,7 @@ func (this *MatterService) AtomicRename(request *http.Request, matter *Matter, n
|
|||||||
matter = this.matterDao.Save(matter)
|
matter = this.matterDao.Save(matter)
|
||||||
|
|
||||||
//调整该文件夹下文件的Path.
|
//调整该文件夹下文件的Path.
|
||||||
matters := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
matters := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
||||||
for _, m := range matters {
|
for _, m := range matters {
|
||||||
this.adjustPath(m, matter)
|
this.adjustPath(m, matter)
|
||||||
}
|
}
|
||||||
@@ -917,7 +961,7 @@ func (this *MatterService) WrapChildrenDetail(request *http.Request, matter *Mat
|
|||||||
|
|
||||||
if matter.Dir {
|
if matter.Dir {
|
||||||
|
|
||||||
children := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
children := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
||||||
matter.Children = children
|
matter.Children = children
|
||||||
|
|
||||||
for _, child := range matter.Children {
|
for _, child := range matter.Children {
|
||||||
@@ -967,7 +1011,7 @@ func (this *MatterService) adjustPath(matter *Matter, parentMatter *Matter) {
|
|||||||
matter = this.matterDao.Save(matter)
|
matter = this.matterDao.Save(matter)
|
||||||
|
|
||||||
//adjust children.
|
//adjust children.
|
||||||
matters := this.matterDao.ListByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
matters := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, matter.UserUuid, nil)
|
||||||
for _, m := range matters {
|
for _, m := range matters {
|
||||||
this.adjustPath(m, matter)
|
this.adjustPath(m, matter)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import (
|
|||||||
type PreferenceController struct {
|
type PreferenceController struct {
|
||||||
BaseController
|
BaseController
|
||||||
preferenceDao *PreferenceDao
|
preferenceDao *PreferenceDao
|
||||||
|
matterDao *MatterDao
|
||||||
preferenceService *PreferenceService
|
preferenceService *PreferenceService
|
||||||
migrating bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *PreferenceController) Init() {
|
func (this *PreferenceController) Init() {
|
||||||
@@ -23,6 +23,10 @@ func (this *PreferenceController) Init() {
|
|||||||
this.preferenceDao = b
|
this.preferenceDao = b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b = core.CONTEXT.GetBean(this.matterDao)
|
||||||
|
if b, ok := b.(*MatterDao); ok {
|
||||||
|
this.matterDao = b
|
||||||
|
}
|
||||||
b = core.CONTEXT.GetBean(this.preferenceService)
|
b = core.CONTEXT.GetBean(this.preferenceService)
|
||||||
if b, ok := b.(*PreferenceService); ok {
|
if b, ok := b.(*PreferenceService); ok {
|
||||||
this.preferenceService = b
|
this.preferenceService = b
|
||||||
@@ -125,44 +129,6 @@ func (this *PreferenceController) Edit(writer http.ResponseWriter, request *http
|
|||||||
return this.Success(preference)
|
return this.Success(preference)
|
||||||
}
|
}
|
||||||
|
|
||||||
//migrate 2.0's db data and file data to 3.0
|
|
||||||
func (this *PreferenceController) Migrate20to30(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
|
||||||
|
|
||||||
this.logger.Info("start migrating from 2.0 to 3.0")
|
|
||||||
|
|
||||||
if this.migrating {
|
|
||||||
panic(result.BadRequest("migrating work is processing"))
|
|
||||||
} else {
|
|
||||||
this.migrating = true
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
this.migrating = false
|
|
||||||
}()
|
|
||||||
|
|
||||||
migrateDashboardSql := "INSERT INTO `tank`.`tank30_download_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` FROM `tank`.`tank20_download_token`)"
|
|
||||||
this.logger.Info(migrateDashboardSql)
|
|
||||||
core.CONTEXT.GetDB().Exec(migrateDashboardSql)
|
|
||||||
|
|
||||||
migrateDownloadTokenSql := "INSERT INTO `tank`.`tank30_dashboard` ( `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` FROM `tank`.`tank20_dashboard` )"
|
|
||||||
this.logger.Info(migrateDownloadTokenSql)
|
|
||||||
core.CONTEXT.GetDB().Exec(migrateDownloadTokenSql)
|
|
||||||
|
|
||||||
migrateMatterSql := "INSERT INTO `tank`.`tank30_matter` ( `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, `username`, `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, '', `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` FROM `tank`.`tank20_matter` ) "
|
|
||||||
this.logger.Info(migrateMatterSql)
|
|
||||||
core.CONTEXT.GetDB().Exec(migrateMatterSql)
|
|
||||||
|
|
||||||
migrateUploadTokenSql := "INSERT INTO `tank`.`tank30_upload_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` FROM `tank`.`tank20_upload_token` ) "
|
|
||||||
this.logger.Info(migrateUploadTokenSql)
|
|
||||||
core.CONTEXT.GetDB().Exec(migrateUploadTokenSql)
|
|
||||||
|
|
||||||
//username in tank2.0 add _20.
|
|
||||||
migrateUserSql := "INSERT INTO `tank`.`tank30_user` ( `uuid`, `sort`, `update_time`, `create_time`, `role`, `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, `total_size_limit`, `total_size`, `status` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `role`, CONCAT(`username`,'_20') as `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, -1, 0, `status` FROM `tank`.`tank20_user` )"
|
|
||||||
this.logger.Info(migrateUserSql)
|
|
||||||
core.CONTEXT.GetDB().Exec(migrateUserSql)
|
|
||||||
|
|
||||||
return this.Success("OK")
|
|
||||||
}
|
|
||||||
|
|
||||||
//cleanup system data.
|
//cleanup system data.
|
||||||
func (this *PreferenceController) SystemCleanup(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
func (this *PreferenceController) SystemCleanup(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||||
|
|
||||||
@@ -178,3 +144,12 @@ func (this *PreferenceController) SystemCleanup(writer http.ResponseWriter, requ
|
|||||||
|
|
||||||
return this.Success("OK")
|
return this.Success("OK")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//migrate 2.0's db data and file data to 3.0
|
||||||
|
func (this *PreferenceController) Migrate20to30(writer http.ResponseWriter, request *http.Request) *result.WebResult {
|
||||||
|
|
||||||
|
this.logger.Info("start migrating from 2.0 to 3.0")
|
||||||
|
|
||||||
|
this.preferenceService.Migrate20to30(writer, request)
|
||||||
|
return this.Success("OK")
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,12 +1,26 @@
|
|||||||
package rest
|
package rest
|
||||||
|
|
||||||
import "github.com/eyebluecn/tank/code/core"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/eyebluecn/tank/code/core"
|
||||||
|
"github.com/eyebluecn/tank/code/tool/i18n"
|
||||||
|
"github.com/eyebluecn/tank/code/tool/result"
|
||||||
|
"github.com/eyebluecn/tank/code/tool/util"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
//@Service
|
//@Service
|
||||||
type PreferenceService struct {
|
type PreferenceService struct {
|
||||||
BaseBean
|
BaseBean
|
||||||
preferenceDao *PreferenceDao
|
preferenceDao *PreferenceDao
|
||||||
preference *Preference
|
preference *Preference
|
||||||
|
matterDao *MatterDao
|
||||||
|
matterService *MatterService
|
||||||
|
userDao *UserDao
|
||||||
|
migrating bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *PreferenceService) Init() {
|
func (this *PreferenceService) Init() {
|
||||||
@@ -17,6 +31,21 @@ func (this *PreferenceService) Init() {
|
|||||||
this.preferenceDao = b
|
this.preferenceDao = b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
b = core.CONTEXT.GetBean(this.matterDao)
|
||||||
|
if b, ok := b.(*MatterDao); ok {
|
||||||
|
this.matterDao = b
|
||||||
|
}
|
||||||
|
|
||||||
|
b = core.CONTEXT.GetBean(this.matterService)
|
||||||
|
if b, ok := b.(*MatterService); ok {
|
||||||
|
this.matterService = b
|
||||||
|
}
|
||||||
|
|
||||||
|
b = core.CONTEXT.GetBean(this.userDao)
|
||||||
|
if b, ok := b.(*UserDao); ok {
|
||||||
|
this.userDao = b
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *PreferenceService) Fetch() *Preference {
|
func (this *PreferenceService) Fetch() *Preference {
|
||||||
@@ -42,3 +71,191 @@ func (this *PreferenceService) Cleanup() {
|
|||||||
|
|
||||||
this.Reset()
|
this.Reset()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//migrate 2.0's db data and file data to 3.0
|
||||||
|
func (this *PreferenceService) Migrate20to30(writer http.ResponseWriter, request *http.Request) {
|
||||||
|
|
||||||
|
matterPath := request.FormValue("matterPath")
|
||||||
|
|
||||||
|
if matterPath == "" {
|
||||||
|
panic(result.BadRequest("matterPath required"))
|
||||||
|
}
|
||||||
|
|
||||||
|
this.logger.Info("start migrating from 2.0 to 3.0")
|
||||||
|
|
||||||
|
//lock
|
||||||
|
if this.migrating {
|
||||||
|
panic(result.BadRequest("migrating work is processing"))
|
||||||
|
} else {
|
||||||
|
this.migrating = true
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
this.migrating = false
|
||||||
|
}()
|
||||||
|
|
||||||
|
//delete all users with _20
|
||||||
|
this.userDao.DeleteUsers20()
|
||||||
|
|
||||||
|
migrateDashboardSql := "INSERT INTO `tank`.`tank30_download_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `matter_uuid`, `expire_time`, `ip` FROM `tank`.`tank20_download_token`)"
|
||||||
|
this.logger.Info(migrateDashboardSql)
|
||||||
|
db := core.CONTEXT.GetDB().Exec(migrateDashboardSql)
|
||||||
|
if db.Error != nil {
|
||||||
|
this.logger.Error("%v", db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
migrateDownloadTokenSql := "INSERT INTO `tank`.`tank30_dashboard` ( `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `invoke_num`, `total_invoke_num`, `uv`, `total_uv`, `matter_num`, `total_matter_num`, `file_size`, `total_file_size`, `avg_cost`, `dt` FROM `tank`.`tank20_dashboard` )"
|
||||||
|
this.logger.Info(migrateDownloadTokenSql)
|
||||||
|
db = core.CONTEXT.GetDB().Exec(migrateDownloadTokenSql)
|
||||||
|
if db.Error != nil {
|
||||||
|
this.logger.Error("%v", db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
migrateMatterSql := "INSERT INTO `tank`.`tank30_matter` ( `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, `username`, `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `puuid`, `user_uuid`, '', `dir`, `name`, `md5`, `size`, `privacy`, `path`, `times` FROM `tank`.`tank20_matter` ) "
|
||||||
|
this.logger.Info(migrateMatterSql)
|
||||||
|
db = core.CONTEXT.GetDB().Exec(migrateMatterSql)
|
||||||
|
if db.Error != nil {
|
||||||
|
this.logger.Error("%v", db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
migrateUploadTokenSql := "INSERT INTO `tank`.`tank30_upload_token` ( `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `user_uuid`, `folder_uuid`, `matter_uuid`, `expire_time`, `filename`, `privacy`, `size`, `ip` FROM `tank`.`tank20_upload_token` ) "
|
||||||
|
this.logger.Info(migrateUploadTokenSql)
|
||||||
|
db = core.CONTEXT.GetDB().Exec(migrateUploadTokenSql)
|
||||||
|
if db.Error != nil {
|
||||||
|
this.logger.Error("%v", db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//username in tank2.0 add _20.
|
||||||
|
migrateUserSql := "INSERT INTO `tank`.`tank30_user` ( `uuid`, `sort`, `update_time`, `create_time`, `role`, `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, `total_size_limit`, `total_size`, `status` ) ( SELECT `uuid`, `sort`, `update_time`, `create_time`, `role`, CONCAT(`username`,'_20') as `username`, `password`, `avatar_url`, `last_ip`, `last_time`, `size_limit`, -1, 0, `status` FROM `tank`.`tank20_user` )"
|
||||||
|
this.logger.Info(migrateUserSql)
|
||||||
|
db = core.CONTEXT.GetDB().Exec(migrateUserSql)
|
||||||
|
if db.Error != nil {
|
||||||
|
this.logger.Error("%v", db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
//find all 2.0 users.
|
||||||
|
users := this.userDao.FindUsers20()
|
||||||
|
for _, user := range users {
|
||||||
|
this.logger.Info("start handling matters for user %s %s", user.Uuid, user.Username)
|
||||||
|
rootMatter := NewRootMatter(user)
|
||||||
|
firstLevelMatters := this.matterDao.FindByPuuidAndUserUuid(MATTER_ROOT, user.Uuid, nil)
|
||||||
|
for _, firstLevelMatter := range firstLevelMatters {
|
||||||
|
this.HandleMatter20(request, matterPath, rootMatter, firstLevelMatter, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
//adjust all the size.
|
||||||
|
this.matterService.ComputeAllDirSize(user)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//handle matter from 2.0
|
||||||
|
func (this *PreferenceService) HandleMatter20(request *http.Request, matterPath string, dirMatter *Matter, matter *Matter, user *User) {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
this.logger.Warn("HandleMatter20 occur error %v when handle matter %s %s. Ignore the error and continue. \r\n", err, matter.Uuid, matter.Name)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
this.logger.Info("start handling matter %s", matter.Name)
|
||||||
|
|
||||||
|
if matter == nil {
|
||||||
|
panic(result.BadRequest("matter cannot be nil."))
|
||||||
|
}
|
||||||
|
|
||||||
|
if user == nil {
|
||||||
|
panic(result.BadRequest("user cannot be nil."))
|
||||||
|
}
|
||||||
|
|
||||||
|
if dirMatter == nil {
|
||||||
|
panic(result.BadRequest("dirMatter cannot be nil"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !dirMatter.Dir {
|
||||||
|
panic(result.BadRequest("dirMatter must be directory"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if dirMatter.UserUuid != user.Uuid {
|
||||||
|
|
||||||
|
panic(result.BadRequest("file's user not the same"))
|
||||||
|
}
|
||||||
|
|
||||||
|
name := matter.Name
|
||||||
|
filename := name
|
||||||
|
if name == "" {
|
||||||
|
panic(result.BadRequest("name cannot be blank"))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(name) > MATTER_NAME_MAX_LENGTH {
|
||||||
|
|
||||||
|
panic(result.BadRequestI18n(request, i18n.MatterNameLengthExceedLimit, len(name), MATTER_NAME_MAX_LENGTH))
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//if directory. Create it.
|
||||||
|
if matter.Dir {
|
||||||
|
|
||||||
|
if m, _ := regexp.MatchString(MATTER_NAME_PATTERN, name); m {
|
||||||
|
panic(result.BadRequestI18n(request, i18n.MatterNameContainSpecialChars))
|
||||||
|
}
|
||||||
|
|
||||||
|
parts := strings.Split(dirMatter.Path, "/")
|
||||||
|
|
||||||
|
if len(parts) > MATTER_NAME_MAX_DEPTH {
|
||||||
|
panic(result.BadRequestI18n(request, i18n.MatterDepthExceedLimit, len(parts), MATTER_NAME_MAX_DEPTH))
|
||||||
|
}
|
||||||
|
|
||||||
|
absolutePath := GetUserMatterRootDir(user.Username) + dirMatter.Path + "/" + name
|
||||||
|
|
||||||
|
relativePath := dirMatter.Path + "/" + name
|
||||||
|
|
||||||
|
//crate directory on disk.
|
||||||
|
dirPath := util.MakeDirAll(absolutePath)
|
||||||
|
this.logger.Info("Create Directory: %s", dirPath)
|
||||||
|
|
||||||
|
//change matter info.
|
||||||
|
matter.Username = user.Username
|
||||||
|
matter.Path = relativePath
|
||||||
|
|
||||||
|
matter = this.matterDao.Save(matter)
|
||||||
|
|
||||||
|
//handle its children.
|
||||||
|
children := this.matterDao.FindByPuuidAndUserUuid(matter.Uuid, user.Uuid, nil)
|
||||||
|
for _, child := range children {
|
||||||
|
this.HandleMatter20(request, matterPath, matter, child, user)
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
//if file. copy and adjust it.
|
||||||
|
|
||||||
|
dirAbsolutePath := dirMatter.AbsolutePath()
|
||||||
|
dirRelativePath := dirMatter.Path
|
||||||
|
|
||||||
|
fileAbsolutePath := dirAbsolutePath + "/" + filename
|
||||||
|
fileRelativePath := dirRelativePath + "/" + filename
|
||||||
|
|
||||||
|
util.MakeDirAll(dirAbsolutePath)
|
||||||
|
|
||||||
|
//if exist, panic it.
|
||||||
|
exist := util.PathExists(fileAbsolutePath)
|
||||||
|
if exist {
|
||||||
|
this.logger.Error("%s exits, overwrite it.", fileAbsolutePath)
|
||||||
|
removeError := os.Remove(fileAbsolutePath)
|
||||||
|
this.PanicError(removeError)
|
||||||
|
}
|
||||||
|
|
||||||
|
srcAbsolutePath := fmt.Sprintf("%s%s", matterPath, matter.Path)
|
||||||
|
|
||||||
|
//find the 2.0 disk file.
|
||||||
|
fileSize := util.CopyFile(srcAbsolutePath, fileAbsolutePath)
|
||||||
|
|
||||||
|
this.logger.Info("copy %s %v ", filename, util.HumanFileSize(fileSize))
|
||||||
|
|
||||||
|
//update info.
|
||||||
|
matter.Path = fileRelativePath
|
||||||
|
matter.Username = user.Username
|
||||||
|
|
||||||
|
matter = this.matterDao.Save(matter)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -293,7 +293,7 @@ func (this *ShareController) Browse(writer http.ResponseWriter, request *http.Re
|
|||||||
Value: DIRECTION_DESC,
|
Value: DIRECTION_DESC,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
matters = this.matterDao.ListByUuids(uuids, sortArray)
|
matters = this.matterDao.FindByUuids(uuids, sortArray)
|
||||||
|
|
||||||
share.Matters = matters
|
share.Matters = matters
|
||||||
}
|
}
|
||||||
@@ -358,7 +358,7 @@ func (this *ShareController) Zip(writer http.ResponseWriter, request *http.Reque
|
|||||||
for _, bridge := range bridges {
|
for _, bridge := range bridges {
|
||||||
matterUuids = append(matterUuids, bridge.MatterUuid)
|
matterUuids = append(matterUuids, bridge.MatterUuid)
|
||||||
}
|
}
|
||||||
matters := this.matterDao.ListByUuids(matterUuids, nil)
|
matters := this.matterDao.FindByUuids(matterUuids, nil)
|
||||||
this.matterService.DownloadZip(writer, request, matters)
|
this.matterService.DownloadZip(writer, request, matters)
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -130,6 +130,25 @@ func (this *UserDao) Save(user *User) *User {
|
|||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//find all 2.0 users.
|
||||||
|
func (this *UserDao) FindUsers20() []*User {
|
||||||
|
var users []*User
|
||||||
|
var wp = &builder.WherePair{}
|
||||||
|
wp = wp.And(&builder.WherePair{Query: "username like ?", Args: []interface{}{"%_20"}})
|
||||||
|
|
||||||
|
db := core.CONTEXT.GetDB().Model(&User{}).Where(wp.Query, wp.Args...).Find(&users)
|
||||||
|
this.PanicError(db.Error)
|
||||||
|
return users
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *UserDao) DeleteUsers20() {
|
||||||
|
var wp = &builder.WherePair{}
|
||||||
|
wp = wp.And(&builder.WherePair{Query: "username like ?", Args: []interface{}{"%_20"}})
|
||||||
|
|
||||||
|
db := core.CONTEXT.GetDB().Where(wp.Query, wp.Args...).Delete(User{})
|
||||||
|
this.PanicError(db.Error)
|
||||||
|
}
|
||||||
|
|
||||||
//System cleanup.
|
//System cleanup.
|
||||||
func (this *UserDao) Cleanup() {
|
func (this *UserDao) Cleanup() {
|
||||||
this.logger.Info("[UserDao] clean up. Delete all User")
|
this.logger.Info("[UserDao] clean up. Delete all User")
|
||||||
|
|||||||
@@ -195,12 +195,11 @@ func (this *TankRouter) ServeHTTP(writer http.ResponseWriter, request *http.Requ
|
|||||||
//static file.
|
//static file.
|
||||||
dir := util.GetHtmlPath()
|
dir := util.GetHtmlPath()
|
||||||
|
|
||||||
requestURI := request.RequestURI
|
if path == "" || path == "/" {
|
||||||
if requestURI == "" || request.RequestURI == "/" {
|
path = "index.html"
|
||||||
requestURI = "index.html"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
filePath := dir + requestURI
|
filePath := dir + path
|
||||||
exists := util.PathExists(filePath)
|
exists := util.PathExists(filePath)
|
||||||
if !exists {
|
if !exists {
|
||||||
filePath = dir + "/index.html"
|
filePath = dir + "/index.html"
|
||||||
|
|||||||
Reference in New Issue
Block a user