@@ -1,65 +1,65 @@
|
||||
using AutoMapper;
|
||||
using IM_API.Application.EventHandlers.FriendAddHandler;
|
||||
using IM_API.Application.EventHandlers.GroupInviteActionUpdateHandler;
|
||||
using IM_API.Application.EventHandlers.GroupInviteHandler;
|
||||
using IM_API.Application.EventHandlers.GroupJoinHandler;
|
||||
using IM_API.Application.EventHandlers.GroupRequestHandler;
|
||||
using IM_API.Application.EventHandlers.GroupRequestUpdateHandler;
|
||||
using IM_API.Application.EventHandlers.MessageCreatedHandler;
|
||||
using IM_API.Application.EventHandlers.RequestFriendHandler;
|
||||
using IM_API.Configs.Options;
|
||||
using IM_API.Domain.Events;
|
||||
using MassTransit;
|
||||
using MySqlConnector;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public static class MQConfig
|
||||
{
|
||||
public static IServiceCollection AddRabbitMQ(this IServiceCollection services, RabbitMQOptions options)
|
||||
{
|
||||
services.AddMassTransit(x =>
|
||||
{
|
||||
x.AddConsumer<ConversationEventHandler>();
|
||||
x.AddConsumer<SignalREventHandler>();
|
||||
x.AddConsumer<FriendAddDBHandler>();
|
||||
x.AddConsumer<FriendAddSignalRHandler>();
|
||||
x.AddConsumer<RequestFriendSignalRHandler>();
|
||||
x.AddConsumer<FriendAddConversationHandler>();
|
||||
x.AddConsumer<MessageCreatedDbHandler>();
|
||||
x.AddConsumer<GroupJoinConversationHandler>();
|
||||
x.AddConsumer<GroupJoinDbHandler>();
|
||||
x.AddConsumer<GroupJoinSignalrHandler>();
|
||||
x.AddConsumer<GroupRequestSignalRHandler>();
|
||||
x.AddConsumer<Application.EventHandlers.GroupRequestHandler.NextEventHandler>();
|
||||
x.AddConsumer<Application.EventHandlers.GroupRequestUpdateHandler.NextEventHandler>();
|
||||
x.AddConsumer<GroupInviteSignalRHandler>();
|
||||
x.AddConsumer<RequestDbHandler>();
|
||||
x.AddConsumer<SignalRHandler>();
|
||||
x.AddConsumer<RequestUpdateSignalrHandler>();
|
||||
x.UsingRabbitMq((ctx,cfg) =>
|
||||
{
|
||||
cfg.Host(options.Host, "/", h =>
|
||||
{
|
||||
h.Username(options.Username);
|
||||
h.Password(options.Password);
|
||||
});
|
||||
cfg.ConfigureEndpoints(ctx);
|
||||
cfg.UseMessageRetry(r =>
|
||||
{
|
||||
r.Handle<IOException>();
|
||||
r.Handle<MySqlException>();
|
||||
r.Ignore<AutoMapperMappingException>();
|
||||
r.Exponential(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(2));
|
||||
});
|
||||
cfg.ConfigureEndpoints(ctx);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
using AutoMapper;
|
||||
using IM_API.Application.EventHandlers.FriendAddHandler;
|
||||
using IM_API.Application.EventHandlers.GroupInviteActionUpdateHandler;
|
||||
using IM_API.Application.EventHandlers.GroupInviteHandler;
|
||||
using IM_API.Application.EventHandlers.GroupJoinHandler;
|
||||
using IM_API.Application.EventHandlers.GroupRequestHandler;
|
||||
using IM_API.Application.EventHandlers.GroupRequestUpdateHandler;
|
||||
using IM_API.Application.EventHandlers.MessageCreatedHandler;
|
||||
using IM_API.Application.EventHandlers.RequestFriendHandler;
|
||||
using IM_API.Configs.Options;
|
||||
using IM_API.Domain.Events;
|
||||
using MassTransit;
|
||||
using MySqlConnector;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public static class MQConfig
|
||||
{
|
||||
public static IServiceCollection AddRabbitMQ(this IServiceCollection services, RabbitMQOptions options)
|
||||
{
|
||||
services.AddMassTransit(x =>
|
||||
{
|
||||
x.AddConsumer<ConversationEventHandler>();
|
||||
x.AddConsumer<SignalREventHandler>();
|
||||
x.AddConsumer<FriendAddDBHandler>();
|
||||
x.AddConsumer<FriendAddSignalRHandler>();
|
||||
x.AddConsumer<RequestFriendSignalRHandler>();
|
||||
x.AddConsumer<FriendAddConversationHandler>();
|
||||
x.AddConsumer<MessageCreatedDbHandler>();
|
||||
x.AddConsumer<GroupJoinConversationHandler>();
|
||||
x.AddConsumer<GroupJoinDbHandler>();
|
||||
x.AddConsumer<GroupJoinSignalrHandler>();
|
||||
x.AddConsumer<GroupRequestSignalRHandler>();
|
||||
x.AddConsumer<Application.EventHandlers.GroupRequestHandler.NextEventHandler>();
|
||||
x.AddConsumer<Application.EventHandlers.GroupRequestUpdateHandler.NextEventHandler>();
|
||||
x.AddConsumer<GroupInviteSignalRHandler>();
|
||||
x.AddConsumer<RequestDbHandler>();
|
||||
x.AddConsumer<SignalRHandler>();
|
||||
x.AddConsumer<RequestUpdateSignalrHandler>();
|
||||
x.UsingRabbitMq((ctx,cfg) =>
|
||||
{
|
||||
cfg.Host(options.Host, "/", h =>
|
||||
{
|
||||
h.Username(options.Username);
|
||||
h.Password(options.Password);
|
||||
});
|
||||
cfg.ConfigureEndpoints(ctx);
|
||||
cfg.UseMessageRetry(r =>
|
||||
{
|
||||
r.Handle<IOException>();
|
||||
r.Handle<MySqlException>();
|
||||
r.Ignore<AutoMapperMappingException>();
|
||||
r.Exponential(5, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(60), TimeSpan.FromSeconds(2));
|
||||
});
|
||||
cfg.ConfigureEndpoints(ctx);
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
return services;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1,176 +1,176 @@
|
||||
using AutoMapper;
|
||||
using IM_API.Domain.Events;
|
||||
using IM_API.Dtos;
|
||||
using IM_API.Dtos.Auth;
|
||||
using IM_API.Dtos.Friend;
|
||||
using IM_API.Dtos.Group;
|
||||
using IM_API.Dtos.User;
|
||||
using IM_API.Models;
|
||||
using IM_API.Tools;
|
||||
using IM_API.VOs.Conversation;
|
||||
using IM_API.VOs.Message;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public class MapperConfig:Profile
|
||||
{
|
||||
public MapperConfig()
|
||||
{
|
||||
CreateMap<User, UserInfoDto>();
|
||||
//用户信息更新模型转换
|
||||
CreateMap<UpdateUserDto, User>()
|
||||
.ForMember(dest => dest.Updated,opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForAllMembers(opts => opts.Condition((src,dest,srcMember) => srcMember != null));
|
||||
//用户注册模型转换
|
||||
CreateMap<RegisterRequestDto, User>()
|
||||
.ForMember(dest => dest.Username,opt => opt.MapFrom(src => src.Username))
|
||||
.ForMember(dest => dest.Password,opt => opt.MapFrom(src => src.Password))
|
||||
.ForMember(dest => dest.Avatar,opt => opt.MapFrom(src => "https://ts1.tc.mm.bing.net/th/id/OIP-C.dl0WpkTP6E2J4FnhDC_jHwAAAA?rs=1&pid=ImgDetMain&o=7&rm=3"))
|
||||
.ForMember(dest => dest.StatusEnum,opt => opt.MapFrom(src => UserStatus.Normal))
|
||||
.ForMember(dest => dest.OnlineStatusEnum,opt => opt.MapFrom(src => UserOnlineStatus.Offline))
|
||||
.ForMember(dest => dest.NickName,opt => opt.MapFrom(src => src.NickName??"默认用户"))
|
||||
.ForMember(dest => dest.Created,opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.IsDeleted,opt => opt.MapFrom(src => 0))
|
||||
;
|
||||
//好友信息模型转换
|
||||
CreateMap<Friend, FriendInfoDto>()
|
||||
.ForMember(dest => dest.UserInfo, opt => opt.MapFrom(src => src.FriendNavigation))
|
||||
.ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.FriendNavigation.Avatar))
|
||||
;
|
||||
//好友请求通过后新增好友关系
|
||||
CreateMap<FriendRequestDto, Friend>()
|
||||
.ForMember(dest => dest.UserId , opt => opt.MapFrom(src => src.FromUserId))
|
||||
.ForMember(dest => dest.FriendId , opt => opt.MapFrom(src => src.ToUserId))
|
||||
.ForMember(dest => dest.StatusEnum , opt =>opt.MapFrom(src => FriendStatus.Pending))
|
||||
.ForMember(dest => dest.RemarkName , opt => opt.MapFrom(src => src.RemarkName))
|
||||
.ForMember(dest => dest.Created , opt => opt.MapFrom(src => DateTime.Now))
|
||||
;
|
||||
//发起好友请求转换请求对象
|
||||
CreateMap<FriendRequestDto, FriendRequest>()
|
||||
.ForMember(dest => dest.RequestUser , opt => opt.MapFrom(src => src.FromUserId))
|
||||
.ForMember(dest => dest.ResponseUser , opt => opt.MapFrom(src => src.ToUserId))
|
||||
.ForMember(dest => dest.Created , opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.StateEnum , opt => opt.MapFrom(src => FriendRequestState.Pending))
|
||||
.ForMember(dest => dest.Description , opt => opt.MapFrom(src => src.Description))
|
||||
;
|
||||
|
||||
CreateMap<FriendRequest, FriendRequestDto>()
|
||||
.ForMember(dest => dest.ToUserId, opt => opt.MapFrom(src => src.ResponseUser))
|
||||
.ForMember(dest => dest.FromUserId, opt => opt.MapFrom(src => src.RequestUser))
|
||||
.ForMember(dest => dest.RemarkName, opt => opt.MapFrom(src => src.RemarkName))
|
||||
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
|
||||
;
|
||||
//消息模型转换
|
||||
CreateMap<Message, MessageBaseVo>()
|
||||
.ForMember(dest => dest.Type , opt => opt.MapFrom(src => src.MsgTypeEnum))
|
||||
.ForMember(dest => dest.MsgId , opt => opt.MapFrom(src => src.ClientMsgId))
|
||||
.ForMember(dest => dest.SenderId , opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.ChatType , opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.ReceiverId, opt => opt.MapFrom(src => src.Recipient))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.TimeStamp, opt => opt.MapFrom(src => src.Created))
|
||||
.ForMember(dest => dest.SequenceId, opt => opt.MapFrom(src => src.SequenceId))
|
||||
;
|
||||
CreateMap<MessageBaseDto, Message>()
|
||||
.ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.SenderId))
|
||||
.ForMember(dest => dest.ChatTypeEnum,opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.MsgTypeEnum, opt => opt.MapFrom(src => src.Type))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => src.TimeStamp))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.Recipient, opt => opt.MapFrom(src => src.ReceiverId))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.Ignore() )
|
||||
.ForMember(dest => dest.StateEnum, opt => opt.MapFrom(src => MessageState.Sent))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.MsgType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ClientMsgId, opt => opt.MapFrom(src => src.MsgId))
|
||||
;
|
||||
|
||||
//会话对象深拷贝
|
||||
CreateMap<Conversation, Conversation>()
|
||||
.ForMember(dest => dest.Id, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.UserId, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.TargetId, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.Ignore())
|
||||
;
|
||||
|
||||
//消息对象转消息创建事件对象
|
||||
CreateMap<Message, MessageCreatedEvent>()
|
||||
.ForMember(dest => dest.MessageMsgType, opt => opt.MapFrom(src => src.MsgTypeEnum))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.MessageContent, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.State, opt => opt.MapFrom(src => src.StateEnum))
|
||||
.ForMember(dest => dest.MessageCreated, opt => opt.MapFrom(src => src.Created))
|
||||
.ForMember(dest => dest.MsgRecipientId, opt => opt.MapFrom(src => src.Recipient))
|
||||
.ForMember(dest => dest.MsgSenderId, opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.EventId, opt => opt.MapFrom(src => Guid.NewGuid()))
|
||||
.ForMember(dest => dest.AggregateId, opt => opt.MapFrom(src => src.Sender.ToString()))
|
||||
.ForMember(dest => dest.OccurredAt , opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.OperatorId, opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
;
|
||||
|
||||
CreateMap<MessageCreatedEvent, Message>()
|
||||
.ForMember(dest => dest.SequenceId, opt => opt.MapFrom(src => src.SequenceId))
|
||||
.ForMember(dest => dest.ClientMsgId, opt => opt.MapFrom(src => src.ClientMsgId))
|
||||
.ForMember(dest => dest.StateEnum, opt => opt.MapFrom(src => src.State))
|
||||
.ForMember(dest => dest.ChatTypeEnum, opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.MessageContent))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => src.MessageCreated))
|
||||
.ForMember(dest => dest.MsgTypeEnum, opt => opt.MapFrom(src => src.MessageMsgType))
|
||||
.ForMember(dest => dest.Recipient, opt => opt.MapFrom(src => src.MsgRecipientId))
|
||||
.ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.MsgSenderId))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.State, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.MsgType, opt => opt.Ignore());
|
||||
|
||||
//消息发送事件转换会话对象
|
||||
CreateMap<MessageCreatedEvent, Conversation>()
|
||||
//.ForMember(dest => dest.LastReadMessageId, opt => opt.MapFrom(src => src.MessageId))
|
||||
.ForMember(dest => dest.LastMessage, opt => opt.MapFrom(src => src.MessageContent))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.MsgSenderId))
|
||||
.ForMember(dest => dest.TargetId, opt => opt.MapFrom(src => src.MsgRecipientId))
|
||||
.ForMember(dest => dest.UnreadCount, opt => opt.MapFrom(src => 0))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
.ForMember(dest => dest.LastMessageTime, opt => opt.MapFrom(src => DateTime.Now))
|
||||
;
|
||||
|
||||
//创建会话对象
|
||||
CreateMap<Conversation, ConversationVo>()
|
||||
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
|
||||
.ForMember(dest => dest.LastMessage, opt => opt.MapFrom(src => src.LastMessage))
|
||||
.ForMember(dest => dest.LastSequenceId, opt => opt.MapFrom(src => src.LastReadSequenceId))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.DateTime, opt => opt.MapFrom(src => src.LastMessageTime))
|
||||
.ForMember(dest => dest.TargetId, opt => opt.MapFrom(src => src.TargetId))
|
||||
.ForMember(dest => dest.UnreadCount, opt => opt.MapFrom(src => src.UnreadCount))
|
||||
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.UserId));
|
||||
|
||||
CreateMap<Friend, ConversationVo>()
|
||||
.ForMember(dest => dest.TargetAvatar, opt => opt.MapFrom(src => src.FriendNavigation.Avatar))
|
||||
.ForMember(dest => dest.TargetName, opt => opt.MapFrom(src => src.RemarkName));
|
||||
|
||||
CreateMap<Group, ConversationVo>()
|
||||
.ForMember(dest => dest.TargetAvatar, opt => opt.MapFrom(src => src.Avatar))
|
||||
.ForMember(dest => dest.TargetName, opt => opt.MapFrom(src => src.Name));
|
||||
|
||||
|
||||
//群模型转换
|
||||
CreateMap<Group, GroupInfoDto>()
|
||||
.ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusEnum))
|
||||
.ForMember(dest => dest.AllMembersBanned, opt => opt.MapFrom(src => src.AllMembersBannedEnum))
|
||||
.ForMember(dest => dest.Auhority, opt => opt.MapFrom(src => src.AuhorityEnum));
|
||||
|
||||
CreateMap<GroupCreateDto, Group>()
|
||||
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
|
||||
.ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.Avatar))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.AllMembersBannedEnum, opt => opt.MapFrom(src => GroupAllMembersBanned.ALLOWED))
|
||||
.ForMember(dest => dest.AuhorityEnum, opt => opt.MapFrom(src => GroupAuhority.REQUIRE_CONSENT))
|
||||
.ForMember(dest => dest.StatusEnum, opt => opt.MapFrom(src => GroupStatus.Normal))
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
using AutoMapper;
|
||||
using IM_API.Domain.Events;
|
||||
using IM_API.Dtos;
|
||||
using IM_API.Dtos.Auth;
|
||||
using IM_API.Dtos.Friend;
|
||||
using IM_API.Dtos.Group;
|
||||
using IM_API.Dtos.User;
|
||||
using IM_API.Models;
|
||||
using IM_API.Tools;
|
||||
using IM_API.VOs.Conversation;
|
||||
using IM_API.VOs.Message;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public class MapperConfig:Profile
|
||||
{
|
||||
public MapperConfig()
|
||||
{
|
||||
CreateMap<User, UserInfoDto>();
|
||||
//用户信息更新模型转换
|
||||
CreateMap<UpdateUserDto, User>()
|
||||
.ForMember(dest => dest.Updated,opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForAllMembers(opts => opts.Condition((src,dest,srcMember) => srcMember != null));
|
||||
//用户注册模型转换
|
||||
CreateMap<RegisterRequestDto, User>()
|
||||
.ForMember(dest => dest.Username,opt => opt.MapFrom(src => src.Username))
|
||||
.ForMember(dest => dest.Password,opt => opt.MapFrom(src => src.Password))
|
||||
.ForMember(dest => dest.Avatar,opt => opt.MapFrom(src => "https://ts1.tc.mm.bing.net/th/id/OIP-C.dl0WpkTP6E2J4FnhDC_jHwAAAA?rs=1&pid=ImgDetMain&o=7&rm=3"))
|
||||
.ForMember(dest => dest.StatusEnum,opt => opt.MapFrom(src => UserStatus.Normal))
|
||||
.ForMember(dest => dest.OnlineStatusEnum,opt => opt.MapFrom(src => UserOnlineStatus.Offline))
|
||||
.ForMember(dest => dest.NickName,opt => opt.MapFrom(src => src.NickName??"默认用户"))
|
||||
.ForMember(dest => dest.Created,opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.IsDeleted,opt => opt.MapFrom(src => 0))
|
||||
;
|
||||
//好友信息模型转换
|
||||
CreateMap<Friend, FriendInfoDto>()
|
||||
.ForMember(dest => dest.UserInfo, opt => opt.MapFrom(src => src.FriendNavigation))
|
||||
.ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.FriendNavigation.Avatar))
|
||||
;
|
||||
//好友请求通过后新增好友关系
|
||||
CreateMap<FriendRequestDto, Friend>()
|
||||
.ForMember(dest => dest.UserId , opt => opt.MapFrom(src => src.FromUserId))
|
||||
.ForMember(dest => dest.FriendId , opt => opt.MapFrom(src => src.ToUserId))
|
||||
.ForMember(dest => dest.StatusEnum , opt =>opt.MapFrom(src => FriendStatus.Pending))
|
||||
.ForMember(dest => dest.RemarkName , opt => opt.MapFrom(src => src.RemarkName))
|
||||
.ForMember(dest => dest.Created , opt => opt.MapFrom(src => DateTime.Now))
|
||||
;
|
||||
//发起好友请求转换请求对象
|
||||
CreateMap<FriendRequestDto, FriendRequest>()
|
||||
.ForMember(dest => dest.RequestUser , opt => opt.MapFrom(src => src.FromUserId))
|
||||
.ForMember(dest => dest.ResponseUser , opt => opt.MapFrom(src => src.ToUserId))
|
||||
.ForMember(dest => dest.Created , opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.StateEnum , opt => opt.MapFrom(src => FriendRequestState.Pending))
|
||||
.ForMember(dest => dest.Description , opt => opt.MapFrom(src => src.Description))
|
||||
;
|
||||
|
||||
CreateMap<FriendRequest, FriendRequestDto>()
|
||||
.ForMember(dest => dest.ToUserId, opt => opt.MapFrom(src => src.ResponseUser))
|
||||
.ForMember(dest => dest.FromUserId, opt => opt.MapFrom(src => src.RequestUser))
|
||||
.ForMember(dest => dest.RemarkName, opt => opt.MapFrom(src => src.RemarkName))
|
||||
.ForMember(dest => dest.Description, opt => opt.MapFrom(src => src.Description))
|
||||
;
|
||||
//消息模型转换
|
||||
CreateMap<Message, MessageBaseVo>()
|
||||
.ForMember(dest => dest.Type , opt => opt.MapFrom(src => src.MsgTypeEnum))
|
||||
.ForMember(dest => dest.MsgId , opt => opt.MapFrom(src => src.ClientMsgId))
|
||||
.ForMember(dest => dest.SenderId , opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.ChatType , opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.ReceiverId, opt => opt.MapFrom(src => src.Recipient))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.TimeStamp, opt => opt.MapFrom(src => src.Created))
|
||||
.ForMember(dest => dest.SequenceId, opt => opt.MapFrom(src => src.SequenceId))
|
||||
;
|
||||
CreateMap<MessageBaseDto, Message>()
|
||||
.ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.SenderId))
|
||||
.ForMember(dest => dest.ChatTypeEnum,opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.MsgTypeEnum, opt => opt.MapFrom(src => src.Type))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => src.TimeStamp))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.Recipient, opt => opt.MapFrom(src => src.ReceiverId))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.Ignore() )
|
||||
.ForMember(dest => dest.StateEnum, opt => opt.MapFrom(src => MessageState.Sent))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.MsgType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ClientMsgId, opt => opt.MapFrom(src => src.MsgId))
|
||||
;
|
||||
|
||||
//会话对象深拷贝
|
||||
CreateMap<Conversation, Conversation>()
|
||||
.ForMember(dest => dest.Id, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.UserId, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.TargetId, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.Ignore())
|
||||
;
|
||||
|
||||
//消息对象转消息创建事件对象
|
||||
CreateMap<Message, MessageCreatedEvent>()
|
||||
.ForMember(dest => dest.MessageMsgType, opt => opt.MapFrom(src => src.MsgTypeEnum))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.MessageContent, opt => opt.MapFrom(src => src.Content))
|
||||
.ForMember(dest => dest.State, opt => opt.MapFrom(src => src.StateEnum))
|
||||
.ForMember(dest => dest.MessageCreated, opt => opt.MapFrom(src => src.Created))
|
||||
.ForMember(dest => dest.MsgRecipientId, opt => opt.MapFrom(src => src.Recipient))
|
||||
.ForMember(dest => dest.MsgSenderId, opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.EventId, opt => opt.MapFrom(src => Guid.NewGuid()))
|
||||
.ForMember(dest => dest.AggregateId, opt => opt.MapFrom(src => src.Sender.ToString()))
|
||||
.ForMember(dest => dest.OccurredAt , opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.OperatorId, opt => opt.MapFrom(src => src.Sender))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
;
|
||||
|
||||
CreateMap<MessageCreatedEvent, Message>()
|
||||
.ForMember(dest => dest.SequenceId, opt => opt.MapFrom(src => src.SequenceId))
|
||||
.ForMember(dest => dest.ClientMsgId, opt => opt.MapFrom(src => src.ClientMsgId))
|
||||
.ForMember(dest => dest.StateEnum, opt => opt.MapFrom(src => src.State))
|
||||
.ForMember(dest => dest.ChatTypeEnum, opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => src.MessageContent))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => src.MessageCreated))
|
||||
.ForMember(dest => dest.MsgTypeEnum, opt => opt.MapFrom(src => src.MessageMsgType))
|
||||
.ForMember(dest => dest.Recipient, opt => opt.MapFrom(src => src.MsgRecipientId))
|
||||
.ForMember(dest => dest.Sender, opt => opt.MapFrom(src => src.MsgSenderId))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.State, opt => opt.Ignore())
|
||||
.ForMember(dest => dest.MsgType, opt => opt.Ignore());
|
||||
|
||||
//消息发送事件转换会话对象
|
||||
CreateMap<MessageCreatedEvent, Conversation>()
|
||||
//.ForMember(dest => dest.LastReadMessageId, opt => opt.MapFrom(src => src.MessageId))
|
||||
.ForMember(dest => dest.LastMessage, opt => opt.MapFrom(src => src.MessageContent))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatType))
|
||||
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.MsgSenderId))
|
||||
.ForMember(dest => dest.TargetId, opt => opt.MapFrom(src => src.MsgRecipientId))
|
||||
.ForMember(dest => dest.UnreadCount, opt => opt.MapFrom(src => 0))
|
||||
.ForMember(dest => dest.StreamKey, opt => opt.MapFrom(src => src.StreamKey))
|
||||
.ForMember(dest => dest.LastMessageTime, opt => opt.MapFrom(src => DateTime.Now))
|
||||
;
|
||||
|
||||
//创建会话对象
|
||||
CreateMap<Conversation, ConversationVo>()
|
||||
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
|
||||
.ForMember(dest => dest.LastMessage, opt => opt.MapFrom(src => src.LastMessage))
|
||||
.ForMember(dest => dest.LastSequenceId, opt => opt.MapFrom(src => src.LastReadSequenceId))
|
||||
.ForMember(dest => dest.ChatType, opt => opt.MapFrom(src => src.ChatTypeEnum))
|
||||
.ForMember(dest => dest.DateTime, opt => opt.MapFrom(src => src.LastMessageTime))
|
||||
.ForMember(dest => dest.TargetId, opt => opt.MapFrom(src => src.TargetId))
|
||||
.ForMember(dest => dest.UnreadCount, opt => opt.MapFrom(src => src.UnreadCount))
|
||||
.ForMember(dest => dest.UserId, opt => opt.MapFrom(src => src.UserId));
|
||||
|
||||
CreateMap<Friend, ConversationVo>()
|
||||
.ForMember(dest => dest.TargetAvatar, opt => opt.MapFrom(src => src.FriendNavigation.Avatar))
|
||||
.ForMember(dest => dest.TargetName, opt => opt.MapFrom(src => src.RemarkName));
|
||||
|
||||
CreateMap<Group, ConversationVo>()
|
||||
.ForMember(dest => dest.TargetAvatar, opt => opt.MapFrom(src => src.Avatar))
|
||||
.ForMember(dest => dest.TargetName, opt => opt.MapFrom(src => src.Name));
|
||||
|
||||
|
||||
//群模型转换
|
||||
CreateMap<Group, GroupInfoDto>()
|
||||
.ForMember(dest => dest.Status, opt => opt.MapFrom(src => src.StatusEnum))
|
||||
.ForMember(dest => dest.AllMembersBanned, opt => opt.MapFrom(src => src.AllMembersBannedEnum))
|
||||
.ForMember(dest => dest.Auhority, opt => opt.MapFrom(src => src.AuhorityEnum));
|
||||
|
||||
CreateMap<GroupCreateDto, Group>()
|
||||
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name))
|
||||
.ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.Avatar))
|
||||
.ForMember(dest => dest.Created, opt => opt.MapFrom(src => DateTime.Now))
|
||||
.ForMember(dest => dest.AllMembersBannedEnum, opt => opt.MapFrom(src => GroupAllMembersBanned.ALLOWED))
|
||||
.ForMember(dest => dest.AuhorityEnum, opt => opt.MapFrom(src => GroupAuhority.REQUIRE_CONSENT))
|
||||
.ForMember(dest => dest.StatusEnum, opt => opt.MapFrom(src => GroupStatus.Normal))
|
||||
;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
namespace IM_API.Configs.Options
|
||||
{
|
||||
public class ConnectionOptions
|
||||
{
|
||||
public string DefaultConnection { get; set; }
|
||||
public string Redis { get; set; }
|
||||
}
|
||||
}
|
||||
namespace IM_API.Configs.Options
|
||||
{
|
||||
public class ConnectionOptions
|
||||
{
|
||||
public string DefaultConnection { get; set; }
|
||||
public string Redis { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
namespace IM_API.Configs.Options
|
||||
{
|
||||
public class RabbitMQOptions
|
||||
{
|
||||
public string Host { get; set; }
|
||||
public int Port { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
}
|
||||
}
|
||||
namespace IM_API.Configs.Options
|
||||
{
|
||||
public class RabbitMQOptions
|
||||
{
|
||||
public string Host { get; set; }
|
||||
public int Port { get; set; }
|
||||
public string Username { get; set; }
|
||||
public string Password { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,64 +1,64 @@
|
||||
using IM_API.Application.EventHandlers;
|
||||
using IM_API.Application.Interfaces;
|
||||
using IM_API.Domain.Events;
|
||||
using IM_API.Dtos;
|
||||
using IM_API.Infrastructure.EventBus;
|
||||
using IM_API.Interface.Services;
|
||||
using IM_API.Services;
|
||||
using IM_API.Tools;
|
||||
using Microsoft.AspNetCore.Http.HttpResults;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using RedLockNet;
|
||||
using RedLockNet.SERedis;
|
||||
using RedLockNet.SERedis.Configuration;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
public static IServiceCollection AddAllService(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
|
||||
services.AddAutoMapper(typeof(MapperConfig));
|
||||
services.AddScoped<IAuthService, AuthService>();
|
||||
services.AddScoped<IUserService, UserService>();
|
||||
services.AddScoped<IFriendSerivce, FriendService>();
|
||||
services.AddScoped<IMessageSevice, MessageService>();
|
||||
services.AddScoped<IConversationService, ConversationService>();
|
||||
services.AddScoped<IGroupService, GroupService>();
|
||||
services.AddScoped<ISequenceIdService, SequenceIdService>();
|
||||
services.AddScoped<ICacheService, RedisCacheService>();
|
||||
services.AddScoped<IEventBus, InMemoryEventBus>();
|
||||
services.AddSingleton<IJWTService, JWTService>();
|
||||
services.AddSingleton<IRefreshTokenService, RedisRefreshTokenService>();
|
||||
services.AddSingleton<IDistributedLockFactory>(sp =>
|
||||
{
|
||||
var connection = sp.GetRequiredService<IConnectionMultiplexer>();
|
||||
// 这里可以配置多个 Redis 节点提高安全性,单机运行传一个即可
|
||||
return RedLockFactory.Create(new List<RedLockMultiplexer> { new RedLockMultiplexer(connection) });
|
||||
});
|
||||
return services;
|
||||
}
|
||||
public static IServiceCollection AddModelValidation(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
services.Configure<ApiBehaviorOptions>(options =>
|
||||
{
|
||||
options.InvalidModelStateResponseFactory = context =>
|
||||
{
|
||||
var errors = context.ModelState
|
||||
.Where(e => e.Value.Errors.Count > 0)
|
||||
.Select(e => new
|
||||
{
|
||||
Field = e.Key,
|
||||
Message = e.Value.Errors.First().ErrorMessage
|
||||
});
|
||||
Console.WriteLine(errors);
|
||||
return new BadRequestObjectResult(new BaseResponse<object?>(CodeDefine.PARAMETER_ERROR.Code, errors.First().Message));
|
||||
};
|
||||
});
|
||||
return services;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
using IM_API.Application.EventHandlers;
|
||||
using IM_API.Application.Interfaces;
|
||||
using IM_API.Domain.Events;
|
||||
using IM_API.Dtos;
|
||||
using IM_API.Infrastructure.EventBus;
|
||||
using IM_API.Interface.Services;
|
||||
using IM_API.Services;
|
||||
using IM_API.Tools;
|
||||
using Microsoft.AspNetCore.Http.HttpResults;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using RedLockNet;
|
||||
using RedLockNet.SERedis;
|
||||
using RedLockNet.SERedis.Configuration;
|
||||
using StackExchange.Redis;
|
||||
|
||||
namespace IM_API.Configs
|
||||
{
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
public static IServiceCollection AddAllService(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
|
||||
services.AddAutoMapper(typeof(MapperConfig));
|
||||
services.AddScoped<IAuthService, AuthService>();
|
||||
services.AddScoped<IUserService, UserService>();
|
||||
services.AddScoped<IFriendSerivce, FriendService>();
|
||||
services.AddScoped<IMessageSevice, MessageService>();
|
||||
services.AddScoped<IConversationService, ConversationService>();
|
||||
services.AddScoped<IGroupService, GroupService>();
|
||||
services.AddScoped<ISequenceIdService, SequenceIdService>();
|
||||
services.AddScoped<ICacheService, RedisCacheService>();
|
||||
services.AddScoped<IEventBus, InMemoryEventBus>();
|
||||
services.AddSingleton<IJWTService, JWTService>();
|
||||
services.AddSingleton<IRefreshTokenService, RedisRefreshTokenService>();
|
||||
services.AddSingleton<IDistributedLockFactory>(sp =>
|
||||
{
|
||||
var connection = sp.GetRequiredService<IConnectionMultiplexer>();
|
||||
// 这里可以配置多个 Redis 节点提高安全性,单机运行传一个即可
|
||||
return RedLockFactory.Create(new List<RedLockMultiplexer> { new RedLockMultiplexer(connection) });
|
||||
});
|
||||
return services;
|
||||
}
|
||||
public static IServiceCollection AddModelValidation(this IServiceCollection services, IConfiguration configuration)
|
||||
{
|
||||
services.Configure<ApiBehaviorOptions>(options =>
|
||||
{
|
||||
options.InvalidModelStateResponseFactory = context =>
|
||||
{
|
||||
var errors = context.ModelState
|
||||
.Where(e => e.Value.Errors.Count > 0)
|
||||
.Select(e => new
|
||||
{
|
||||
Field = e.Key,
|
||||
Message = e.Value.Errors.First().ErrorMessage
|
||||
});
|
||||
Console.WriteLine(errors);
|
||||
return new BadRequestObjectResult(new BaseResponse<object?>(CodeDefine.PARAMETER_ERROR.Code, errors.First().Message));
|
||||
};
|
||||
});
|
||||
return services;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user