github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/task/recycle.go (about) 1 package task 2 3 import ( 4 "encoding/json" 5 6 model "github.com/cloudreve/Cloudreve/v3/models" 7 "github.com/cloudreve/Cloudreve/v3/pkg/cluster" 8 "github.com/cloudreve/Cloudreve/v3/pkg/util" 9 ) 10 11 // RecycleTask 文件回收任务 12 type RecycleTask struct { 13 User *model.User 14 TaskModel *model.Task 15 TaskProps RecycleProps 16 Err *JobError 17 } 18 19 // RecycleProps 回收任务属性 20 type RecycleProps struct { 21 // 下载任务 GID 22 DownloadGID string `json:"download_gid"` 23 } 24 25 // Props 获取任务属性 26 func (job *RecycleTask) Props() string { 27 res, _ := json.Marshal(job.TaskProps) 28 return string(res) 29 } 30 31 // Type 获取任务状态 32 func (job *RecycleTask) Type() int { 33 return RecycleTaskType 34 } 35 36 // Creator 获取创建者ID 37 func (job *RecycleTask) Creator() uint { 38 return job.User.ID 39 } 40 41 // Model 获取任务的数据库模型 42 func (job *RecycleTask) Model() *model.Task { 43 return job.TaskModel 44 } 45 46 // SetStatus 设定状态 47 func (job *RecycleTask) SetStatus(status int) { 48 job.TaskModel.SetStatus(status) 49 } 50 51 // SetError 设定任务失败信息 52 func (job *RecycleTask) SetError(err *JobError) { 53 job.Err = err 54 res, _ := json.Marshal(job.Err) 55 job.TaskModel.SetError(string(res)) 56 } 57 58 // SetErrorMsg 设定任务失败信息 59 func (job *RecycleTask) SetErrorMsg(msg string, err error) { 60 jobErr := &JobError{Msg: msg} 61 if err != nil { 62 jobErr.Error = err.Error() 63 } 64 job.SetError(jobErr) 65 } 66 67 // GetError 返回任务失败信息 68 func (job *RecycleTask) GetError() *JobError { 69 return job.Err 70 } 71 72 // Do 开始执行任务 73 func (job *RecycleTask) Do() { 74 download, err := model.GetDownloadByGid(job.TaskProps.DownloadGID, job.User.ID) 75 if err != nil { 76 util.Log().Warning("Recycle task %d cannot found download record.", job.TaskModel.ID) 77 job.SetErrorMsg("Cannot found download task.", err) 78 return 79 } 80 nodeID := download.GetNodeID() 81 node := cluster.Default.GetNodeByID(nodeID) 82 if node == nil { 83 util.Log().Warning("Recycle task %d cannot found node.", job.TaskModel.ID) 84 job.SetErrorMsg("Invalid slave node.", nil) 85 return 86 } 87 err = node.GetAria2Instance().DeleteTempFile(download) 88 if err != nil { 89 util.Log().Warning("Failed to delete transfer temp folder %q: %s", download.Parent, err) 90 job.SetErrorMsg("Failed to recycle files.", err) 91 return 92 } 93 } 94 95 // NewRecycleTask 新建回收任务 96 func NewRecycleTask(download *model.Download) (Job, error) { 97 newTask := &RecycleTask{ 98 User: download.GetOwner(), 99 TaskProps: RecycleProps{ 100 DownloadGID: download.GID, 101 }, 102 } 103 104 record, err := Record(newTask) 105 if err != nil { 106 return nil, err 107 } 108 newTask.TaskModel = record 109 110 return newTask, nil 111 } 112 113 // NewRecycleTaskFromModel 从数据库记录中恢复回收任务 114 func NewRecycleTaskFromModel(task *model.Task) (Job, error) { 115 user, err := model.GetActiveUserByID(task.UserID) 116 if err != nil { 117 return nil, err 118 } 119 newTask := &RecycleTask{ 120 User: &user, 121 TaskModel: task, 122 } 123 124 err = json.Unmarshal([]byte(task.Props), &newTask.TaskProps) 125 if err != nil { 126 return nil, err 127 } 128 129 return newTask, nil 130 }