package cn.iocoder.yudao.module.im.service.group; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupAdminAddReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupAdminRemoveReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupCancelMuteMemberReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupCreateReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupMuteAllReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupMuteMemberReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupTransferOwnerReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.ImGroupUpdateReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberInviteReqVO; import cn.iocoder.yudao.module.im.controller.admin.group.vo.member.ImGroupMemberRemoveReqVO; import cn.iocoder.yudao.module.im.controller.admin.manager.group.vo.ImGroupManagerBanReqVO; import cn.iocoder.yudao.module.im.controller.admin.manager.group.vo.ImGroupManagerPageReqVO; import cn.iocoder.yudao.module.im.dal.dataobject.group.ImGroupDO; import jakarta.validation.Valid; import java.util.Collection; import java.util.List; import java.util.Map; /** * 用户群群 Service 接口 * * @author 芋道源码 */ public interface ImGroupService { // ==================== 群的写操作 ==================== /** * 创建群 *

* 同时将当前登录用户设置为群主,并插入群主的群成员记录 * * @param createReqVO 创建信息 * @param userId 当前登录用户编号(群主) * @return 创建后的群信息 */ ImGroupDO createGroup(@Valid ImGroupCreateReqVO createReqVO, Long userId); /** * 更新群信息 * * @param updateReqVO 更新信息 * @param userId 当前登录用户编号 * @return 更新后的群信息 */ ImGroupDO updateGroup(@Valid ImGroupUpdateReqVO updateReqVO, Long userId); /** * 解散群 *

* 仅群主可执行 * * @param id 群编号 * @param userId 当前登录用户编号 */ void dissolveGroup(Long id, Long userId); // ==================== 群的读操作 ==================== /** * 获得群 * * @param id 编号 * @return 群 */ ImGroupDO getGroup(Long id); /** * 批量获得群 Map * * @param ids 群编号集合 * @return 群 Map(key = 群编号) */ Map getGroupMap(Collection ids); /** * 校验群存在且未封禁、未解散 * * @param groupId 群编号 * @return 群信息 */ ImGroupDO validateGroupExists(Long groupId); /** * 校验入群人数上限 *

* 调用方场景:自由进群 / 审批通过等不经 inviteGroupMember 的入群路径,需在写群成员前主动校验 * * @param groupId 群编号 * @param addCount 即将新增的人数 * @throws cn.iocoder.yudao.framework.common.exception.ServiceException 群已满抛 GROUP_MEMBER_EXCEED */ void validateMemberCountLimit(Long groupId, int addCount); /** * 获取指定用户的群列表 *

* 返回用户当前仍有效的群,以及最近 yudao.im.message.group-pull-max-days 天内退群的群 * —— 退群前可能还有离线消息需要展示,前端需要把这些群信息作为缓存。 * * @param userId 用户编号 * @return 群列表 */ List getMyGroupList(Long userId); // ==================== 群成员的写操作 ==================== // 说明:群成员的写操作统一放在 ImGroupService,而非 ImGroupMemberService, // 保持 ImGroupMemberService 无 WebSocket 推送等外部依赖,职责更单一。 /** * 邀请用户加入群 *

* 群成员即可执行,支持批量。 * 校验群人数上限,邀请后推送提示消息和群创建事件给被邀请人。 * * @param userId 当前登录用户编号 * @param inviteReqVO 邀请信息 */ void inviteGroupMember(Long userId, @Valid ImGroupMemberInviteReqVO inviteReqVO); /** * 退群 *

* 群主不可退群(只能解散) * * @param groupId 群编号 * @param userId 当前登录用户编号 */ void quitGroup(Long groupId, Long userId); /** * 移除群成员(踢人) *

* 群主可踢管理员和普通成员;管理员仅能踢普通成员;群主不可被踢。 * * @param userId 当前登录用户编号 * @param removeReqVO 移除信息 */ void removeGroupMember(Long userId, @Valid ImGroupMemberRemoveReqVO removeReqVO); /** * 添加群管理员(仅群主可执行) * * @param userId 当前登录用户编号(群主) * @param reqVO 添加信息(含群编号、目标用户编号列表) */ void addGroupAdmin(Long userId, @Valid ImGroupAdminAddReqVO reqVO); /** * 撤销群管理员(仅群主可执行) * * @param userId 当前登录用户编号(群主) * @param reqVO 撤销信息(含群编号、目标用户编号列表) */ void removeGroupAdmin(Long userId, @Valid ImGroupAdminRemoveReqVO reqVO); /** * 转让群主(仅老群主可执行) *

* 转让后:旧群主 role 降为 MEMBER,新群主 role 升为 OWNER * * @param userId 当前登录用户编号(旧群主) * @param transferReqVO 转让信息 */ void transferGroupOwner(Long userId, @Valid ImGroupTransferOwnerReqVO transferReqVO); /** * 置顶群消息(仅群主或管理员可执行) *

* 上限由 yudao.im.group.pin-max-count 控制;幂等失败时抛业务异常 * * @param userId 当前登录用户编号 * @param groupId 群编号 * @param messageId 被置顶的消息编号 */ void pinGroupMessage(Long userId, Long groupId, Long messageId); /** * 取消置顶群消息(仅群主或管理员可执行) * * @param userId 当前登录用户编号 * @param groupId 群编号 * @param messageId 被取消置顶的消息编号 */ void unpinGroupMessage(Long userId, Long groupId, Long messageId); // ==================== 群禁言 ==================== /** * 全群禁言 / 取消(仅群主或管理员可执行) * * @param userId 当前登录用户编号 * @param reqVO 禁言信息 */ void muteAll(Long userId, @Valid ImGroupMuteAllReqVO reqVO); /** * 禁言单个成员(三档分层权限) * * @param userId 当前登录用户编号 * @param reqVO 禁言信息 */ void muteMember(Long userId, @Valid ImGroupMuteMemberReqVO reqVO); /** * 取消成员禁言(三档分层权限) * * @param userId 当前登录用户编号 * @param reqVO 取消禁言信息 */ void cancelMuteMember(Long userId, @Valid ImGroupCancelMuteMemberReqVO reqVO); // ==================== 管理后台 ==================== /** * 【管理后台】分页查询群列表 * * @param pageReqVO 分页查询条件 * @return 群分页列表 */ PageResult getGroupPage(ImGroupManagerPageReqVO pageReqVO); /** * 【管理后台】封禁群 * * @param operatorUserId 操作人用户编号 * @param banReqVO 封禁信息(含群编号、封禁原因) */ void banGroup(Long operatorUserId, @Valid ImGroupManagerBanReqVO banReqVO); /** * 【管理后台】解封群 * * @param operatorUserId 操作人用户编号 * @param id 群编号 */ void unbanGroup(Long operatorUserId, Long id); /** * 【管理后台】解散群 * * @param operatorUserId 操作人用户编号 * @param id 群编号 */ void dissolveGroupByManager(Long operatorUserId, Long id); }