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  }