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 }