- 从文件模块的多部分上传处理器中移除未使用的实体引用 - 从即时通讯模块的群组成员处理器中移除未使用的实体引用 - 从RAG模块的AI模型配置中移除未使用的实体引用 - 从监控模块的告警规则配置中移除未使用的实体引用 - 从平台模块的角色权限处理器中移除未使用的实体引用 - 从脚本模块的执行日志实体引用中进行清理 - 从多个基础设施配置类中移除未使用的依赖项 - 优化测试文件中的导入声明,移除不必要的引用
48 lines
1.9 KiB
C#
48 lines
1.9 KiB
C#
using MediatR;
|
|
using BuildFlow.Shared.Domain.Exceptions;
|
|
using IM.Application.Chat.Commands;
|
|
using IM.Domain.Entities.ConversationParticipant;
|
|
using IM.Domain.Entities.GroupMember;
|
|
using IM.Domain.Enums;
|
|
using IM.Infrastructure.Persistence;
|
|
|
|
namespace IM.Application.Chat.Handlers;
|
|
|
|
/// <summary>
|
|
/// 批量添加群成员处理器。校验操作者权限与目标用户存在性后入群,更新群成员数。
|
|
/// </summary>
|
|
public class AddGroupMemberCommandHandler(ImDbContext db) : IRequestHandler<AddGroupMemberCommand, Unit>
|
|
{
|
|
public async Task<Unit> Handle(AddGroupMemberCommand request, CancellationToken ct)
|
|
{
|
|
var group = await db.Groups
|
|
.Include(g => g.Members)
|
|
.FirstOrDefaultAsync(g => g.Id == request.GroupId, ct)
|
|
?? throw new NotFoundException("群组不存在");
|
|
|
|
// 权限:仅群主或管理员可拉人,普通 Member 越权操作直接拒绝
|
|
var operatorMember = group.Members.FirstOrDefault(m => m.UserId == request.OperatorId);
|
|
if (operatorMember is null || operatorMember.Role == GroupMemberRoleEnum.Member)
|
|
throw new BusinessException("只有群主或管理员才能添加成员");
|
|
|
|
foreach (var userId in request.UserIds.Where(userId => group.Members.All(m => m.UserId != userId)))
|
|
{
|
|
db.GroupMembers.Add(new GroupMemberEntity
|
|
{
|
|
GroupId = request.GroupId, UserId = userId,
|
|
Role = GroupMemberRoleEnum.Member, JoinedAt = DateTime.UtcNow
|
|
});
|
|
|
|
// 同步加入会话参与者,使其能收到该群后续消息
|
|
db.ConversationParticipants.Add(new ConversationParticipantEntity
|
|
{
|
|
ConversationId = group.ConversationId, UserId = userId,
|
|
JoinedAt = DateTime.UtcNow
|
|
});
|
|
}
|
|
|
|
await db.SaveChangesAsync(ct);
|
|
return Unit.Value;
|
|
}
|
|
}
|