diff --git a/code/rest/matter_dao.go b/code/rest/matter_dao.go index 0394e5f..ab1abab 100644 --- a/code/rest/matter_dao.go +++ b/code/rest/matter_dao.go @@ -255,7 +255,17 @@ func (this *MatterDao) FindByUuids(uuids []string, sortArray []builder.OrderPair return matters } -func (this *MatterDao) PlainPage(page int, pageSize int, puuid string, userUuid string, name string, dir string, deleted string, extensions []string, sortArray []builder.OrderPair) (int, []*Matter) { +func (this *MatterDao) PlainPage( + page int, + pageSize int, + puuid string, + userUuid string, + name string, + dir string, + deleted string, + deleteTimeBefore *time.Time, + extensions []string, + sortArray []builder.OrderPair) (int, []*Matter) { var wp = &builder.WherePair{} @@ -271,6 +281,10 @@ func (this *MatterDao) PlainPage(page int, pageSize int, puuid string, userUuid wp = wp.And(&builder.WherePair{Query: "name LIKE ?", Args: []interface{}{"%" + name + "%"}}) } + if deleteTimeBefore != nil { + wp = wp.And(&builder.WherePair{Query: "delete_time < ?", Args: []interface{}{&deleteTimeBefore}}) + } + if dir == TRUE { wp = wp.And(&builder.WherePair{Query: "dir = ?", Args: []interface{}{1}}) } else if dir == FALSE { @@ -308,30 +322,40 @@ func (this *MatterDao) PlainPage(page int, pageSize int, puuid string, userUuid } func (this *MatterDao) Page(page int, pageSize int, puuid string, userUuid string, name string, dir string, deleted string, extensions []string, sortArray []builder.OrderPair) *Pager { - count, matters := this.PlainPage(page, pageSize, puuid, userUuid, name, dir, deleted, extensions, sortArray) + count, matters := this.PlainPage(page, pageSize, puuid, userUuid, name, dir, deleted, nil, extensions, sortArray) pager := NewPager(page, pageSize, count, matters) return pager } //handle matter page by page. -func (this *MatterDao) PageHandle(puuid string, userUuid string, name string, dir string, deleted string, fun func(matter *Matter)) { +func (this *MatterDao) PageHandle( + puuid string, + userUuid string, + name string, + dir string, + deleted string, + deleteTimeBefore *time.Time, + sortArray []builder.OrderPair, + fun func(matter *Matter)) { - //delete share and bridges. pageSize := 1000 - sortArray := []builder.OrderPair{ - { - Key: "uuid", - Value: DIRECTION_ASC, - }, + if sortArray == nil || len(sortArray) == 0 { + sortArray = []builder.OrderPair{ + { + Key: "uuid", + Value: DIRECTION_ASC, + }, + } } - count, _ := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, nil, sortArray) + + count, _ := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray) if count > 0 { var totalPages = int(math.Ceil(float64(count) / float64(pageSize))) var page int for page = 0; page < totalPages; page++ { - _, matters := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, nil, sortArray) + _, matters := this.PlainPage(0, pageSize, puuid, userUuid, name, dir, deleted, deleteTimeBefore, nil, sortArray) for _, matter := range matters { fun(matter) } diff --git a/code/rest/matter_service.go b/code/rest/matter_service.go index 09b32e9..76a9a56 100644 --- a/code/rest/matter_service.go +++ b/code/rest/matter_service.go @@ -4,6 +4,7 @@ import ( "archive/zip" "fmt" "github.com/eyebluecn/tank/code/core" + "github.com/eyebluecn/tank/code/tool/builder" "github.com/eyebluecn/tank/code/tool/download" "github.com/eyebluecn/tank/code/tool/i18n" "github.com/eyebluecn/tank/code/tool/result" @@ -1151,7 +1152,7 @@ func (this *MatterService) DeleteByPhysics(request *http.Request, user *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) { + this.matterDao.PageHandle(dirMatter.Uuid, user.Uuid, "", "", "", nil, nil, func(matter *Matter) { if matter.Dir { //delete children first. @@ -1195,7 +1196,7 @@ func (this *MatterService) scanPhysicsFolder(request *http.Request, dirInfo os.F } //fetch all matters under this folder. - _, matters := this.matterDao.PlainPage(0, 1000, dirMatter.Uuid, user.Uuid, "", "", "", nil, nil) + _, matters := this.matterDao.PlainPage(0, 1000, dirMatter.Uuid, user.Uuid, "", "", "", nil, nil, nil) nameMatterMap := make(map[string]*Matter) for _, m := range matters { nameMatterMap[m.Name] = m @@ -1255,3 +1256,39 @@ func (this *MatterService) scanPhysicsFolder(request *http.Request, dirInfo os.F } } } + +//clean all the expired deleted matters +func (this *MatterService) CleanExpiredDeletedMatters() { + //mock a request. + request := &http.Request{} + + preference := this.preferenceService.Fetch() + + this.userDao.PageHandle("", "", func(user *User) { + + this.logger.Info("Clean %s 's deleted matters", user.Username) + + thenDate := time.Now() + thenDate = thenDate.AddDate(0, 0, int(-preference.DeletedKeepDays)) + thenDate = util.FirstSecondOfDay(thenDate) + + //first remove all the matter(not dir). + this.matterDao.PageHandle("", "", "", FALSE, TRUE, &thenDate, nil, func(matter *Matter) { + this.Delete(request, matter, user) + }) + + sortArray := []builder.OrderPair{ + { + Key: "path", + Value: DIRECTION_DESC, + }, + } + + //remove all the deleted directories. sort by path. + this.matterDao.PageHandle("", "", "", TRUE, TRUE, &thenDate, sortArray, func(matter *Matter) { + this.Delete(request, matter, user) + }) + + }) + +} diff --git a/code/rest/task_service.go b/code/rest/task_service.go index 8d002e3..ffaf9d6 100644 --- a/code/rest/task_service.go +++ b/code/rest/task_service.go @@ -58,11 +58,11 @@ func (this *TaskService) InitCleanFootprintTask() { //use standard cron expression. 5 fields. () expression := "10 0 * * *" cronJob := cron.New() - entryId, err := cronJob.AddFunc(expression, this.footprintService.CleanOldData) + _, err := cronJob.AddFunc(expression, this.footprintService.CleanOldData) core.PanicError(err) cronJob.Start() - this.logger.Info("[cron job] Every day 00:10 delete Footprint data of 8 days ago. entryId = %d", entryId) + this.logger.Info("[cron job] Every day 00:10 delete Footprint data of 8 days ago.") } //init the elt task. @@ -70,11 +70,23 @@ func (this *TaskService) InitEtlTask() { expression := "5 0 * * *" cronJob := cron.New() - entryId, err := cronJob.AddFunc(expression, this.dashboardService.Etl) + _, err := cronJob.AddFunc(expression, this.dashboardService.Etl) core.PanicError(err) cronJob.Start() - this.logger.Info("[cron job] Everyday 00:05 ETL dashboard data. entryId = %d", entryId) + this.logger.Info("[cron job] Everyday 00:05 ETL dashboard data.") +} + +//init the clean deleted matters task. +func (this *TaskService) InitCleanDeletedMattersTask() { + + expression := "0 1 * * *" + cronJob := cron.New() + _, err := cronJob.AddFunc(expression, this.matterService.CleanExpiredDeletedMatters) + core.PanicError(err) + cronJob.Start() + + this.logger.Info("[cron job] Everyday 01:00 Clean deleted matters.") } //scan task. @@ -165,11 +177,11 @@ func (this *TaskService) InitScanTask() { } this.scanTaskCron = cron.New() - entryId, err := this.scanTaskCron.AddFunc(scanConfig.Cron, this.doScanTask) + _, err := this.scanTaskCron.AddFunc(scanConfig.Cron, this.doScanTask) core.PanicError(err) this.scanTaskCron.Start() - this.logger.Info("[cron job] %s do scan task. entryId = %d", scanConfig.Cron, entryId) + this.logger.Info("[cron job] %s do scan task.", scanConfig.Cron) } func (this *TaskService) Bootstrap() { @@ -180,6 +192,9 @@ func (this *TaskService) Bootstrap() { //load the etl task. this.InitEtlTask() + //load the clean deleted matters task. + this.InitCleanDeletedMattersTask() + //load the scan task. this.InitScanTask() diff --git a/code/support/tank_logger.go b/code/support/tank_logger.go index c5c4fbd..a4d2a3c 100644 --- a/code/support/tank_logger.go +++ b/code/support/tank_logger.go @@ -27,11 +27,11 @@ func (this *TankLogger) Init() { expression := "0 0 * * *" cronJob := cron.New() - entryId, err := cronJob.AddFunc(expression, this.maintain) + _, err := cronJob.AddFunc(expression, this.maintain) core.PanicError(err) cronJob.Start() - this.Info("[cron job] Every day 00:00 maintain log file. entryId = %d", entryId) + this.Info("[cron job] Every day 00:00 maintain log file.") } func (this *TankLogger) Destroy() {