Documentation
¶
Index ¶
- Constants
- Variables
- func GetGroupMdMaxSize() int
- type AddGroupMembersServiceReq
- type AddGroupMembersServiceResp
- type AddGroupReq
- type AddMemberReq
- type CategoryRow
- type CreateGroupServiceReq
- type CreateGroupServiceResp
- type DB
- func (d *DB) DeleteGroupMd(groupNo string) (int64, error)
- func (d *DB) DeleteMember(groupNo string, uid string, version int64) error
- func (d *DB) DeleteMemberTx(groupNo string, uid string, version int64, tx *dbr.Tx) error
- func (d *DB) ExistMember(uid string, groupNo string) (bool, error)
- func (d *DB) ExistMemberActive(uid string, groupNo string) (bool, error)
- func (d *DB) ExistMemberDelete(uid string, groupNo string) (bool, error)
- func (d *DB) Insert(m *Model) error
- func (d *DB) InsertInviteItemTx(model *InviteItemModel, tx *dbr.Tx) error
- func (d *DB) InsertInviteTx(model *InviteModel, tx *dbr.Tx) error
- func (d *DB) InsertMember(m *MemberModel) error
- func (d *DB) InsertMemberTx(m *MemberModel, tx *dbr.Tx) error
- func (d *DB) InsertTx(m *Model, tx *dbr.Tx) error
- func (d *DB) QueryBotMemberUIDs(groupNo string) ([]string, error)
- func (d *DB) QueryBotUIDsOwnedByUIDs(groupNo string, ownerUIDs []string) ([]string, error)
- func (d *DB) QueryBotsInvitedByUIDTx(groupNo string, inviterUID string, tx *dbr.Tx) ([]string, error)
- func (d *DB) QueryCategoryByID(categoryID string) (*CategoryRow, error)
- func (d *DB) QueryDetailWithGroupNo(groupNo string, uid string) (*DetailModel, error)
- func (d *DB) QueryDetailWithGroupNos(groupNos []string, uid string) ([]*DetailModel, error)
- func (d *DB) QueryExternalGroupNosForUser(uid string) (map[string]string, error)
- func (d *DB) QueryExternalMemberCountTx(groupNo string, tx *dbr.Tx) (int64, error)
- func (d *DB) QueryGroupManagerOrCreatorUIDS(groupNo string) ([]string, error)
- func (d *DB) QueryGroupMd(groupNo string) (*GroupMdResult, error)
- func (d *DB) QueryGroupsWithGroupNos(groupNos []string) ([]*Model, error)
- func (d *DB) QueryInviteDetail(inviteNo string) (*InviteDetailModel, error)
- func (d *DB) QueryInviteDetailForUpdateTx(inviteNo string, tx *dbr.Tx) (*InviteDetailModel, error)
- func (d *DB) QueryInviteItemDetail(inviteNo string) ([]*InviteItemDetailModel, error)
- func (d *DB) QueryIsBotAdmin(groupNo string, uid string) (bool, error)
- func (d *DB) QueryIsGroupCreator(groupNo string, uid string) (bool, error)
- func (d *DB) QueryIsGroupManagerOrCreator(groupNo string, uid string) (bool, error)
- func (d *DB) QueryMemberCount(groupNo string) (int64, error)
- func (d *DB) QueryMemberWithUID(uid string, groupNo string) (*MemberModel, error)
- func (d *DB) QueryMemberWithUIDAndGroupNos(uid string, groupNos []string) ([]*MemberModel, error)
- func (d *DB) QueryMembersFirstNine(groupNo string) ([]*MemberModel, error)
- func (d *DB) QueryMembersFirstNineExclude(groupNo string, excludeUIDs []string) ([]*MemberModel, error)
- func (d *DB) QueryMembersWithStatus(groupNo string, status int) ([]*MemberModel, error)
- func (d *DB) QueryMembersWithUids(uids []string, groupNo string) ([]*MemberModel, error)
- func (d *DB) QuerySecondOldestMemberExcludingBotsOf(groupNo string, leaverUID string) (*MemberModel, error)
- func (d *DB) QuerySourceSpaceIDForMember(groupNo, uid string) (string, error)
- func (d *DB) QueryWithGroupNo(groupNo string) (*Model, error)
- func (d *DB) QueryWithGroupNos(groupNos []string) ([]*Model, error)
- func (d *DB) SyncMembers(groupNo string, version int64, limit uint64) ([]*MemberDetailModel, error)
- func (d *DB) Update(model *Model) error
- func (d *DB) UpdateBotAdmin(groupNo string, uid string, isBotAdmin int, version int64) error
- func (d *DB) UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)
- func (d *DB) UpdateGroupType(groupNo string, groupType GroupType) error
- func (d *DB) UpdateGroupTypeTx(groupNo string, groupType GroupType, tx *dbr.Tx) error
- func (d *DB) UpdateInviteItemStatusTx(status int, inviteNo string, tx *dbr.Tx) error
- func (d *DB) UpdateInviteStatusTx(allower string, status int, inviteNo string, tx *dbr.Tx) error
- func (d *DB) UpdateInviteTx(groupNo string, invite int, version int64, tx *dbr.Tx) error
- func (d *DB) UpdateIsExternalGroup(groupNo string, value int) error
- func (d *DB) UpdateIsExternalGroupTx(groupNo string, value int, tx *dbr.Tx) error
- func (d *DB) UpdateManagersToMember(groupNo string, members []string, version int64) error
- func (d *DB) UpdateMember(member *MemberModel) error
- func (d *DB) UpdateMemberRoleTx(groupNo string, uid string, role int, version int64, tx *dbr.Tx) error
- func (d *DB) UpdateMemberTx(member *MemberModel, tx *dbr.Tx) error
- func (d *DB) UpdateMembersToManager(groupNo string, members []string, version int64) error
- func (d *DB) UpdateStatusTx(groupNo string, status int, version int64, tx *dbr.Tx) error
- func (d *DB) UpdateTx(model *Model, tx *dbr.Tx) error
- type DetailModel
- type Group
- func (g *Group) CheckForbiddenLoop()
- func (g *Group) GetGroupByGroupNo(groupNo string) (*source.GroupModel, error)
- func (g *Group) GetGroupMemberByUID(uid string, groupNo string) (*source.GroupMember, error)
- func (g *Group) GetGroupMemberByVercode(vercode string) (*source.GroupMember, error)
- func (g *Group) GetGroupMemberByVercodes(vercodes []string) ([]*source.GroupMember, error)
- func (g *Group) Route(r *wkhttp.WKHttp)
- type GroupMdResult
- type GroupResp
- type GroupType
- type IService
- type InfoResp
- type InviteDetailModel
- type InviteDetailResp
- type InviteItemDetailModel
- type InviteItemDetailResp
- type InviteItemModel
- type InviteModel
- type InviteReq
- type Manager
- type MemberDetailModel
- type MemberExternalMarker
- type MemberGroupDetailModel
- type MemberModel
- type MemberResp
- type Model
- type MsgGroupMemberScanJoinExt
- type RemoveGroupMembersServiceReq
- type RemoveGroupMembersServiceResp
- type Service
- func (s *Service) AddGroup(model *AddGroupReq) error
- func (s *Service) AddGroupMembers(req *AddGroupMembersServiceReq) (*AddGroupMembersServiceResp, error)
- func (s *Service) AddMember(model *AddMemberReq) error
- func (s *Service) CreateGroup(req *CreateGroupServiceReq) (*CreateGroupServiceResp, error)
- func (s *Service) DeleteGroupMd(groupNo string) (int64, error)
- func (s *Service) ExistMember(groupNo string, uid string) (bool, error)
- func (s *Service) ExistMemberActive(groupNo string, uid string) (bool, error)
- func (s *Service) ExistMembers(groupNos []string, uid string) ([]string, error)
- func (s *Service) ExistMembersActive(groupNos []string, uid string) ([]string, error)
- func (s *Service) GetAllGroupCount() (int64, error)
- func (s *Service) GetBlacklistMemberUIDs(groupNo string) ([]string, error)
- func (s *Service) GetBotMemberUIDs(groupNo string) ([]string, error)
- func (s *Service) GetCreatedCountWithDate(date string) (int64, error)
- func (s *Service) GetGroupDetail(groupNo string, uid string) (*GroupResp, error)
- func (s *Service) GetGroupDetails(groupNos []string, uid string) ([]*GroupResp, error)
- func (s *Service) GetGroupMd(groupNo string) (*GroupMdResult, error)
- func (s *Service) GetGroupMemberMaxVersion(groupNo string) (int64, error)
- func (s *Service) GetGroupWithDateSpace(startDate, endDate string) (map[string]int64, error)
- func (s *Service) GetGroupWithGroupNo(groupNo string) (*InfoResp, error)
- func (s *Service) GetGroups(groupNos []string) ([]*InfoResp, error)
- func (s *Service) GetGroupsWithMemberUID(uid string) ([]*InfoResp, error)
- func (s *Service) GetManagersWithGroupNos(groupNos []string) ([]*MemberResp, error)
- func (s *Service) GetMember(groupNo, uid string) (*MemberResp, error)
- func (s *Service) GetMemberExternalFields(groupNo, uid string) (isExternal int, sourceSpaceID, sourceSpaceName string, ...)
- func (s *Service) GetMemberExternalMarkers(groupNo string) (map[string]MemberExternalMarker, error)
- func (s *Service) GetMemberTotalAndOnlineCount(groupNo string) (int, int, error)
- func (s *Service) GetMemberUIDsOfManager(groupNo string) ([]string, error)
- func (s *Service) GetMembers(groupNo string) ([]*MemberResp, error)
- func (s *Service) GetMembersWithUIDAndGroupIds(uid string, groupNos []string) ([]*MemberResp, error)
- func (s *Service) GetSettings(groupNos []string, uid string) ([]*SettingResp, error)
- func (s *Service) GetSettingsWithUIDs(groupNo string, uids []string) ([]*SettingResp, error)
- func (s *Service) GetSubscribableMemberUIDs(groupNo string) ([]string, error)
- func (s *Service) GetUserSupers(uid string) ([]*InfoResp, error)
- func (s *Service) IsBotAdmin(groupNo string, uid string) (bool, error)
- func (s *Service) IsCreatorOrManager(groupNo string, uid string) (bool, error)
- func (s *Service) RemoveGroupMembers(req *RemoveGroupMembersServiceReq) (*RemoveGroupMembersServiceResp, error)
- func (s *Service) RemoveUserFromGroupThreads(groupNo, uid, spaceID string)
- func (s *Service) UpdateGroupAvatarCustom(req *UpdateGroupAvatarCustomServiceReq) error
- func (s *Service) UpdateGroupInfo(req *UpdateGroupInfoServiceReq) error
- func (s *Service) UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)
- type Setting
- type SettingResp
- type UpdateGroupAvatarCustomServiceReq
- type UpdateGroupInfoServiceReq
Constants ¶
const ( // GroupStatusDisabled 已禁用 GroupStatusDisabled = 0 // GroupStatusNormal 正常 GroupStatusNormal = 1 // GroupStatusDisband 解散 GroupStatusDisband = 2 )
群状态
const ( // MemberRoleCommon 普通成员 MemberRoleCommon = 0 // MemberRoleCreator 创建者 MemberRoleCreator = 1 // MemberRoleManager 管理者 MemberRoleManager = 2 )
群成员角色
const ( // InviteStatusWait 等待确认 InviteStatusWait = 0 // InviteStatusOK 已确认 InviteStatusOK = 1 )
const (
ChannelServiceName = "channel"
)
const GroupAttrKeyAllowExternal = "allow_external"
GroupAttrKeyAllowExternal 是否允许外部成员加入群的群属性 key。 定义在本模块而非 dmwork-lib.common,因为这是 OCTO 扩展属性,未进入上游 lib。
const GroupAttrKeyAllowNoMention = "allow_no_mention"
GroupAttrKeyAllowNoMention 群级「允许免@生效」总开关的群属性 key。群主/管理员可控, 与 bot 主人的 bot_mention_pref 两轴 AND:最终免@ = bot主人开了本群免@ AND 群管理员允许本群免@。 同为 OCTO 扩展属性,未进入上游 lib。
const MaxGroupNameLen = 50
MaxGroupNameLen 群名最大长度(按 rune 计)。Web / Bot / Integration 建群与改名共用, 超长一律静默截断到此长度(API 层可前置 reject 给出明确错误)。配套的 `group`.`name` 列宽由迁移加宽到 VARCHAR(50),两者必须一致,否则 MySQL 严格模式下会报 Data too long。
Variables ¶
var ErrBotOwnershipDenied = errors.New("no permission to invite this bot")
ErrBotOwnershipDenied is returned when the inviter is not the creator of a bot they are trying to add to a group.
Security context: YUJ-46 (github.com/Mininglamp-OSS/octo-server issue #1181). Before this check, any group member could add any bot to any group, bypassing the bot creator's consent. The strict default enforced here is that **only a bot's creator can invite their bot into any group**; group admins/owners and arbitrary members cannot invite other people's bots.
Product rules currently deferred (see PR / issue for decision trail):
- Group admins do NOT get a pass for cross-creator bot invites.
- No system-bot / public-bot whitelist exists yet.
- Whether a bot is auto-kicked when its creator leaves is out of scope.
Functions ¶
func GetGroupMdMaxSize ¶
func GetGroupMdMaxSize() int
GetGroupMdMaxSize returns the max GROUP.md size from env or default (10240)
Types ¶
type AddGroupMembersServiceReq ¶
type AddGroupMembersServiceReq struct {
GroupNo string // 群编号
Members []string // 待添加成员 UID 列表
OperatorUID string // 操作者 UID
OperatorName string // 操作者名称
TraceID string // 请求级 trace_id(reqid),用于串联 handler/service/auth/GIN 分段慢日志
}
AddGroupMembersServiceReq 添加群成员请求
type AddGroupMembersServiceResp ¶
type AddGroupMembersServiceResp struct {
Added int // 实际添加成功的数量
}
AddGroupMembersServiceResp 添加群成员响应
type CategoryRow ¶
type CreateGroupServiceReq ¶
type CreateGroupServiceReq struct {
Creator string // 创建者 UID
Members []string // 成员 UID 列表(不含创建者,Service 内部会自动加入)
Name string // 群名称(可为空,Service 会自动生成)
SpaceID string // Space ID(可为空)
BotUID string // Bot UID(可为空;非空时自动加入群并设为 bot_admin)
CategoryID string // 群聊分组 ID(可为空;非空时自动设置创建者的 group_setting)
AvatarText string // 自定义群头像文字(可为空;空=按 is_named 回退:老群渲染群名/新群双人图标)
AvatarColor *int // 自定义群头像色板下标(nil=渲染时按 group_no 派生)
}
CreateGroupServiceReq 创建群请求
type CreateGroupServiceResp ¶
type CreateGroupServiceResp struct {
GroupNo string // 群编号
Name string // 群名称
SkippedMembers []string // 因不在 Space 而被过滤的成员 UID
}
CreateGroupServiceResp 创建群响应
type DB ¶
type DB struct {
// contains filtered or unexported fields
}
DB DB
func (*DB) DeleteGroupMd ¶
DeleteGroupMd sets group_md=NULL and increments version. Uses a transaction to ensure UPDATE and SELECT LAST_INSERT_ID() share the same connection.
func (*DB) DeleteMember ¶
DeleteMember 删除群成员
func (*DB) DeleteMemberTx ¶
DeleteMemberTx 删除群成员
func (*DB) ExistMember ¶
ExistMember 群成员是否在群内
func (*DB) ExistMemberActive ¶
ExistMemberActive 群成员是否在群内且处于正常状态(白名单语义,fail closed)。 与 ExistMember 的差别:额外要求 status=GroupMemberStatusNormal,明确排除 Blacklist 以及未来可能新增的非正常状态。 用于绕过 IM 层(直接读本地分表)的接口,避免被拉黑用户通过本地直查 拿到本应被 IM datasource 拦截的消息。
func (*DB) ExistMemberDelete ¶
ExistMemberDelete 存在已删除的群成员数据
func (*DB) InsertInviteItemTx ¶
func (d *DB) InsertInviteItemTx(model *InviteItemModel, tx *dbr.Tx) error
InsertInviteItemTx 添加邀请项
func (*DB) InsertInviteTx ¶
func (d *DB) InsertInviteTx(model *InviteModel, tx *dbr.Tx) error
InsertInviteTx 添加邀请信息
func (*DB) InsertMemberTx ¶
func (d *DB) InsertMemberTx(m *MemberModel, tx *dbr.Tx) error
InsertMemberTx 插入群成员信息(带事务)
func (*DB) QueryBotMemberUIDs ¶
QueryBotMemberUIDs returns UIDs of robot=1 members in the group
func (*DB) QueryBotUIDsOwnedByUIDs ¶ added in v1.6.1
QueryBotUIDsOwnedByUIDs 查询群内由 ownerUIDs 中任一用户名下(robot.creator_uid) 的未删除 bot 成员 UID 列表。与 QueryBotsInvitedByUIDTx 同口径:只命中 group_member.robot=1 AND is_deleted=0 且 robot.status=1 的 bot;孤儿(无 robot 行) 或禁用(status=0)bot 不视为任何人的 bot,不被级联。
非事务、无行锁版本,供拉黑/解除拉黑级联(#354)这类不开事务的路径使用: 被拉黑用户的 bot 若不连带拉黑,用户可经 bot 旁路读群/子区内容, 绕过 ExistMemberActive 加固线(#343/#345)。 故意不过滤 group_member.status:解除拉黑时需要把已是 Blacklist 状态的 bot 一并恢复。
func (*DB) QueryBotsInvitedByUIDTx ¶
func (d *DB) QueryBotsInvitedByUIDTx(groupNo string, inviterUID string, tx *dbr.Tx) ([]string, error)
QueryBotsInvitedByUIDTx 事务内查询群里由 inviterUID 所拥有的活跃 bot 成员 UID 列表,带 FOR UPDATE 行锁。
D-2 cascade 语义(YUJ-49 / Mininglamp-OSS/octo-server#1186):
- Bot 进群本质是邀请关系延伸(#1182 已强制 inviter == robot.creator_uid)
- inviter 离群(主动退 / 被踢)时,应同事务级联移除其所有 bot
只返回同时满足以下条件的 bot UID:
- group_member.robot = 1 AND is_deleted = 0(仍在群内的 bot 成员)
- robot.creator_uid = inviterUID AND robot.status = 1(仍活跃、且属于 inviter)
为什么是 INNER JOIN + status=1:与 checkBotOwnership(bot_ownership.go)保持一致, 没有活跃 robot 行的 bot(孤儿 / 禁用)不视为任何人的 bot,不被级联。 群主 / 其他管理员仍可通过常规移除成员接口清理它们。
func (*DB) QueryCategoryByID ¶
func (d *DB) QueryCategoryByID(categoryID string) (*CategoryRow, error)
func (*DB) QueryDetailWithGroupNo ¶
func (d *DB) QueryDetailWithGroupNo(groupNo string, uid string) (*DetailModel, error)
QueryDetailWithGroupNo 查询群详情
func (*DB) QueryDetailWithGroupNos ¶
func (d *DB) QueryDetailWithGroupNos(groupNos []string, uid string) ([]*DetailModel, error)
QueryDetailWithGroupNos 查询群集合
func (*DB) QueryExternalGroupNosForUser ¶
QueryExternalGroupNosForUser 查询用户作为外部成员加入的群列表,返回 groupNo -> sourceSpaceID
func (*DB) QueryExternalMemberCountTx ¶
QueryExternalMemberCountTx 事务内查询群内「人类」外部成员数量(FOR UPDATE 行锁防并发)。 排除 robot=1 的 bot 成员:is_external_group 的语义只反映人类外部成员是否存在, bot 的 is_external + source_space_id 字段仅用于能力路由,不影响群的外部属性。 详见 YUJ-48 / Mininglamp-OSS/octo-server#1184。
func (*DB) QueryGroupManagerOrCreatorUIDS ¶
QueryGroupManagerOrCreatorUIDS 查询管理者或创建者的uid
func (*DB) QueryGroupMd ¶
func (d *DB) QueryGroupMd(groupNo string) (*GroupMdResult, error)
QueryGroupMd queries GROUP.md content for a group
func (*DB) QueryGroupsWithGroupNos ¶
QueryGroupsWithGroupNos 通过群ID查询一批群信息
func (*DB) QueryInviteDetail ¶
func (d *DB) QueryInviteDetail(inviteNo string) (*InviteDetailModel, error)
QueryInviteDetail 查询邀请详情
func (*DB) QueryInviteDetailForUpdateTx ¶
QueryInviteDetailForUpdateTx 在事务内使用 FOR UPDATE 锁定邀请记录,防止并发修改
func (*DB) QueryInviteItemDetail ¶
func (d *DB) QueryInviteItemDetail(inviteNo string) ([]*InviteItemDetailModel, error)
QueryInviteItemDetail 查询邀请item详情
func (*DB) QueryIsBotAdmin ¶
QueryIsBotAdmin checks if a member is a bot admin in the group
func (*DB) QueryIsGroupCreator ¶
QueryIsGroupCreator 是否是群创建者
func (*DB) QueryIsGroupManagerOrCreator ¶
QueryIsGroupManagerOrCreator 是否是群管理者或创建者
Fail-safe 过滤:
- is_external=0:外部成员即使在 DB 中残留 role=creator/manager(历史脏数据或 绕过 managerAdd 入口校验写入),也不视为该群的管理者。与 managerAdd / transferGrouper 的前置 is_external 校验构成双层防御(YUJ-231 / GH#1289, ReviewBot YUJ-230 P1)。
- status=GroupMemberStatusNormal:黑名单 / 已退出但 is_deleted 仍为 0 的成员 即便保留 role=creator/manager,也不视为有效管理者,避免被踢出的管理者继续 调用敏感 API(PR #31 round-3,Jerry-Xin)。
func (*DB) QueryMemberCount ¶
QueryMemberCount 查询群成员数量
func (*DB) QueryMemberWithUID ¶
func (d *DB) QueryMemberWithUID(uid string, groupNo string) (*MemberModel, error)
QueryMemberWithUID 查询群成员
func (*DB) QueryMemberWithUIDAndGroupNos ¶
func (d *DB) QueryMemberWithUIDAndGroupNos(uid string, groupNos []string) ([]*MemberModel, error)
QueryMemberWithUIDAndGroupNos
func (*DB) QueryMembersFirstNine ¶
func (d *DB) QueryMembersFirstNine(groupNo string) ([]*MemberModel, error)
QueryMembersFirstNine 查询最先加入群聊的九为群成员
func (*DB) QueryMembersFirstNineExclude ¶
func (d *DB) QueryMembersFirstNineExclude(groupNo string, excludeUIDs []string) ([]*MemberModel, error)
QueryMembersFirstNineExclude 查询最先加入群聊的九位群成员 【excludeUIDs】为排除的用户
func (*DB) QueryMembersWithStatus ¶
func (d *DB) QueryMembersWithStatus(groupNo string, status int) ([]*MemberModel, error)
QueryMembersWithStatus 通过成员状态查询成员
func (*DB) QueryMembersWithUids ¶
func (d *DB) QueryMembersWithUids(uids []string, groupNo string) ([]*MemberModel, error)
QueryMembersWithUids 查询群内的指定成员
func (*DB) QuerySecondOldestMemberExcludingBotsOf ¶ added in v1.6.1
func (d *DB) QuerySecondOldestMemberExcludingBotsOf(groupNo string, leaverUID string) (*MemberModel, error)
QuerySecondOldestMemberExcludingBotsOf 选出第二元老成员(群主退群时的新群主人选), 在 QuerySecondOldestMember 的基础上额外排除 leaverUID 名下(robot.creator_uid)的 活跃 bot:#354 起群主退群也会级联带走自己的 bot,这些 bot 在同一事务内即将离群, 不能被选为新群主(否则会出现「新群主刚上任就被级联删除」的孤儿群)。 其他人的 bot 不受影响,保持与旧选主逻辑一致。
func (*DB) QuerySourceSpaceIDForMember ¶
QuerySourceSpaceIDForMember 查询某用户作为外部成员在指定群的 source_space_id 非外部成员或不存在时返回空字符串
func (*DB) QueryWithGroupNo ¶
QueryWithGroupNo 根据群编号查询群信息
func (*DB) QueryWithGroupNos ¶
QueryWithGroupNo 根据群编号查询群信息
func (*DB) SyncMembers ¶
SyncMembers 同步群成员
func (*DB) UpdateBotAdmin ¶
UpdateBotAdmin sets or unsets bot_admin for a group member
func (*DB) UpdateGroupMd ¶
UpdateGroupMd updates GROUP.md content and auto-increments version. Uses a transaction to ensure UPDATE and SELECT LAST_INSERT_ID() share the same connection.
func (*DB) UpdateGroupType ¶
修改群类型
func (*DB) UpdateGroupTypeTx ¶
修改群类型
func (*DB) UpdateInviteItemStatusTx ¶
UpdateInviteItemStatusTx 更新邀请信息状态
func (*DB) UpdateInviteStatusTx ¶
UpdateInviteStatusTx 更新邀请信息状态
func (*DB) UpdateInviteTx ¶ added in v1.8.0
UpdateInviteTx 仅更新「进群邀请开关」与群版本(列级写,事务内)。 不能用 UpdateTx 整行回写:groupUpdate 在同一请求里若同时带 name 与 invite,name 分支 已通过 UpdateGroupInfo(独立 fresh load)提交了新 name,而 invite 分支若再用建链时载入 的旧快照经 UpdateTx 全列回写,会把刚提交的 name 用旧值覆盖回去(改名被静默回滚)。 列级写只动 invite/version,与并发的改名互不踩踏,也消除该读改写竞态。
func (*DB) UpdateIsExternalGroup ¶
UpdateIsExternalGroup 更新群的 is_external_group 标记
func (*DB) UpdateIsExternalGroupTx ¶
UpdateIsExternalGroupTx 事务内更新群的 is_external_group 标记
func (*DB) UpdateManagersToMember ¶
UpdateManagersToMember 更新指定管理员为普通成员
func (*DB) UpdateMemberRoleTx ¶
func (d *DB) UpdateMemberRoleTx(groupNo string, uid string, role int, version int64, tx *dbr.Tx) error
UpdateMemberRoleTx 更新群成员角色
func (*DB) UpdateMemberTx ¶
func (d *DB) UpdateMemberTx(member *MemberModel, tx *dbr.Tx) error
UpdateMemberTx 更新成员信息
func (*DB) UpdateMembersToManager ¶
UpdateMembersToManager 更新指定群成员为管理员
func (*DB) UpdateStatusTx ¶ added in v1.8.0
UpdateStatusTx 仅更新「群状态」与群版本(列级写,事务内)。 disband() 不能用 UpdateTx 整行回写:行 183 的 SELECT 无锁,FOR UPDATE 行 233 只读 status 不刷新其他列,若并发 groupUpdate(改名/公告/禁言等)在窗口内提交了新值, UpdateTx 全列回写会用旧快照覆盖并发修改(lost-update)。列级写只动 status/version, 与并发的群设置变更互不踩踏,对齐 UpdateInviteTx 的设计。
type DetailModel ¶
type DetailModel struct {
Model
Mute int // 免打扰
Top int // 置顶
ShowNick int // 显示昵称
Save int // 是否保存
ChatPwdOn int //是否开启聊天密码
RevokeRemind int //撤回提醒
JoinGroupRemind int // 进群提醒
Screenshot int //截屏通知
Receipt int //消息是否回执
Flame int // 是否开启阅后即焚
FlameSecond int // 阅后即焚秒数
Remark string // 群备注
}
DetailModel 群详情
type Group ¶
Group 群组相关API
func (*Group) CheckForbiddenLoop ¶
func (g *Group) CheckForbiddenLoop()
func (*Group) GetGroupByGroupNo ¶
func (g *Group) GetGroupByGroupNo(groupNo string) (*source.GroupModel, error)
GetGroupByGroupNo 查询群详情
func (*Group) GetGroupMemberByUID ¶
func (*Group) GetGroupMemberByVercode ¶
func (g *Group) GetGroupMemberByVercode(vercode string) (*source.GroupMember, error)
GetGroupMemberByVercode 通过vercode获取群成员
func (*Group) GetGroupMemberByVercodes ¶
func (g *Group) GetGroupMemberByVercodes(vercodes []string) ([]*source.GroupMember, error)
type GroupMdResult ¶
type GroupMdResult struct {
Content string `json:"content"`
Version int64 `json:"version"`
UpdatedAt *time.Time `json:"updated_at"`
UpdatedBy string `json:"updated_by"`
}
GroupMdResult GROUP.md query result
type GroupResp ¶
type GroupResp struct {
GroupNo string `json:"group_no"` // 群编号
GroupType GroupType `json:"group_type"` // 群类型
Category string `json:"category"` // 群分类
Name string `json:"name"` // 群名称
IsNamed int `json:"is_named"` // 1=改版前老群(默认渲染群名文字)/0=新群(默认双人图标);由 #500 迁移回填,新群恒为 0;客户端可据此本地预判默认头像取群名文字 vs 双人图标
AvatarText string `json:"avatar_text"` // 自定义群头像文字(空=按 is_named 回退:老群渲染群名/新群双人图标)
AvatarColor *int `json:"avatar_color"` // 自定义群头像色板下标(null=按 group_no 派生)
Remark string `json:"remark"` // 群备注
Notice string `json:"notice"` // 群公告
Mute int `json:"mute"` // 免打扰
Top int `json:"top"` // 置顶
ShowNick int `json:"show_nick"` // 显示昵称
Save int `json:"save"` // 是否保存
Forbidden int `json:"forbidden"` // 是否全员禁言
Invite int `json:"invite"` // 群聊邀请确认
ChatPwdOn int `json:"chat_pwd_on"` //是否开启聊天密码
Screenshot int `json:"screenshot"` //截屏通知
RevokeRemind int `json:"revoke_remind"` //撤回提醒
JoinGroupRemind int `json:"join_group_remind"` //进群提醒
ForbiddenAddFriend int `json:"forbidden_add_friend"` //群内禁止加好友
Status int `json:"status"` //群状态
Receipt int `json:"receipt"` //消息是否回执
Flame int `json:"flame"` // 阅后即焚
FlameSecond int `json:"flame_second"` // 阅后即焚秒数
AllowViewHistoryMsg int `json:"allow_view_history_msg"` // 是否允许新成员查看历史消息
MemberCount int `json:"member_count"` // 成员数量
OnlineCount int `json:"online_count"` // 在线数量
Quit int `json:"quit"` // 我是否已退出群聊
Role int `json:"role"` // 我在群聊里的角色
ForbiddenExpirTime int64 `json:"forbidden_expir_time"` // 我在此群的禁言过期时间
AllowMemberPinnedMessage int `json:"allow_member_pinned_message"` //是否允许群成员置顶消息
HasGroupMd bool `json:"has_group_md"` // 是否有GROUP.md
GroupMdVersion int64 `json:"group_md_version"` // GROUP.md版本
GroupMdUpdatedAt *string `json:"group_md_updated_at"` // GROUP.md最后更新时间
CanEditGroupMd bool `json:"can_edit_group_md"` // 是否可编辑GROUP.md
CanManageBotAdmin bool `json:"can_manage_bot_admin"` // 是否可管理Bot管理员
SpaceID string `json:"space_id"` // Space ID
IsExternalGroup int `json:"is_external_group"` // 是否外部群 0.否 1.是
AllowExternal int `json:"allow_external"` // 是否允许外部成员 1.允许(默认) 0.禁止
AllowNoMention int `json:"allow_no_mention"` // 群级是否允许免@生效 1.允许(默认) 0.禁止
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Version int64 `json:"version"` // 群数据版本
}
func (*GroupResp) SetEffectiveSpaceID ¶
SetEffectiveSpaceID 对外部群的外部成员替换 SpaceID 为其来源 Space, 这样 Web 端依赖 space_id 的会话过滤逻辑无需修改即可自然匹配。
func (*GroupResp) SetEffectiveSpaceIDFromMap ¶
SetEffectiveSpaceIDFromMap 与 SetEffectiveSpaceID 等价,但使用调用方预先批量查询的 groupNo -> sourceSpaceID 映射,避免列表场景下的 N+1 查询。
type IService ¶
type IService interface {
// 获取群总数
GetAllGroupCount() (int64, error)
// 查询某天的新建群数量
GetCreatedCountWithDate(date string) (int64, error)
// 添加一个群
AddGroup(model *AddGroupReq) error
// 某个时间段的建群数据
GetGroupWithDateSpace(startDate, endDate string) (map[string]int64, error)
// 查询某个群信息
GetGroupWithGroupNo(groupNo string) (*InfoResp, error)
// GetGroups 获取群集合
GetGroups(groupNos []string) ([]*InfoResp, error)
// 获取某一批群与指定用户的详情(包括用户对群的设置等等)
GetGroupDetails(groupNos []string, uid string) ([]*GroupResp, error)
// 获取群详情
GetGroupDetail(groupNo string, uid string) (*GroupResp, error)
// -------------------- 群设置 --------------------
// GetSettings 获取群的设置
GetSettings(groupNos []string, uid string) ([]*SettingResp, error)
// GetSettingsWithUids 获取一批用户对某个群的设置
GetSettingsWithUIDs(groupNo string, uids []string) ([]*SettingResp, error)
// -------------------- 群成员 --------------------
// 获取指定群的群成员列表
GetMembers(groupNo string) ([]*MemberResp, error)
// GetMemberExternalMarkers 批量获取指定群所有非删除成员的外部来源标识。
// 返回 uid -> MemberExternalMarker 的映射,供消息同步等热路径 O(1) 查找,避免 N+1 JOIN。
GetMemberExternalMarkers(groupNo string) (map[string]MemberExternalMarker, error)
// GetMemberExternalFields 单成员版外部来源 / 归属 Space 字段查询(YUJ-206),
// 供 /users/{uid}?group_no= 路径补齐 GroupMemberResp 的 is_external / source_space_* /
// home_space_* 字段。语义与 GetMemberExternalMarkers 保持一致。
GetMemberExternalFields(groupNo, uid string) (
isExternal int,
sourceSpaceID, sourceSpaceName string,
homeSpaceID, homeSpaceName string,
err error,
)
// 获取指定群的指定成员信息
GetMember(groupNo, uid string) (*MemberResp, error)
// 获取黑名单成员uid集合
GetBlacklistMemberUIDs(groupNo string) ([]string, error)
// GetSubscribableMemberUIDs 返回可订阅成员 uid 集合(status=normal AND is_deleted=0,
// 即排除被拉黑成员),供子区/父群的 IM Subscribers 数据源使用。与 GetMembers
// (“所有非删除成员”)语义不同,不可互换。
GetSubscribableMemberUIDs(groupNo string) ([]string, error)
// 查询管理员成员uid列表(包括创建者)
GetMemberUIDsOfManager(groupNo string) ([]string, error)
// 是否是创建者或管理者
IsCreatorOrManager(groupNo string, uid string) (bool, error)
// 获取成员总数量和在线数量
// 第一个返回参数为成员总数量
// 第二个返回参数为在线数量
GetMemberTotalAndOnlineCount(groupNo string) (int, int, error)
// 是否存在群成员
ExistMember(groupNo string, uid string) (bool, error)
// ExistMemberActive 是否存在「活跃」群成员(is_deleted=0 AND status=Normal,
// 白名单语义、fail-closed),排除被拉黑成员。供绕过 IM 直查本地分表的读/发门禁,
// 以及子区(CommunityTopic)解析父群后的读/写门禁使用,防止被拉黑用户越权读子区内容。
ExistMemberActive(groupNo string, uid string) (bool, error)
// 成员是否在某群里存在 返回对应在群里的群编号
ExistMembers(groupNos []string, uid string) ([]string, error)
// ExistMembersActive 批量版 ExistMemberActive:返回 uid 处于「活跃」状态
// (is_deleted=0 AND status=Normal)的群编号集合,排除被拉黑成员
ExistMembersActive(groupNos []string, uid string) ([]string, error)
// GetGroupsWithMemberUID 获取某个用户的所有群
GetGroupsWithMemberUID(uid string) ([]*InfoResp, error)
// 获取指定群的群成员的最大数据版本
GetGroupMemberMaxVersion(groupNo string) (int64, error)
// 获取用户所有超级群信息
GetUserSupers(uid string) ([]*InfoResp, error)
// 新增群成员
AddMember(model *AddMemberReq) error
// 获取指定一批群的指定成员信息
GetMembersWithUIDAndGroupIds(uid string, groupNos []string) ([]*MemberResp, error)
// 查询一批群的管理员及群主
GetManagersWithGroupNos(groupNos []string) ([]*MemberResp, error)
// GetGroupMd returns GROUP.md content for a group
GetGroupMd(groupNo string) (*GroupMdResult, error)
// UpdateGroupMd updates GROUP.md content
UpdateGroupMd(groupNo string, content string, updatedBy string) (int64, error)
// DeleteGroupMd deletes GROUP.md content
DeleteGroupMd(groupNo string) (int64, error)
// IsBotAdmin checks if a member is a bot admin
IsBotAdmin(groupNo string, uid string) (bool, error)
// GetBotMemberUIDs returns UIDs of robot members in the group
GetBotMemberUIDs(groupNo string) ([]string, error)
// CreateGroup 创建群(统一入口,Web 和 Bot 共用)
CreateGroup(req *CreateGroupServiceReq) (*CreateGroupServiceResp, error)
// AddGroupMembers 添加群成员
AddGroupMembers(req *AddGroupMembersServiceReq) (*AddGroupMembersServiceResp, error)
// RemoveGroupMembers 移除群成员
RemoveGroupMembers(req *RemoveGroupMembersServiceReq) (*RemoveGroupMembersServiceResp, error)
// RemoveUserFromGroupThreads 清理某用户在某群所有子区的 thread_member 记录、IM 订阅和置顶。
// 供 botfather 删除 Bot 等“父群成员已移除、需对齐摘除子区订阅”的外部路径调用(Issue #27)。
RemoveUserFromGroupThreads(groupNo, uid, spaceID string)
// UpdateGroupInfo 更新群信息
UpdateGroupInfo(req *UpdateGroupInfoServiceReq) error
// UpdateGroupAvatarCustom 更新自定义群头像文字/颜色
UpdateGroupAvatarCustom(req *UpdateGroupAvatarCustomServiceReq) error
}
IService 群相关
type InfoResp ¶
type InfoResp struct {
GroupNo string `json:"group_no"` // 群编号
GroupType GroupType `json:"group_type"` // 群类型
Name string `json:"name"` // 群名称
Notice string `json:"notice"` // 群公告
Creator string `json:"creator"` // 创建者uid
Status int `json:"status"` // 群状态
Forbidden int `json:"forbidden"` // 是否全员禁言
Invite int `json:"invite"` // 是否开启邀请确认 0.否 1.是
ForbiddenAddFriend int `json:"forbidden_add_friend"` //群内禁止加好友
AllowViewHistoryMsg int `json:"allow_view_history_msg"` // 是否允许新成员查看历史记录
CreatedAt string `json:"created_at"`
UpdatedAt string `json:"updated_at"`
Version int64 `json:"version"` // 群数据版本
SpaceID string `json:"space_id"` // Space ID
IsExternalGroup int `json:"is_external_group"` // 是否外部群
AllowExternal int `json:"allow_external"` // 是否允许外部成员 1.允许(默认) 0.禁止
AllowNoMention int `json:"allow_no_mention"` // 群级是否允许免@生效 1.允许(默认) 0.禁止
}
InfoResp 群信息
type InviteDetailModel ¶
type InviteDetailModel struct {
InviteModel
InviterName string `json:"inviter_name"` // 邀请者名称
}
InviteDetailModel 邀请者详情
type InviteDetailResp ¶
type InviteDetailResp struct {
InviteNo string `json:"invite_no"` // 邀请唯一编号
GroupNo string `json:"group_no"` // 群唯一编号
Inviter string `json:"inviter"` // 邀请者
Remark string `json:"remark"` // 邀请备注
InviterName string `json:"inviter_name"` // 邀请者名称
Status int `json:"status"` // 状态 0.未确认 1.已确认
Items []InviteItemDetailResp `json:"items"` // 邀请项详情
// YUJ-168 / GH #1243: 外部群 H5 邀请 landing 的信任锚点字段。
// SpaceName 始终下发(前端判断非空才渲染"来自 xx"),
// IsExternal 仅在当前登录用户不属于该 Space 时置 1。
SpaceName string `json:"space_name"` // 群所属 Space 名称(空字符串表示无 Space)
IsExternal int `json:"is_external"` // 访问者视角:0=内部/未登录,1=跨 Space 外部访问者
}
InviteDetailResp 邀请详情返回
func (InviteDetailResp) From ¶
func (i InviteDetailResp) From(model *InviteDetailModel, items []*InviteItemDetailModel) InviteDetailResp
From From
type InviteItemDetailModel ¶
type InviteItemDetailModel struct {
InviteItemModel
Name string // 被邀请者名称
}
InviteItemDetailModel item详情
type InviteItemDetailResp ¶
type InviteItemDetailResp struct {
UID string `json:"uid"` // 被邀请uid
Name string `json:"name"` // 被邀请者名称
}
InviteItemDetailResp 邀请item
type InviteItemModel ¶
type InviteItemModel struct {
InviteNo string `json:"invite_no"` // 邀请唯一编号
GroupNo string `json:"group_no"` // 群唯一编号
Inviter string `json:"inviter"` // 邀请者
UID string `json:"uid"` // 被邀请uid
Status int `json:"status"` // 状态 0.未确认 1.已确认
db.BaseModel
}
InviteItemModel InviteItemModel
type InviteModel ¶
type InviteModel struct {
InviteNo string `json:"invite_no"` // 邀请唯一编号
GroupNo string `json:"group_no"` // 群唯一编号
Inviter string `json:"inviter"` // 邀请者
Remark string `json:"remark"` // 邀请备注
Status int `json:"status"` // 状态 0.未确认 1.已确认
Allower string `json:"allower"` // 确认者
db.BaseModel
}
InviteModel InviteModel
type MemberDetailModel ¶
type MemberDetailModel struct {
UID string // 成员uid
GroupNo string // 群编号
Name string // 群成员名称
Remark string // 成员备注
Role int // 成员角色
Version int64
Vercode string //验证码
InviteUID string // 邀请人
IsDeleted int // 是否删除
Status int // 1.正常 2.黑名单
Username string
Robot int // 机器人标识0.否1.是
ForbiddenExpirTime int64 // 禁言时长
BotAdmin int // Bot管理员 0.否 1.是
IsExternal int // 外部成员 0.否 1.是
SourceSpaceID string // 来源 Space ID(外部成员使用)
db.BaseModel
}
MemberDetailModel 成员详情model
type MemberExternalMarker ¶
type MemberExternalMarker struct {
IsExternal int // 1 = 外部成员
SourceSpaceName string // 来源 Space 名称;非外部成员或无来源时为空
// HomeSpaceID / HomeSpaceName 是为了前端"相对当前查看 Space"渲染外部徽标
// 而新增的视图字段(YUJ-63 / #1208)。后端 IsExternal / SourceSpace* 语义不变。
// 规则:外部成员 → home = source space;内部成员 → home = 群自身 space。
HomeSpaceID string
HomeSpaceName string
}
MemberExternalMarker 描述群成员的外部来源标识,用于消息同步等热路径。
type MemberGroupDetailModel ¶
type MemberGroupDetailModel struct {
GroupName string // 群名称
MemberModel
}
type MemberModel ¶
type MemberModel struct {
GroupNo string // 群编号
UID string // 成员uid
Remark string // 成员备注
Role int // 成员角色 1. 创建者 2.管理员
Version int64
Status int // 1.正常 2.黑名单
Vercode string //验证码
IsDeleted int // 是否删除
InviteUID string // 邀请者
Robot int // 机器人
ForbiddenExpirTime int64 // 禁言时长
IsExternal int // 外部成员 0.否 1.是
SourceSpaceID string // 来源 Space ID(外部成员使用)
db.BaseModel
}
MemberModel 成员model
type MemberResp ¶
type Model ¶
type Model struct {
GroupNo string // 群编号
GroupType int // 群类型 0.普通群 1.超大群
Name string // 群名称
IsNamed int // 1=改版前老群/0=新群;由 #500 迁移回填,新群恒为 0。默认头像取群名文字仅对 1 生效(grandfather 老群),新群一律双人图标
Avatar string // 群头像
AvatarVersion int64 // 群头像对象版本,0 表示旧版稳定路径
IsUploadAvatar int // 群头像是否已经被用户上传
AvatarText string // 自定义群头像文字;空时按 is_named 回退(老群取群名前2字,新群双人图标)
AvatarColor *int // 自定义群头像色板下标,nil(NULL) 表示按 group_no 派生
Notice string // 群公告
Creator string // 创建者uid
Status int // 群状态
Version int64 // 版本号
Forbidden int // 是否全员禁言
Invite int // 是否开启邀请确认 0.否 1.是
ForbiddenAddFriend int //群内禁止加好友
AllowViewHistoryMsg int // 是否允许新成员查看历史消息
AllowMemberPinnedMessage int // 是否允许群成员置顶消息
Category string // 群分类
SpaceID string // Space ID
IsExternalGroup int // 外部群 0.否 1.是(自动维护)
AllowExternal int // 是否允许外部成员加入 1.允许(默认) 0.禁止
AllowNoMention int // 群级是否允许免@生效 1.允许(默认) 0.禁止(bot 在本群必须被@)
GroupMd *string // GROUP.md content
GroupMdVersion int64 // GROUP.md version
GroupMdUpdatedAt *time.Time // GROUP.md last update time
GroupMdUpdatedBy string // GROUP.md last updater UID
db.BaseModel
}
Model 群db model
type MsgGroupMemberScanJoinExt ¶
type MsgGroupMemberScanJoinExt struct {
config.MsgGroupMemberScanJoin
IsExternal int `json:"is_external"`
}
MsgGroupMemberScanJoinExt 在 config.MsgGroupMemberScanJoin 基础上扩展 is_external 字段, 供事件 handler 区分内部/外部成员加入时的系统消息文案。
type RemoveGroupMembersServiceReq ¶
type RemoveGroupMembersServiceReq struct {
GroupNo string // 群编号
Members []string // 待移除成员 UID 列表
OperatorUID string // 操作者 UID
OperatorName string // 操作者名称
}
RemoveGroupMembersServiceReq 移除群成员请求
type RemoveGroupMembersServiceResp ¶
type RemoveGroupMembersServiceResp struct {
Removed int // 实际移除数量
RemovedUIDs []string // 实际移除的 UID 列表
}
RemoveGroupMembersServiceResp 移除群成员响应
type Service ¶
Service Service
func (*Service) AddGroupMembers ¶
func (s *Service) AddGroupMembers(req *AddGroupMembersServiceReq) (*AddGroupMembersServiceResp, error)
AddGroupMembers 添加群成员
func (*Service) AddMember ¶
func (s *Service) AddMember(model *AddMemberReq) error
func (*Service) CreateGroup ¶
func (s *Service) CreateGroup(req *CreateGroupServiceReq) (*CreateGroupServiceResp, error)
CreateGroup 创建群(统一入口,Web 和 Bot 共用)
func (*Service) ExistMember ¶
func (*Service) ExistMemberActive ¶ added in v1.6.1
ExistMemberActive 是 ExistMember 的白名单(fail closed)变体:除 is_deleted=0 外还 要求 status=GroupMemberStatusNormal,明确排除被拉黑及未来新增的非正常状态成员。 子区(CommunityTopic)读/发门禁用它替代 ExistMember,避免被拉黑用户越权读/发(YUJ-4185 CR 整改)。
func (*Service) ExistMembers ¶
func (*Service) ExistMembersActive ¶ added in v1.6.1
ExistMembersActive 是 ExistMembers 的白名单(fail closed)批量变体:在 is_deleted=0 之外额外要求 status=GroupMemberStatusNormal,把被拉黑成员从“仍是成员”的集合里排除。 子区(CommunityTopic)批量读门禁用它替代 ExistMembers(YUJ-4185 CR 整改)。
func (*Service) GetAllGroupCount ¶
GetAllGroupCount 获取群总数
func (*Service) GetBlacklistMemberUIDs ¶
func (*Service) GetBotMemberUIDs ¶
func (*Service) GetCreatedCountWithDate ¶
GetCreatedCountWithDate 获取某天的新建群数量
func (*Service) GetGroupDetail ¶
func (*Service) GetGroupDetails ¶
func (*Service) GetGroupMd ¶
func (s *Service) GetGroupMd(groupNo string) (*GroupMdResult, error)
func (*Service) GetGroupMemberMaxVersion ¶
func (*Service) GetGroupWithDateSpace ¶
GetGroupWithDateSpace 某个时间段的建群数据
func (*Service) GetGroupWithGroupNo ¶
GetGroupWithGroupNo 查询一个群信息
func (*Service) GetGroupsWithMemberUID ¶
func (*Service) GetManagersWithGroupNos ¶
func (s *Service) GetManagersWithGroupNos(groupNos []string) ([]*MemberResp, error)
GetManagersWithGroupNos 查询一批群的管理员及群主
func (*Service) GetMemberExternalFields ¶
func (s *Service) GetMemberExternalFields(groupNo, uid string) ( isExternal int, sourceSpaceID, sourceSpaceName string, homeSpaceID, homeSpaceName string, err error, )
GetMemberExternalFields 返回单成员的外部来源/归属 Space 字段,供 /users/{uid}?group_no= 路径(user 模块 GroupMemberResp)补齐。语义与批量版 GetMemberExternalMarkers 一致:
- isExternal==1: 成员相对群 Space 为外部 sourceSpaceID = 来源 Space(原语义,保留) homeSpaceID = sourceSpaceID(相对视角,对齐企微)
- isExternal==0: 内部成员 homeSpaceID = 群自身 space_id
未注册 Space(群未挂 Space / 字段为空)时返回空字符串,而非 error。 成员不存在或已删除时返回全零值 + nil error,避免 /users/{uid} 热路径抖动。
开销:1 次 group_member LEFT JOIN space(点查,命中 PRIMARY KEY)
- 至多 1 次 group+space 回查(仅内部成员且需要 home_space_name 时)。
func (*Service) GetMemberExternalMarkers ¶
func (s *Service) GetMemberExternalMarkers(groupNo string) (map[string]MemberExternalMarker, error)
GetMemberExternalMarkers 返回群内所有未删除成员的外部来源标识映射 uid -> MemberExternalMarker。 实现上用一条 LEFT JOIN 语句同时取出 is_external / source_space_id / space.name, 再(仅当群本身存在 space_id 时)一次性取出群归属 Space 的名称, 调用方在遍历消息时即可 O(1) lookup,避免每条消息再去 JOIN group_member。 groupNo 为空直接返回空 map,方便调用方统一处理 DM 场景。
func (*Service) GetMemberTotalAndOnlineCount ¶
func (*Service) GetMemberUIDsOfManager ¶
func (*Service) GetMembers ¶
func (s *Service) GetMembers(groupNo string) ([]*MemberResp, error)
func (*Service) GetMembersWithUIDAndGroupIds ¶
func (s *Service) GetMembersWithUIDAndGroupIds(uid string, groupNos []string) ([]*MemberResp, error)
GetMembersWithUIDAndGroupIds
func (*Service) GetSettings ¶
func (s *Service) GetSettings(groupNos []string, uid string) ([]*SettingResp, error)
func (*Service) GetSettingsWithUIDs ¶
func (s *Service) GetSettingsWithUIDs(groupNo string, uids []string) ([]*SettingResp, error)
GetSettingsWithUIDs 查询一批用户对某个群的设置
func (*Service) GetSubscribableMemberUIDs ¶ added in v1.6.1
GetSubscribableMemberUIDs 返回可订阅成员 uid(status=normal AND is_deleted=0)。 子区/父群 IM Subscribers 数据源专用:排除被拉黑成员,避免 WuKongIM 重载订阅时 把黑名单用户加回订阅列表(YUJ-4185 P0-2)。
func (*Service) IsCreatorOrManager ¶
func (*Service) RemoveGroupMembers ¶
func (s *Service) RemoveGroupMembers(req *RemoveGroupMembersServiceReq) (*RemoveGroupMembersServiceResp, error)
RemoveGroupMembers 移除群成员
func (*Service) RemoveUserFromGroupThreads ¶ added in v1.6.1
RemoveUserFromGroupThreads 导出版,供其他模块(botfather)对齐摘除子区订阅,见接口注释。
func (*Service) UpdateGroupAvatarCustom ¶ added in v1.7.0
func (s *Service) UpdateGroupAvatarCustom(req *UpdateGroupAvatarCustomServiceReq) error
UpdateGroupAvatarCustom 更新自定义群头像文字/颜色(二次弹窗保存)。未提供的字段 保持现值;落库后 bump 群版本并通知客户端刷新频道信息——头像 URL 稳定,客户端据此 重新拉取,靠 avatarGet 的内容相关 ETag 取到新图。校验由 API 层完成。
func (*Service) UpdateGroupInfo ¶
func (s *Service) UpdateGroupInfo(req *UpdateGroupInfoServiceReq) error
UpdateGroupInfo 更新群信息
type Setting ¶
type Setting struct {
UID string // 用户uid
GroupNo string // 群编号
Mute int // 免打扰
Top int // 置顶
ShowNick int // 显示昵称
Save int // 是否保存
ChatPwdOn int //是否开启聊天密码
Screenshot int //截屏通知
RevokeRemind int //撤回通知
JoinGroupRemind int //进群提醒
Receipt int //消息是否回执
Flame int // 是否开启阅后即焚
FlameSecond int // 阅后即焚秒数
Remark string // 群备注
Version int64 // 版本
db.BaseModel
}
Setting 群设置
type SettingResp ¶
type SettingResp struct {
UID string
GroupNo string // 群编号
Mute int // 免打扰
Top int // 置顶
ShowNick int // 显示昵称
Save int // 是否保存
ChatPwdOn int //是否开启聊天密码
Screenshot int //截屏通知
RevokeRemind int //撤回通知
JoinGroupRemind int //进群提醒
Receipt int //消息是否回执
Remark string // 群备注
Version int64 // 版本
}
SettingResp 群设置
type UpdateGroupAvatarCustomServiceReq ¶ added in v1.7.0
type UpdateGroupAvatarCustomServiceReq struct {
GroupNo string
OperatorUID string
OperatorName string
// AvatarText:nil 表示不更新文字;非 nil(含 "")表示设置,"" 即清除自定义文字(回退 is_named 规则:老群群名/新群双人图标)。
AvatarText *string
// SetAvatarColor:是否更新颜色。为 true 时按 AvatarColor 设置:nil 清除(NULL,回退派生),
// 非 nil 为色板下标。为 false 时不动颜色。
SetAvatarColor bool
AvatarColor *int
}
UpdateGroupAvatarCustomServiceReq 更新自定义群头像文字/颜色(二次弹窗保存)。