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  }