Files
full/module/social/group/internal/logic/member/do_join.go
2026-09-22 21:15:34 +08:00

109 lines
3.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package member
import (
"context"
"time"
"bsm/full/module/social/group/internal/impl"
"bsm/full/module/social/group/internal/models"
pb "bsm/full/module/social/group/pb"
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
"git.apinb.com/bsm-sdk/core/vars"
)
// 申请加群
func DoJoin(ctx context.Context, in *pb.DoJoinRequest) (reply *pb.DataStatusReply, err error) {
auth, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
if in.GetIdentity() == "" {
return nil, errcode.ErrInvalidArgument
}
// 校验群组是否存在
var group models.GroupBasic
if err = impl.DBService.Where("identity=?", in.Identity).First(&group).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrRecordNotFound
}
// 重复入群防护:已是成员直接返回成功
var memberCnt int64
if err = impl.DBService.Model(&models.GroupMember{}).
Where("group_identity=? and passport_id=?", in.Identity, auth.ID).Count(&memberCnt).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
if memberCnt > 0 {
return &pb.DataStatusReply{Data: vars.OK, Timeseq: time.Now().UnixMilli()}, nil
}
// 成员上限校验MemberLimit 为 0 表示不限)
if group.MemberLimit > 0 && group.MemberTotal >= group.MemberLimit {
return nil, errcode.ErrResourceExhausted
}
// 是否免验证入群
enableAnyJoin, err := models.GetGroupEnableAnyJoin(in.Identity)
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
var identity string
if enableAnyJoin {
// 免验证直接加入群成员
member := &models.GroupMember{
GroupID: group.ID,
GroupIdentity: in.Identity,
Role: ROLE_MEMBER,
}
member.Identity = utils.UUID()
member.PassportID = auth.ID
member.PassportIdentity = auth.Identity
if err = impl.DBService.Create(member).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
identity = member.Identity
// 更新群组表数据统计
models.UpsetGroupMemberTotal(in.Identity, "+")
} else {
// 避免重复提交待处理申请
var applyCnt int64
if err = impl.DBService.Model(&models.GroupApply{}).
Where("group_identity=? and from_id=? and status=?", in.Identity, auth.ID, 0).Count(&applyCnt).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
if applyCnt > 0 {
return &pb.DataStatusReply{Data: vars.OK, Timeseq: time.Now().UnixMilli()}, nil
}
// 写入加群申请表
apply := &models.GroupApply{
FromID: auth.ID,
FromIdentity: auth.Identity,
GroupID: group.ID,
GroupIdentity: in.Identity,
Message: in.Message,
}
apply.Identity = utils.UUID()
if err = impl.DBService.Create(apply).Error; err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB
}
identity = apply.Identity
}
return &pb.DataStatusReply{
Data: identity,
Timeseq: time.Now().UnixMilli(),
}, nil
}