102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package logic
|
|
|
|
import (
|
|
"context"
|
|
"github.com/rs/zerolog"
|
|
"gitlab.33.cn/chat/dtalk/service/group/model/biz"
|
|
|
|
pb "gitlab.33.cn/chat/dtalk/service/group/api"
|
|
|
|
"gitlab.33.cn/chat/dtalk/service/group/service"
|
|
)
|
|
|
|
type ForceDeleteMembersLogic struct {
|
|
ctx context.Context
|
|
svc *service.Service
|
|
log zerolog.Logger
|
|
}
|
|
|
|
func NewForceDeleteMembersLogic(ctx context.Context, svc *service.Service) *ForceDeleteMembersLogic {
|
|
return &ForceDeleteMembersLogic{
|
|
ctx: ctx,
|
|
svc: svc,
|
|
log: svc.GetLog(),
|
|
}
|
|
}
|
|
|
|
// ForceDeleteMembers 多个人退出同一个群
|
|
func (l *ForceDeleteMembersLogic) ForceDeleteMembers(req *pb.ForceDeleteMembersReq) (*pb.ForceDeleteMembersResp, error) {
|
|
groupId := req.GroupId
|
|
|
|
// 判断群是否存在
|
|
group, err := l.svc.GetGroupInfoByGroupId(l.ctx, groupId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
needDeleteMembers := l.svc.GetFilteredGroupMembers(l.ctx, group, FilteredMemberIds(req.MemberIds))
|
|
if len(needDeleteMembers) == 0 {
|
|
return &pb.ForceDeleteMembersResp{}, nil
|
|
}
|
|
|
|
members, err := l.svc.GetGroupMembersByGroupIdWithLimit(group.GroupId, 0, int64(len(needDeleteMembers))+1)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(needDeleteMembers) == len(members) {
|
|
// 解散群
|
|
err = l.svc.GroupDisband(l.ctx, groupId, l.svc.GetOpe(l.ctx))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &pb.ForceDeleteMembersResp{}, nil
|
|
}
|
|
|
|
owner, ok := hasOwner(needDeleteMembers)
|
|
if ok {
|
|
CandidateOwner := getCandidateOwner(members, needDeleteMembers)
|
|
err = l.svc.ChangeOwner(l.ctx, group, owner, CandidateOwner)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// 退群
|
|
err = l.svc.RemoveGroupMembers(l.ctx, group, needDeleteMembers)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &pb.ForceDeleteMembersResp{}, nil
|
|
}
|
|
|
|
func hasOwner(members []*biz.GroupMember) (*biz.GroupMember, bool) {
|
|
for _, member := range members {
|
|
if err := member.IsOwner(); err == nil {
|
|
return member, true
|
|
}
|
|
}
|
|
|
|
return nil, false
|
|
}
|
|
|
|
func getCandidateOwner(members []*biz.GroupMember, deleteMembers []*biz.GroupMember) *biz.GroupMember {
|
|
for i := 0; i < len(members); i++ {
|
|
isDelete := false
|
|
for j := 0; j < len(deleteMembers); j++ {
|
|
if members[i].GroupMemberId == deleteMembers[j].GroupMemberId {
|
|
isDelete = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !isDelete {
|
|
return members[i]
|
|
}
|
|
}
|
|
|
|
return &biz.GroupMember{}
|
|
}
|