You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

171 lines
4.5 KiB

package biz
import (
"context"
pb "moredoc/api/v1"
"moredoc/middleware/auth"
"moredoc/model"
"moredoc/util"
"go.uber.org/zap"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
"gorm.io/gorm"
)
type GroupAPIService struct {
pb.UnimplementedGroupAPIServer
dbModel *model.DBModel
logger *zap.Logger
}
func NewGroupAPIService(dbModel *model.DBModel, logger *zap.Logger) (service *GroupAPIService) {
return &GroupAPIService{dbModel: dbModel, logger: logger.Named("GroupAPIService")}
}
func (s *GroupAPIService) checkPermission(ctx context.Context) (userClaims *auth.UserClaims, err error) {
return checkGRPCPermission(s.dbModel, ctx)
}
// CreateGroup 创建用户组
// 0. 检查用户权限
// 1. 检查用户组是否存在
// 2. 创建用户组
func (s *GroupAPIService) CreateGroup(ctx context.Context, req *pb.Group) (*pb.Group, error) {
s.logger.Debug("CreateGroup", zap.Any("req", req))
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
existGroup, err := s.dbModel.GetGroupByTitle(req.Title)
if err != nil && err != gorm.ErrRecordNotFound {
return nil, status.Errorf(codes.Internal, err.Error())
}
if existGroup.Id > 0 {
return nil, status.Errorf(codes.AlreadyExists, "分组名称已存在")
}
group := &model.Group{
Title: req.Title,
Color: req.Color,
IsDefault: req.IsDefault,
IsDisplay: req.IsDisplay,
Sort: int(req.Sort),
Description: req.Description,
}
err = s.dbModel.CreateGroup(group)
if err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
pbGroup := &pb.Group{}
util.CopyStruct(group, pbGroup)
return pbGroup, nil
}
func (s *GroupAPIService) UpdateGroup(ctx context.Context, req *pb.Group) (*emptypb.Empty, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
var group model.Group
util.CopyStruct(req, &group)
err = s.dbModel.UpdateGroup(&group)
if err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
return &emptypb.Empty{}, nil
}
func (s *GroupAPIService) DeleteGroup(ctx context.Context, req *pb.DeleteGroupRequest) (*emptypb.Empty, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
err = s.dbModel.DeleteGroup(req.Id)
if err != nil {
return nil, status.Errorf(codes.Internal, err.Error())
}
return &emptypb.Empty{}, nil
}
func (s *GroupAPIService) GetGroup(ctx context.Context, req *pb.GetGroupRequest) (*pb.Group, error) {
s.logger.Debug("GetGroup", zap.Any("req", req))
group, err := s.dbModel.GetGroup(req.Id)
if err != nil && err != gorm.ErrRecordNotFound {
return nil, status.Errorf(codes.Internal, err.Error())
}
pbGroup := &pb.Group{}
util.CopyStruct(group, pbGroup)
return pbGroup, nil
}
// ListGroup 列出用户组。所有用户都可以查询
func (s *GroupAPIService) ListGroup(ctx context.Context, req *pb.ListGroupRequest) (*pb.ListGroupReply, error) {
s.logger.Debug("ListGroup", zap.Any("req", req))
opt := &model.OptionGetGroupList{
Page: int(req.Page),
Size: int(req.Size_),
SelectFields: req.Field,
WithCount: true,
}
if req.Wd != "" {
_, err := s.checkPermission(ctx)
if err == nil {
opt.QueryLike = map[string][]interface{}{
"title": {req.Wd},
}
}
}
groups, total, err := s.dbModel.GetGroupList(opt)
if err != nil && err != gorm.ErrRecordNotFound {
return nil, status.Errorf(codes.Internal, err.Error())
}
var pbGroups []*pb.Group
util.CopyStruct(&groups, &pbGroups)
return &pb.ListGroupReply{Group: pbGroups, Total: total}, nil
}
// GetGroupPermission 获取用户组权限
func (s *GroupAPIService) GetGroupPermission(ctx context.Context, req *pb.GetGroupPermissionRequest) (*pb.GroupPermissions, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
groupPermissions, _ := s.dbModel.GetGroupPermissinsByGroupId(req.Id)
pbGroupPermissions := &pb.GroupPermissions{}
for _, item := range groupPermissions {
pbGroupPermissions.PermissionId = append(pbGroupPermissions.PermissionId, item.PermissionId)
}
return pbGroupPermissions, nil
}
// UpdateGroupPermission 更新用户组权限
func (s *GroupAPIService) UpdateGroupPermission(ctx context.Context, req *pb.UpdateGroupPermissionRequest) (*emptypb.Empty, error) {
_, err := s.checkPermission(ctx)
if err != nil {
return nil, err
}
err = s.dbModel.UpdateGroupPermissions(req.GroupId, req.PermissionId)
if err != nil {
s.logger.Error("UpdateGroupPermissions", zap.Error(err))
return nil, err
}
return &emptypb.Empty{}, nil
}