github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/task/decompress.go (about) 1 package task 2 3 import ( 4 "context" 5 "encoding/json" 6 7 model "github.com/cloudreve/Cloudreve/v3/models" 8 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem" 9 ) 10 11 // DecompressTask 文件压缩任务 12 type DecompressTask struct { 13 User *model.User 14 TaskModel *model.Task 15 TaskProps DecompressProps 16 Err *JobError 17 18 zipPath string 19 } 20 21 // DecompressProps 压缩任务属性 22 type DecompressProps struct { 23 Src string `json:"src"` 24 Dst string `json:"dst"` 25 Encoding string `json:"encoding"` 26 } 27 28 // Props 获取任务属性 29 func (job *DecompressTask) Props() string { 30 res, _ := json.Marshal(job.TaskProps) 31 return string(res) 32 } 33 34 // Type 获取任务状态 35 func (job *DecompressTask) Type() int { 36 return DecompressTaskType 37 } 38 39 // Creator 获取创建者ID 40 func (job *DecompressTask) Creator() uint { 41 return job.User.ID 42 } 43 44 // Model 获取任务的数据库模型 45 func (job *DecompressTask) Model() *model.Task { 46 return job.TaskModel 47 } 48 49 // SetStatus 设定状态 50 func (job *DecompressTask) SetStatus(status int) { 51 job.TaskModel.SetStatus(status) 52 } 53 54 // SetError 设定任务失败信息 55 func (job *DecompressTask) SetError(err *JobError) { 56 job.Err = err 57 res, _ := json.Marshal(job.Err) 58 job.TaskModel.SetError(string(res)) 59 } 60 61 // SetErrorMsg 设定任务失败信息 62 func (job *DecompressTask) SetErrorMsg(msg string, err error) { 63 jobErr := &JobError{Msg: msg} 64 if err != nil { 65 jobErr.Error = err.Error() 66 } 67 job.SetError(jobErr) 68 } 69 70 // GetError 返回任务失败信息 71 func (job *DecompressTask) GetError() *JobError { 72 return job.Err 73 } 74 75 // Do 开始执行任务 76 func (job *DecompressTask) Do() { 77 // 创建文件系统 78 fs, err := filesystem.NewFileSystem(job.User) 79 if err != nil { 80 job.SetErrorMsg("Failed to create filesystem.", err) 81 return 82 } 83 84 job.TaskModel.SetProgress(DecompressingProgress) 85 86 err = fs.Decompress(context.Background(), job.TaskProps.Src, job.TaskProps.Dst, job.TaskProps.Encoding) 87 if err != nil { 88 job.SetErrorMsg("Failed to decompress file.", err) 89 return 90 } 91 92 } 93 94 // NewDecompressTask 新建压缩任务 95 func NewDecompressTask(user *model.User, src, dst, encoding string) (Job, error) { 96 newTask := &DecompressTask{ 97 User: user, 98 TaskProps: DecompressProps{ 99 Src: src, 100 Dst: dst, 101 Encoding: encoding, 102 }, 103 } 104 105 record, err := Record(newTask) 106 if err != nil { 107 return nil, err 108 } 109 newTask.TaskModel = record 110 111 return newTask, nil 112 } 113 114 // NewDecompressTaskFromModel 从数据库记录中恢复压缩任务 115 func NewDecompressTaskFromModel(task *model.Task) (Job, error) { 116 user, err := model.GetActiveUserByID(task.UserID) 117 if err != nil { 118 return nil, err 119 } 120 newTask := &DecompressTask{ 121 User: &user, 122 TaskModel: task, 123 } 124 125 err = json.Unmarshal([]byte(task.Props), &newTask.TaskProps) 126 if err != nil { 127 return nil, err 128 } 129 130 return newTask, nil 131 }