github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/admin/task.go (about)

     1  package admin
     2  
     3  import (
     4  	"strings"
     5  
     6  	model "github.com/cloudreve/Cloudreve/v3/models"
     7  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
     8  	"github.com/cloudreve/Cloudreve/v3/pkg/task"
     9  	"github.com/gin-gonic/gin"
    10  )
    11  
    12  // TaskBatchService 任务批量操作服务
    13  type TaskBatchService struct {
    14  	ID []uint `json:"id" binding:"min=1"`
    15  }
    16  
    17  // ImportTaskService 导入任务
    18  type ImportTaskService struct {
    19  	UID       uint   `json:"uid" binding:"required"`
    20  	PolicyID  uint   `json:"policy_id" binding:"required"`
    21  	Src       string `json:"src" binding:"required,min=1,max=65535"`
    22  	Dst       string `json:"dst" binding:"required,min=1,max=65535"`
    23  	Recursive bool   `json:"recursive"`
    24  }
    25  
    26  // Create 新建导入任务
    27  func (service *ImportTaskService) Create(c *gin.Context, user *model.User) serializer.Response {
    28  	// 创建任务
    29  	job, err := task.NewImportTask(service.UID, service.PolicyID, service.Src, service.Dst, service.Recursive)
    30  	if err != nil {
    31  		return serializer.DBErr("Failed to create task record.", err)
    32  	}
    33  	task.TaskPoll.Submit(job)
    34  	return serializer.Response{}
    35  }
    36  
    37  // Delete 删除任务
    38  func (service *TaskBatchService) Delete(c *gin.Context) serializer.Response {
    39  	if err := model.DB.Where("id in (?)", service.ID).Delete(&model.Download{}).Error; err != nil {
    40  		return serializer.DBErr("Failed to delete task records", err)
    41  	}
    42  	return serializer.Response{}
    43  }
    44  
    45  // DeleteGeneral 删除常规任务
    46  func (service *TaskBatchService) DeleteGeneral(c *gin.Context) serializer.Response {
    47  	if err := model.DB.Where("id in (?)", service.ID).Delete(&model.Task{}).Error; err != nil {
    48  		return serializer.DBErr("Failed to delete task records", err)
    49  	}
    50  	return serializer.Response{}
    51  }
    52  
    53  // Tasks 列出常规任务
    54  func (service *AdminListService) Tasks() serializer.Response {
    55  	var res []model.Task
    56  	total := 0
    57  
    58  	tx := model.DB.Model(&model.Task{})
    59  	if service.OrderBy != "" {
    60  		tx = tx.Order(service.OrderBy)
    61  	}
    62  
    63  	for k, v := range service.Conditions {
    64  		tx = tx.Where(k+" = ?", v)
    65  	}
    66  
    67  	if len(service.Searches) > 0 {
    68  		search := ""
    69  		for k, v := range service.Searches {
    70  			search += k + " like '%" + v + "%' OR "
    71  		}
    72  		search = strings.TrimSuffix(search, " OR ")
    73  		tx = tx.Where(search)
    74  	}
    75  
    76  	// 计算总数用于分页
    77  	tx.Count(&total)
    78  
    79  	// 查询记录
    80  	tx.Limit(service.PageSize).Offset((service.Page - 1) * service.PageSize).Find(&res)
    81  
    82  	// 查询对应用户,同时计算HashID
    83  	users := make(map[uint]model.User)
    84  	for _, file := range res {
    85  		users[file.UserID] = model.User{}
    86  	}
    87  
    88  	userIDs := make([]uint, 0, len(users))
    89  	for k := range users {
    90  		userIDs = append(userIDs, k)
    91  	}
    92  
    93  	var userList []model.User
    94  	model.DB.Where("id in (?)", userIDs).Find(&userList)
    95  
    96  	for _, v := range userList {
    97  		users[v.ID] = v
    98  	}
    99  
   100  	return serializer.Response{Data: map[string]interface{}{
   101  		"total": total,
   102  		"items": res,
   103  		"users": users,
   104  	}}
   105  }
   106  
   107  // Downloads 列出离线下载任务
   108  func (service *AdminListService) Downloads() serializer.Response {
   109  	var res []model.Download
   110  	total := 0
   111  
   112  	tx := model.DB.Model(&model.Download{})
   113  	if service.OrderBy != "" {
   114  		tx = tx.Order(service.OrderBy)
   115  	}
   116  
   117  	for k, v := range service.Conditions {
   118  		tx = tx.Where(k+" = ?", v)
   119  	}
   120  
   121  	if len(service.Searches) > 0 {
   122  		search := ""
   123  		for k, v := range service.Searches {
   124  			search += k + " like '%" + v + "%' OR "
   125  		}
   126  		search = strings.TrimSuffix(search, " OR ")
   127  		tx = tx.Where(search)
   128  	}
   129  
   130  	// 计算总数用于分页
   131  	tx.Count(&total)
   132  
   133  	// 查询记录
   134  	tx.Limit(service.PageSize).Offset((service.Page - 1) * service.PageSize).Find(&res)
   135  
   136  	// 查询对应用户,同时计算HashID
   137  	users := make(map[uint]model.User)
   138  	for _, file := range res {
   139  		users[file.UserID] = model.User{}
   140  	}
   141  
   142  	userIDs := make([]uint, 0, len(users))
   143  	for k := range users {
   144  		userIDs = append(userIDs, k)
   145  	}
   146  
   147  	var userList []model.User
   148  	model.DB.Where("id in (?)", userIDs).Find(&userList)
   149  
   150  	for _, v := range userList {
   151  		users[v.ID] = v
   152  	}
   153  
   154  	return serializer.Response{Data: map[string]interface{}{
   155  		"total": total,
   156  		"items": res,
   157  		"users": users,
   158  	}}
   159  }