github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/admin/user.go (about) 1 package admin 2 3 import ( 4 "context" 5 "strings" 6 7 model "github.com/cloudreve/Cloudreve/v3/models" 8 "github.com/cloudreve/Cloudreve/v3/pkg/filesystem" 9 "github.com/cloudreve/Cloudreve/v3/pkg/serializer" 10 ) 11 12 // AddUserService 用户添加服务 13 type AddUserService struct { 14 User model.User `json:"User" binding:"required"` 15 Password string `json:"password"` 16 } 17 18 // UserService 用户ID服务 19 type UserService struct { 20 ID uint `uri:"id" json:"id" binding:"required"` 21 } 22 23 // UserBatchService 用户批量操作服务 24 type UserBatchService struct { 25 ID []uint `json:"id" binding:"min=1"` 26 } 27 28 // Ban 封禁/解封用户 29 func (service *UserService) Ban() serializer.Response { 30 user, err := model.GetUserByID(service.ID) 31 if err != nil { 32 return serializer.Err(serializer.CodeUserNotFound, "", err) 33 } 34 35 if user.ID == 1 { 36 return serializer.Err(serializer.CodeInvalidActionOnDefaultUser, "", err) 37 } 38 39 if user.Status == model.Active { 40 user.SetStatus(model.Baned) 41 } else { 42 user.SetStatus(model.Active) 43 } 44 45 return serializer.Response{Data: user.Status} 46 } 47 48 // Delete 删除用户 49 func (service *UserBatchService) Delete() serializer.Response { 50 for _, uid := range service.ID { 51 user, err := model.GetUserByID(uid) 52 if err != nil { 53 return serializer.Err(serializer.CodeUserNotFound, "", err) 54 } 55 56 // 不能删除初始用户 57 if uid == 1 { 58 return serializer.Err(serializer.CodeInvalidActionOnDefaultUser, "", err) 59 } 60 61 // 删除与此用户相关的所有资源 62 63 fs, err := filesystem.NewFileSystem(&user) 64 // 删除所有文件 65 root, err := fs.User.Root() 66 if err != nil { 67 return serializer.Err(serializer.CodeInternalSetting, "User's root folder not exist", err) 68 } 69 fs.Delete(context.Background(), []uint{root.ID}, []uint{}, false, false) 70 71 // 删除相关任务 72 model.DB.Where("user_id = ?", uid).Delete(&model.Download{}) 73 model.DB.Where("user_id = ?", uid).Delete(&model.Task{}) 74 75 // 删除标签 76 model.DB.Where("user_id = ?", uid).Delete(&model.Tag{}) 77 78 // 删除WebDAV账号 79 model.DB.Where("user_id = ?", uid).Delete(&model.Webdav{}) 80 81 // 删除此用户 82 model.DB.Unscoped().Delete(user) 83 84 } 85 return serializer.Response{} 86 } 87 88 // Get 获取用户详情 89 func (service *UserService) Get() serializer.Response { 90 group, err := model.GetUserByID(service.ID) 91 if err != nil { 92 return serializer.Err(serializer.CodeUserNotFound, "", err) 93 } 94 95 return serializer.Response{Data: group} 96 } 97 98 // Add 添加用户 99 func (service *AddUserService) Add() serializer.Response { 100 if service.User.ID > 0 { 101 102 user, _ := model.GetUserByID(service.User.ID) 103 if service.Password != "" { 104 user.SetPassword(service.Password) 105 } 106 107 // 只更新必要字段 108 user.Nick = service.User.Nick 109 user.Email = service.User.Email 110 user.GroupID = service.User.GroupID 111 user.Status = service.User.Status 112 user.TwoFactor = service.User.TwoFactor 113 114 // 检查愚蠢操作 115 if user.ID == 1 { 116 if user.GroupID != 1 { 117 return serializer.Err(serializer.CodeChangeGroupForDefaultUser, "", nil) 118 } 119 if user.Status != model.Active { 120 return serializer.Err(serializer.CodeInvalidActionOnDefaultUser, "", nil) 121 } 122 } 123 124 if err := model.DB.Save(&user).Error; err != nil { 125 return serializer.DBErr("Failed to save user record", err) 126 } 127 } else { 128 service.User.SetPassword(service.Password) 129 if err := model.DB.Create(&service.User).Error; err != nil { 130 return serializer.DBErr("Failed to create user record", err) 131 } 132 } 133 134 return serializer.Response{Data: service.User.ID} 135 } 136 137 // Users 列出用户 138 func (service *AdminListService) Users() serializer.Response { 139 var res []model.User 140 total := 0 141 142 tx := model.DB.Model(&model.User{}) 143 if service.OrderBy != "" { 144 tx = tx.Order(service.OrderBy) 145 } 146 147 for k, v := range service.Conditions { 148 tx = tx.Where(k+" = ?", v) 149 } 150 151 if len(service.Searches) > 0 { 152 search := "" 153 for k, v := range service.Searches { 154 search += (k + " like '%" + v + "%' OR ") 155 } 156 search = strings.TrimSuffix(search, " OR ") 157 tx = tx.Where(search) 158 } 159 160 // 计算总数用于分页 161 tx.Count(&total) 162 163 // 查询记录 164 tx.Set("gorm:auto_preload", true).Limit(service.PageSize).Offset((service.Page - 1) * service.PageSize).Find(&res) 165 166 // 补齐缺失用户组 167 168 return serializer.Response{Data: map[string]interface{}{ 169 "total": total, 170 "items": res, 171 }} 172 }