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  }