mirror of https://github.com/cloudreve/Cloudreve
193 lines
5.1 KiB
Go
193 lines
5.1 KiB
Go
package admin
|
|
|
|
import (
|
|
"context"
|
|
"strconv"
|
|
|
|
"github.com/cloudreve/Cloudreve/v4/application/dependency"
|
|
"github.com/cloudreve/Cloudreve/v4/ent"
|
|
"github.com/cloudreve/Cloudreve/v4/inventory"
|
|
"github.com/cloudreve/Cloudreve/v4/inventory/types"
|
|
"github.com/cloudreve/Cloudreve/v4/pkg/serializer"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// AddGroupService 用户组添加服务
|
|
type AddGroupService struct {
|
|
//Group model.Group `json:"group" binding:"required"`
|
|
}
|
|
|
|
// GroupService 用户组ID服务
|
|
type GroupService struct {
|
|
ID uint `uri:"id" json:"id" binding:"required"`
|
|
}
|
|
|
|
// Get 获取用户组详情
|
|
func (service *GroupService) Get() serializer.Response {
|
|
//group, err := model.GetGroupByID(service.ID)
|
|
//if err != nil {
|
|
// return serializer.ErrDeprecated(serializer.CodeGroupNotFound, "", err)
|
|
//}
|
|
//
|
|
//return serializer.Response{Data: group}
|
|
|
|
return serializer.Response{}
|
|
}
|
|
|
|
// Delete 删除用户组
|
|
func (service *GroupService) Delete() serializer.Response {
|
|
//// 查找用户组
|
|
//group, err := model.GetGroupByID(service.ID)
|
|
//if err != nil {
|
|
// return serializer.ErrDeprecated(serializer.CodeGroupNotFound, "", err)
|
|
//}
|
|
//
|
|
//// 是否为系统用户组
|
|
//if group.ID <= 3 {
|
|
// return serializer.ErrDeprecated(serializer.CodeInvalidActionOnSystemGroup, "", err)
|
|
//}
|
|
//
|
|
//// 检查是否有用户使用
|
|
//total := 0
|
|
//row := model.DB.Model(&model.User{}).Where("group_id = ?", service.ID).
|
|
// Select("count(id)").Row()
|
|
//row.Scan(&total)
|
|
//if total > 0 {
|
|
// return serializer.ErrDeprecated(serializer.CodeGroupUsedByUser, strconv.Itoa(total), nil)
|
|
//}
|
|
//
|
|
//model.DB.Delete(&group)
|
|
|
|
return serializer.Response{}
|
|
}
|
|
|
|
func (service *SingleGroupService) Delete(c *gin.Context) error {
|
|
if service.ID <= 3 {
|
|
return serializer.NewError(serializer.CodeInvalidActionOnSystemGroup, "", nil)
|
|
}
|
|
|
|
dep := dependency.FromContext(c)
|
|
groupClient := dep.GroupClient()
|
|
|
|
// Any user still under this group?
|
|
users, err := groupClient.CountUsers(c, int(service.ID))
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeDBError, "Failed to count users", err)
|
|
}
|
|
|
|
if users > 0 {
|
|
return serializer.NewError(serializer.CodeGroupUsedByUser, strconv.Itoa(users), nil)
|
|
}
|
|
|
|
err = groupClient.Delete(c, service.ID)
|
|
if err != nil {
|
|
return serializer.NewError(serializer.CodeDBError, "Failed to delete group", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *AdminListService) List(c *gin.Context) (*ListGroupResponse, error) {
|
|
dep := dependency.FromContext(c)
|
|
groupClient := dep.GroupClient()
|
|
|
|
ctx := context.WithValue(c, inventory.LoadGroupPolicy{}, true)
|
|
res, err := groupClient.ListGroups(ctx, &inventory.ListGroupParameters{
|
|
PaginationArgs: &inventory.PaginationArgs{
|
|
Page: s.Page - 1,
|
|
PageSize: s.PageSize,
|
|
OrderBy: s.OrderBy,
|
|
Order: inventory.OrderDirection(s.OrderDirection),
|
|
},
|
|
})
|
|
|
|
if err != nil {
|
|
return nil, serializer.NewError(serializer.CodeDBError, "Failed to list groups", err)
|
|
}
|
|
|
|
return &ListGroupResponse{
|
|
Pagination: res.PaginationResults,
|
|
Groups: res.Groups,
|
|
}, nil
|
|
}
|
|
|
|
type (
|
|
SingleGroupService struct {
|
|
ID int `uri:"id" json:"id" binding:"required"`
|
|
}
|
|
SingleGroupParamCtx struct{}
|
|
)
|
|
|
|
const (
|
|
countUserQuery = "countUser"
|
|
)
|
|
|
|
func (s *SingleGroupService) Get(c *gin.Context) (*GetGroupResponse, error) {
|
|
dep := dependency.FromContext(c)
|
|
groupClient := dep.GroupClient()
|
|
|
|
ctx := context.WithValue(c, inventory.LoadGroupPolicy{}, true)
|
|
group, err := groupClient.GetByID(ctx, s.ID)
|
|
if err != nil {
|
|
return nil, serializer.NewError(serializer.CodeDBError, "Failed to get group", err)
|
|
}
|
|
|
|
res := &GetGroupResponse{Group: group}
|
|
|
|
if c.Query(countUserQuery) != "" {
|
|
totalUsers, err := groupClient.CountUsers(ctx, int(s.ID))
|
|
if err != nil {
|
|
return nil, serializer.NewError(serializer.CodeDBError, "Failed to count users", err)
|
|
}
|
|
res.TotalUsers = totalUsers
|
|
}
|
|
|
|
return res, nil
|
|
}
|
|
|
|
type (
|
|
UpsertGroupService struct {
|
|
Group *ent.Group `json:"group" binding:"required"`
|
|
}
|
|
UpsertGroupParamCtx struct{}
|
|
)
|
|
|
|
func (s *UpsertGroupService) Update(c *gin.Context) (*GetGroupResponse, error) {
|
|
dep := dependency.FromContext(c)
|
|
groupClient := dep.GroupClient()
|
|
|
|
if s.Group.ID == 0 {
|
|
return nil, serializer.NewError(serializer.CodeParamErr, "ID is required", nil)
|
|
}
|
|
|
|
// Initial admin group have to be admin
|
|
if s.Group.ID == 1 && !s.Group.Permissions.Enabled(int(types.GroupPermissionIsAdmin)) {
|
|
return nil, serializer.NewError(serializer.CodeParamErr, "Initial admin group have to be admin", nil)
|
|
}
|
|
|
|
group, err := groupClient.Upsert(c, s.Group)
|
|
if err != nil {
|
|
return nil, serializer.NewError(serializer.CodeDBError, "Failed to update group", err)
|
|
}
|
|
|
|
service := &SingleGroupService{ID: group.ID}
|
|
return service.Get(c)
|
|
}
|
|
|
|
func (s *UpsertGroupService) Create(c *gin.Context) (*GetGroupResponse, error) {
|
|
dep := dependency.FromContext(c)
|
|
groupClient := dep.GroupClient()
|
|
|
|
if s.Group.ID > 0 {
|
|
return nil, serializer.NewError(serializer.CodeParamErr, "ID must be 0", nil)
|
|
}
|
|
|
|
group, err := groupClient.Upsert(c, s.Group)
|
|
if err != nil {
|
|
return nil, serializer.NewError(serializer.CodeDBError, "Failed to create group", err)
|
|
}
|
|
|
|
service := &SingleGroupService{ID: group.ID}
|
|
return service.Get(c)
|
|
}
|