From 27c0b6e886c4510e9dff150c07442e73fed41928 Mon Sep 17 00:00:00 2001 From: HFO4 <912394456@qq.com> Date: Sun, 8 Mar 2020 12:54:04 +0800 Subject: [PATCH] Feat: ban/un-ban user --- routers/controllers/admin.go | 22 +++++++++++ routers/router.go | 4 ++ service/admin/user.go | 73 ++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+) diff --git a/routers/controllers/admin.go b/routers/controllers/admin.go index f19ec50..41e4bf5 100644 --- a/routers/controllers/admin.go +++ b/routers/controllers/admin.go @@ -304,3 +304,25 @@ func AdminGetUser(c *gin.Context) { c.JSON(200, ErrorResponse(err)) } } + +// AdminDeleteUser 批量删除用户 +func AdminDeleteUser(c *gin.Context) { + var service admin.UserBatchService + if err := c.ShouldBindJSON(&service); err == nil { + res := service.Delete() + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} + +// AdminBanUser 封禁/解封用户 +func AdminBanUser(c *gin.Context) { + var service admin.UserService + if err := c.ShouldBindUri(&service); err == nil { + res := service.Ban() + c.JSON(200, res) + } else { + c.JSON(200, ErrorResponse(err)) + } +} diff --git a/routers/router.go b/routers/router.go index 408cda8..c662a0d 100644 --- a/routers/router.go +++ b/routers/router.go @@ -373,6 +373,10 @@ func InitMasterRouter() *gin.Engine { user.GET(":id", controllers.AdminGetUser) // 创建/保存用户 user.POST("", controllers.AdminAddUser) + // 删除 + user.POST("delete", controllers.AdminDeleteUser) + // 封禁/解封用户 + user.PATCH("ban/:id", controllers.AdminBanUser) } } diff --git a/service/admin/user.go b/service/admin/user.go index 5f1dc1d..b1be16d 100644 --- a/service/admin/user.go +++ b/service/admin/user.go @@ -1,7 +1,9 @@ package admin import ( + "context" model "github.com/HFO4/cloudreve/models" + "github.com/HFO4/cloudreve/pkg/filesystem" "github.com/HFO4/cloudreve/pkg/serializer" "strings" ) @@ -17,6 +19,77 @@ type UserService struct { ID uint `uri:"id" json:"id" binding:"required"` } +// UserBatchService 用户批量操作服务 +type UserBatchService struct { + ID []uint `json:"id" binding:"min=1"` +} + +// Ban 封禁/解封用户 +func (service *UserService) Ban() serializer.Response { + user, err := model.GetUserByID(service.ID) + if err != nil { + return serializer.Err(serializer.CodeNotFound, "用户不存在", err) + } + + if user.ID == 1 { + return serializer.Err(serializer.CodeNoPermissionErr, "无法封禁初始用户", err) + } + + if user.Status == model.Active { + user.SetStatus(model.Baned) + } else { + user.SetStatus(model.Active) + } + + return serializer.Response{Data: user.Status} +} + +// Delete 删除用户 +func (service *UserBatchService) Delete() serializer.Response { + for _, uid := range service.ID { + user, err := model.GetUserByID(uid) + if err != nil { + return serializer.Err(serializer.CodeNotFound, "用户不存在", err) + } + + // 不能删除初始用户 + if uid == 1 { + return serializer.Err(serializer.CodeNoPermissionErr, "无法删除初始用户", err) + } + + // 删除与此用户相关的所有资源 + + fs, err := filesystem.NewFileSystem(&user) + // 删除所有文件 + root, err := fs.User.Root() + if err != nil { + return serializer.Err(serializer.CodeNotFound, "无法找到用户根目录", err) + } + fs.Delete(context.Background(), []uint{root.ID}, []uint{}) + + // 删除相关任务 + model.DB.Where("user_id = ?", uid).Delete(&model.Download{}) + model.DB.Where("user_id = ?", uid).Delete(&model.Task{}) + + // 删除订单记录 + model.DB.Where("user_id = ?", uid).Delete(&model.Order{}) + + // 删除容量包 + model.DB.Where("user_id = ?", uid).Delete(&model.StoragePack{}) + + // 删除标签 + model.DB.Where("user_id = ?", uid).Delete(&model.Tag{}) + + // 删除WebDAV账号 + model.DB.Where("user_id = ?", uid).Delete(&model.Webdav{}) + + // 删除此用户 + model.DB.Unscoped().Delete(user) + + } + return serializer.Response{} +} + // Get 获取用户详情 func (service *UserService) Get() serializer.Response { group, err := model.GetUserByID(service.ID)