package member import ( "context" "perms-system-server/internal/consts" authHelper "perms-system-server/internal/logic/auth" "perms-system-server/internal/response" "perms-system-server/internal/svc" "perms-system-server/internal/types" "github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/stores/sqlx" ) type RemoveMemberLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewRemoveMemberLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RemoveMemberLogic { return &RemoveMemberLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } // RemoveMember 移除产品成员。在事务内同时清理该用户在产品下的角色和个性化权限绑定后移除成员记录。不能移除产品的最后一个 ADMIN。 func (l *RemoveMemberLogic) RemoveMember(req *types.RemoveMemberReq) error { member, err := l.svcCtx.SysProductMemberModel.FindOne(l.ctx, req.Id) if err != nil { return response.ErrNotFound("成员不存在") } if err := authHelper.CheckManageAccess(l.ctx, l.svcCtx, member.UserId, member.ProductCode); err != nil { return err } if err := l.svcCtx.SysProductMemberModel.TransactCtx(l.ctx, func(ctx context.Context, session sqlx.Session) error { if _, err := l.svcCtx.SysProductMemberModel.FindOneForUpdateTx(ctx, session, req.Id); err != nil { return response.ErrNotFound("成员不存在") } if member.MemberType == consts.MemberTypeAdmin { adminCount, err := l.svcCtx.SysProductMemberModel.CountActiveAdminsTx(ctx, session, member.ProductCode) if err != nil { return err } if adminCount <= 1 { return response.ErrBadRequest("不能移除该产品的最后一个管理员") } } if err := l.svcCtx.SysUserRoleModel.DeleteByUserIdForProductTx(ctx, session, member.UserId, member.ProductCode); err != nil { return err } if err := l.svcCtx.SysUserPermModel.DeleteByUserIdForProductTx(ctx, session, member.UserId, member.ProductCode); err != nil { return err } return l.svcCtx.SysProductMemberModel.DeleteWithTx(ctx, session, req.Id) }); err != nil { return err } l.svcCtx.UserDetailsLoader.Del(l.ctx, member.UserId, member.ProductCode) return nil }