diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs index 84a6559ad..3d1d255b8 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs @@ -7,6 +7,7 @@ using Microsoft.Extensions.Logging; using System; using System.Threading.Tasks; using Volo.Abp.Application.Dtos; +using Volo.Abp.Users; namespace LINGYUN.Abp.IM.SignalR.Hubs { @@ -39,22 +40,49 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs return new PagedResultDto(myFrientCount, lastContractFriends); } - [HubMethodName("MyFriends")] - public virtual async Task> GetMyFriendsAsync( - Guid? tenantId, + [HubMethodName("MyLastChatMessages")] + public virtual async Task> GetMyLastChatMessagesAsync( + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, + int maxResultCount = 10) + { + return await GetLastChatMessagesAsync(CurrentUser.GetId(), sorting, reverse, maxResultCount); + } + + + [HubMethodName("LastChatMessages")] + public virtual async Task> GetLastChatMessagesAsync( Guid userId, - string filter = "", - string sorting = nameof(UserFriend.UserId), - bool reverse = false, - int skipCount = 0, + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, int maxResultCount = 10) { - var myFrientCount = await FriendStore.GetCountAsync(tenantId, userId); + var messages = await MessageStore + .GetLastChatMessagesAsync( + CurrentTenant.Id, userId, sorting, reverse, maxResultCount); - var myFriends = await FriendStore - .GetListAsync(tenantId, userId, filter, sorting, reverse, skipCount, maxResultCount); + return new ListResultDto(messages); + } + + [HubMethodName("MyFriends")] + public virtual async Task> GetMyFriendsAsync( + string sorting = nameof(UserFriend.RemarkName), + bool reverse = false) + { + return await GetAllFriendsAsync(CurrentUser.GetId(), sorting, reverse); + } + + + [HubMethodName("AllFriends")] + public virtual async Task> GetAllFriendsAsync( + Guid userId, + string sorting = nameof(UserFriend.RemarkName), + bool reverse = false) + { + var userFriends = await FriendStore + .GetListAsync(CurrentTenant.Id, userId, sorting, reverse); - return new PagedResultDto(myFrientCount, myFriends); + return new ListResultDto(userFriends); } [HubMethodName("AddFriend")] diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs index 102fc7ef3..98722ee80 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/IFriendStore.cs @@ -7,6 +7,20 @@ namespace LINGYUN.Abp.IM.Contract public interface IFriendStore { /// + /// 查询好友列表 + /// + /// + /// + /// + /// + /// + Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + bool reverse = false + ); + /// /// 获取好友数量 /// /// diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriend.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriend.cs index 394ba4634..67d37cbe2 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriend.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriend.cs @@ -24,5 +24,23 @@ namespace LINGYUN.Abp.IM.Contract /// 备注名称 /// public string RemarkName { get; set; } + + public override int GetHashCode() + { + return FriendId.GetHashCode(); + } + + public override bool Equals(object obj) + { + if (obj == null) + { + return false; + } + if (obj is UserFriend friend) + { + return friend.FriendId.Equals(FriendId); + } + return false; + } } } diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendGroup.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendGroup.cs new file mode 100644 index 000000000..f249f7a7a --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Contract/UserFriendGroup.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace LINGYUN.Abp.IM.Contract +{ + public class UserFriendGroup + { + public Guid? TenantId { get; set; } + public string DisplayName { get; set; } + public List UserFriends { get; set; } = new List(); + + public void AddFriend(UserFriend friend) + { + UserFriends.AddIfNotContains(friend); + } + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs index 8cdbf63ac..81ac75b7f 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs @@ -49,6 +49,22 @@ namespace LINGYUN.Abp.IM.Messages int skipCount = 0, int maxResultCount = 10); /// + /// 获取上一次通讯消息记录 + /// + /// + /// + /// + /// + /// + /// + Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, + int maxResultCount = 10 + ); + /// /// 获取与某个用户的聊天记录总数 /// /// diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/LastChatMessage.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/LastChatMessage.cs new file mode 100644 index 000000000..d0b193259 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/LastChatMessage.cs @@ -0,0 +1,9 @@ +namespace LINGYUN.Abp.IM.Messages +{ + /// + /// 上一次通讯消息 + /// + public class LastChatMessage : ChatMessage + { + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs new file mode 100644 index 000000000..25799aa99 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetMyFriendsDto.cs @@ -0,0 +1,10 @@ +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetMyFriendsDto : ISortedResultRequest + { + public string Sorting { get; set; } + public bool Reverse { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs new file mode 100644 index 000000000..6c9382eaf --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs @@ -0,0 +1,11 @@ +using Volo.Abp.Application.Dtos; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class GetUserLastMessageDto : ILimitedResultRequest, ISortedResultRequest + { + public int MaxResultCount { get; set; } + public string Sorting { get; set; } + public bool Reverse { get; set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs index befeb27ad..f49837302 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs @@ -11,15 +11,15 @@ namespace LINGYUN.Abp.MessageService.Chat /// /// 发送消息 /// - /// + /// /// - Task SendMessageAsync(ChatMessage chatMessage); + Task SendMessageAsync(ChatMessage input); /// /// 申请加入群组 /// - /// + /// /// - Task ApplyJoinGroupAsync(UserJoinGroupDto userJoinGroup); + Task ApplyJoinGroupAsync(UserJoinGroupDto input); /// /// 获取我的群组 /// @@ -28,34 +28,39 @@ namespace LINGYUN.Abp.MessageService.Chat /// /// 获取群组用户 /// - /// + /// /// - Task> GetGroupUsersAsync(GroupUserGetByPagedDto groupUserGetByPaged); + Task> GetGroupUsersAsync(GroupUserGetByPagedDto input); /// /// 处理用户群组申请 /// - /// + /// /// - Task GroupAcceptUserAsync(GroupAcceptUserDto groupAcceptUser); + Task GroupAcceptUserAsync(GroupAcceptUserDto input); /// /// 群组移除用户 /// - /// + /// /// - Task GroupRemoveUserAsync(GroupRemoveUserDto groupRemoveUser); + Task GroupRemoveUserAsync(GroupRemoveUserDto input); /// /// 获取群组消息 /// - /// + /// /// - Task> GetGroupMessageAsync(GroupMessageGetByPagedDto groupMessageGetByPaged); + Task> GetGroupMessageAsync(GroupMessageGetByPagedDto input); /// /// 获取我的消息 /// - /// + /// /// - Task> GetMyChatMessageAsync(UserMessageGetByPagedDto userMessageGetByPaged); - + Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input); + /// + /// 获取我最近的消息 + /// + /// + /// + Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input); //TOTO: 还应该有获取我的未读消息 获取我的未读群组消息 } } diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs index 58c3c7c4c..a220d5ee3 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs @@ -7,9 +7,9 @@ namespace LINGYUN.Abp.MessageService.Chat { public interface IMyFriendAppService : IApplicationService { - Task> GetMyFriendsAsync(MyFriendGetByPagedDto input); + Task> GetListAsync(MyFriendGetByPagedDto input); - Task> GetLastContactFriendsAsync(PagedResultRequestDto input); + Task> GetAllListAsync(GetMyFriendsDto input); Task CreateAsync(MyFriendCreateDto input); diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs index e5c509afd..f3434c2f0 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs @@ -27,44 +27,53 @@ namespace LINGYUN.Abp.MessageService.Chat } [Authorize] - public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto userMessageGetByPaged) + public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) { var chatMessageCount = await _messageStore - .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), userMessageGetByPaged.ReceiveUserId, - userMessageGetByPaged.Filter, userMessageGetByPaged.MessageType); + .GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.MessageType); var chatMessages = await _messageStore - .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), userMessageGetByPaged.ReceiveUserId, - userMessageGetByPaged.Filter, userMessageGetByPaged.Sorting, userMessageGetByPaged.Reverse, - userMessageGetByPaged.MessageType, userMessageGetByPaged.SkipCount, userMessageGetByPaged.MaxResultCount); + .GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId, + input.Filter, input.Sorting, input.Reverse, + input.MessageType, input.SkipCount, input.MaxResultCount); return new PagedResultDto(chatMessageCount, chatMessages); } - public virtual async Task> GetGroupMessageAsync(GroupMessageGetByPagedDto groupMessageGetByPaged) + public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) + { + var chatMessages = await _messageStore + .GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Sorting, input.Reverse, input.MaxResultCount); + + return new ListResultDto(chatMessages); + } + + public virtual async Task> GetGroupMessageAsync(GroupMessageGetByPagedDto input) { // TODO: 增加验证,用户不在群组却来查询这个群组消息,是非法客户端操作 var groupMessageCount = await _messageStore - .GetGroupMessageCountAsync(CurrentTenant.Id, groupMessageGetByPaged.GroupId, - groupMessageGetByPaged.Filter, groupMessageGetByPaged.MessageType); + .GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.MessageType); var groupMessages = await _messageStore - .GetGroupMessageAsync(CurrentTenant.Id, groupMessageGetByPaged.GroupId, - groupMessageGetByPaged.Filter, groupMessageGetByPaged.Sorting, groupMessageGetByPaged.Reverse, - groupMessageGetByPaged.MessageType, groupMessageGetByPaged.SkipCount, groupMessageGetByPaged.MaxResultCount); + .GetGroupMessageAsync(CurrentTenant.Id, input.GroupId, + input.Filter, input.Sorting, input.Reverse, + input.MessageType, input.SkipCount, input.MaxResultCount); return new PagedResultDto(groupMessageCount, groupMessages); } - public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto groupUserGetByPaged) + public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) { var groupUserCardCount = await _userGroupStore - .GetMembersCountAsync(CurrentTenant.Id, groupUserGetByPaged.GroupId); + .GetMembersCountAsync(CurrentTenant.Id, input.GroupId); var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id, - groupUserGetByPaged.GroupId, groupUserGetByPaged.Sorting, groupUserGetByPaged.Reverse, - groupUserGetByPaged.SkipCount, groupUserGetByPaged.MaxResultCount); + input.GroupId, input.Sorting, input.Reverse, + input.SkipCount, input.MaxResultCount); return new PagedResultDto(groupUserCardCount, groupUserCards); } @@ -77,10 +86,10 @@ namespace LINGYUN.Abp.MessageService.Chat return new ListResultDto(myGroups.ToImmutableList()); } - public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto groupAcceptUser) + public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) { var myGroupCard = await _userGroupStore - .GetUserGroupCardAsync(CurrentTenant.Id, groupAcceptUser.GroupId, CurrentUser.GetId()); + .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); if (myGroupCard == null) { // 当前登录用户不再用户组 @@ -92,13 +101,13 @@ namespace LINGYUN.Abp.MessageService.Chat throw new UserFriendlyException(""); } await _userGroupStore - .AddUserToGroupAsync(CurrentTenant.Id, groupAcceptUser.UserId, groupAcceptUser.GroupId, CurrentUser.GetId()); + .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId()); } - public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto groupRemoveUser) + public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) { var myGroupCard = await _userGroupStore - .GetUserGroupCardAsync(CurrentTenant.Id, groupRemoveUser.GroupId, CurrentUser.GetId()); + .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()); if (myGroupCard == null) { // 当前登录用户不再用户组 @@ -110,20 +119,20 @@ namespace LINGYUN.Abp.MessageService.Chat throw new UserFriendlyException(""); } await _userGroupStore - .RemoveUserFormGroupAsync(CurrentTenant.Id, groupRemoveUser.UserId, groupRemoveUser.GroupId); + .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId); } - public virtual async Task SendMessageAsync(ChatMessage chatMessage) + public virtual async Task SendMessageAsync(ChatMessage input) { // TODO:向其他租户发送消息? - chatMessage.TenantId = chatMessage.TenantId ?? CurrentTenant.Id; + input.TenantId = input.TenantId ?? CurrentTenant.Id; - await MessageSender.SendMessageAsync(chatMessage); + await MessageSender.SendMessageAsync(input); - return new ChatMessageSendResultDto(chatMessage.MessageId); + return new ChatMessageSendResultDto(input.MessageId); } - public virtual Task ApplyJoinGroupAsync(UserJoinGroupDto userJoinGroup) + public virtual Task ApplyJoinGroupAsync(UserJoinGroupDto input) { // TOTO 发送通知? return Task.CompletedTask; diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs index b11ffcda1..d76bb4be7 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs @@ -27,18 +27,16 @@ namespace LINGYUN.Abp.MessageService.Chat await FriendStore.RemoveMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), input.FriendId); } - public virtual async Task> GetLastContactFriendsAsync(PagedResultRequestDto input) + public virtual async Task> GetAllListAsync(GetMyFriendsDto input) { - var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); - var myFriends = await FriendStore - .GetLastContactListAsync(CurrentTenant.Id, CurrentUser.GetId(), - input.SkipCount, input.MaxResultCount); + .GetListAsync(CurrentTenant.Id, CurrentUser.GetId(), + input.Sorting, input.Reverse); - return new PagedResultDto(myFrientCount, myFriends); + return new ListResultDto(myFriends); } - public virtual async Task> GetMyFriendsAsync(MyFriendGetByPagedDto input) + public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) { var myFrientCount = await FriendStore.GetCountAsync(CurrentTenant.Id, CurrentUser.GetId()); diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs index 0ddb5ae88..574b5cd52 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/MessageServiceErrorCodes.cs @@ -5,26 +5,30 @@ /// /// 管理员已开启全员禁言 /// - public const string GroupNotAllowedToSpeak = "Messages:Group:1001"; + public const string GroupNotAllowedToSpeak = "Messages.Group:1001"; /// /// 管理员不允许匿名发言 /// - public const string GroupNotAllowedToSpeakAnonymously = "Messages:Group:1002"; + public const string GroupNotAllowedToSpeakAnonymously = "Messages.Group:1002"; /// /// 管理员已禁止用户发言 /// - public const string GroupUserHasBlack = "Messages:Group:1003"; + public const string GroupUserHasBlack = "Messages.Group:1003"; /// /// 用户已将发信人拉黑 /// - public const string UserHasBlack = "Messages:User:1003"; + public const string UserHasBlack = "Messages.User:1003"; /// /// 用户已拒接所有消息 /// - public const string UserHasRejectAllMessage = "Messages:User:1001"; + public const string UserHasRejectAllMessage = "Messages.User:1001"; /// /// 用户不允许匿名发言 /// - public const string UserNotAllowedToSpeakAnonymously = "Messages:User:1002"; + public const string UserNotAllowedToSpeakAnonymously = "Messages.User:1002"; + /// + /// 已经添加对方为好友 + /// + public const string YouHaveAddedTheUserToFriend = "Messages.UserFriend:1001"; } } diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/AbpMessageServiceDomainModule.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/AbpMessageServiceDomainModule.cs index 60dfe789c..e5006dd94 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/AbpMessageServiceDomainModule.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/AbpMessageServiceDomainModule.cs @@ -34,8 +34,9 @@ namespace LINGYUN.Abp.MessageService Configure(options => { - options.MapCodeNamespace("Messages:Group", typeof(MessageServiceResource)); - options.MapCodeNamespace("Messages:User", typeof(MessageServiceResource)); + options.MapCodeNamespace("Messages.Group", typeof(MessageServiceResource)); + options.MapCodeNamespace("Messages.User", typeof(MessageServiceResource)); + options.MapCodeNamespace("Messages.UserFriend", typeof(MessageServiceResource)); }); } } diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs index e4bd716f7..aee590089 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/FriendStore.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Volo.Abp; using Volo.Abp.Domain.Services; using Volo.Abp.Uow; @@ -22,16 +23,18 @@ namespace LINGYUN.Abp.MessageService.Chat { using (CurrentTenant.Change(tenantId)) { - if (!await UserChatFriendRepository.IsAddedAsync(userId, friendId)) + if (await UserChatFriendRepository.IsAddedAsync(userId, friendId)) { - var userChatFriend = new UserChatFriend(userId, friendId, remarkName, tenantId) - { - CreationTime = Clock.Now, - CreatorId = userId - }; - - await UserChatFriendRepository.InsertAsync(userChatFriend); + throw new BusinessException(MessageServiceErrorCodes.YouHaveAddedTheUserToFriend); + } + var userChatFriend = new UserChatFriend(userId, friendId, remarkName, tenantId) + { + CreationTime = Clock.Now, + CreatorId = userId + }; + + await UserChatFriendRepository.InsertAsync(userChatFriend); } } @@ -41,6 +44,20 @@ namespace LINGYUN.Abp.MessageService.Chat await ChangeFriendShieldAsync(tenantId, userId, friendId, true); } + public virtual async Task> GetListAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(UserFriend.UserId), + bool reverse = false + ) + { + using (CurrentTenant.Change(tenantId)) + { + return await UserChatFriendRepository + .GetAllMembersAsync(userId, sorting, reverse); + } + } + public virtual async Task GetCountAsync(Guid? tenantId, Guid userId, string filter = "") { using (CurrentTenant.Change(tenantId)) diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs index 9c5af2539..095124290 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs @@ -44,6 +44,13 @@ namespace LINGYUN.Abp.MessageService.Chat MessageType? type = null, CancellationToken cancellationToken = default); + Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, + int maxResultCount = 10, + CancellationToken cancellationToken = default); + Task> GetUserMessagesAsync( Guid sendUserId, Guid receiveUserId, diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs index 96cebd7fa..af38f03b5 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatFriendRepository.cs @@ -19,6 +19,12 @@ namespace LINGYUN.Abp.MessageService.Chat Guid friendId, CancellationToken cancellationToken = default); + Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + bool reverse = false, + CancellationToken cancellationToken = default); + Task GetMembersCountAsync( Guid userId, string filter = "", diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs index b11bbc06a..870cfe537 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs @@ -34,7 +34,7 @@ namespace LINGYUN.Abp.MessageService.Chat } [UnitOfWork] - public async Task StoreMessageAsync(ChatMessage chatMessage) + public virtual async Task StoreMessageAsync(ChatMessage chatMessage) { using (var unitOfWork = UnitOfWorkManager.Begin()) { @@ -54,7 +54,7 @@ namespace LINGYUN.Abp.MessageService.Chat } } - public async Task> GetGroupMessageAsync( + public virtual async Task> GetGroupMessageAsync( Guid? tenantId, long groupId, string filter = "", @@ -74,7 +74,7 @@ namespace LINGYUN.Abp.MessageService.Chat } } - public async Task> GetChatMessageAsync( + public virtual async Task> GetChatMessageAsync( Guid? tenantId, Guid sendUserId, Guid receiveUserId, @@ -95,6 +95,21 @@ namespace LINGYUN.Abp.MessageService.Chat } } + public virtual async Task> GetLastChatMessagesAsync( + Guid? tenantId, + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, + int maxResultCount = 10 + ) + { + using (CurrentTenant.Change(tenantId)) + { + return await MessageRepository + .GetLastMessagesByOneFriendAsync(userId, sorting, reverse, maxResultCount); + } + } + public virtual async Task GetGroupMessageCountAsync( Guid? tenantId, long groupId, @@ -130,15 +145,18 @@ namespace LINGYUN.Abp.MessageService.Chat throw new BusinessException(MessageServiceErrorCodes.UserHasBlack); } var userChatSetting = await UserChatSettingRepository.GetByUserIdAsync(chatMessage.ToUserId.Value); - if (!userChatSetting.AllowReceiveMessage) + if (userChatSetting != null) { - // 当前发送的用户不接收消息 - throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); - } - if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) - { - // 当前用户不允许匿名发言 - throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); + if (!userChatSetting.AllowReceiveMessage) + { + // 当前发送的用户不接收消息 + throw new BusinessException(MessageServiceErrorCodes.UserHasRejectAllMessage); + } + if (chatMessage.IsAnonymous && !userChatSetting.AllowAnonymous) + { + // 当前用户不允许匿名发言 + throw new BusinessException(MessageServiceErrorCodes.UserNotAllowedToSpeakAnonymously); + } } var messageId = SnowflakeIdGenerator.Create(); var message = new UserMessage(messageId, chatMessage.FormUserId, chatMessage.FormUserName, chatMessage.Content, chatMessage.MessageType); diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriendGroup.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriendGroup.cs new file mode 100644 index 000000000..622758140 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatFriendGroup.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Volo.Abp.Domain.Entities.Auditing; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.MessageService.Chat +{ + public class UserChatFriendGroup : CreationAuditedEntity, IMultiTenant + { + /// + /// 租户 + /// + public virtual Guid? TenantId { get; protected set; } + /// + /// 用户标识 + /// + public virtual Guid UserId { get; protected set; } + /// + /// 分组标识 + /// + public virtual long GroupId { get; protected set; } + /// + /// 显示名称 + /// + public virtual string DisplayName { get; protected set; } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/en.json b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/en.json index 4571524e1..5ff282bdb 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/en.json +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/en.json @@ -1,12 +1,13 @@ { "culture": "en", "texts": { - "Messages:Group:1001": "The current group is not allowed to speak", - "Messages:Group:1002": "The current group is not allowed to speak anonymously", - "Messages:Group:1003": "The administrator has banned you from speaking!", - "Messages:User:1001": "Users do not receive anonymous comments!", - "Messages:User:1002": "The user has rejected all messages!", - "Messages:User:1003": "The user rejects the message you sent!", + "Messages.Group:1001": "The current group is not allowed to speak", + "Messages.Group:1002": "The current group is not allowed to speak anonymously", + "Messages.Group:1003": "The administrator has banned you from speaking!", + "Messages.User:1001": "Users do not receive anonymous comments!", + "Messages.User:1002": "The user has rejected all messages!", + "Messages.User:1003": "The user rejects the message you sent!", + "Messages.UserFriend:1001": "You have added each other as friends, can not be repeated!", "WelcomeToApplicationNotification": "User Welcome Notice", "NewTenantRegisterdNotification": "Tenants create notification", "WelcomeToApplicationFormUser": "User :{0} welcome to join us!" diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/zh-Hans.json b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/zh-Hans.json index bfc60566f..76b653478 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Localization/Resources/zh-Hans.json @@ -1,12 +1,13 @@ { "culture": "zh-Hans", "texts": { - "Messages:Group:1001": "管理员已开启全员禁言!", - "Messages:Group:1002": "管理员不允许匿名发言!", - "Messages:Group:1003": "管理员已禁止您发言!", - "Messages:User:1001": "用户不接收匿名发言!", - "Messages:User:1002": "用户已拒接所有消息!", - "Messages:User:1003": "用户拒绝您发送的消息!", + "Messages.Group:1001": "管理员已开启全员禁言!", + "Messages.Group:1002": "管理员不允许匿名发言!", + "Messages.Group:1003": "管理员已禁止您发言!", + "Messages.User:1001": "用户不接收匿名发言!", + "Messages.User:1002": "用户已拒接所有消息!", + "Messages.User:1003": "用户拒绝您发送的消息!", + "Messages.UserFriend:1001": "您已经添加对方为好友,不能重复添加!", "WelcomeToApplicationNotification": "用户欢迎通知", "NewTenantRegisterdNotification": "租户创建通知", "WelcomeToApplicationFormUser": "用户:{0} 欢迎您的加入!" diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs index 4be5af133..8afedf49d 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs @@ -54,6 +54,17 @@ namespace LINGYUN.Abp.MessageService.Mapper .ForMember(dto => dto.MessageType, map => map.MapFrom(src => src.Type)) .ForMember(dto => dto.IsAnonymous, map => map.Ignore()) .ForMember(dto => dto.GroupId, map => map.Ignore()); + + CreateMap() + .ForMember(dto => dto.Content, map => map.MapFrom(src => src.Content)) + .ForMember(dto => dto.ToUserId, map => map.MapFrom(src => src.ReceiveUserId)) + .ForMember(dto => dto.MessageId, map => map.MapFrom(src => src.MessageId.ToString())) + .ForMember(dto => dto.FormUserId, map => map.MapFrom(src => src.CreatorId)) + .ForMember(dto => dto.FormUserName, map => map.MapFrom(src => src.SendUserName)) + .ForMember(dto => dto.SendTime, map => map.MapFrom(src => src.CreationTime)) + .ForMember(dto => dto.MessageType, map => map.MapFrom(src => src.Type)) + .ForMember(dto => dto.IsAnonymous, map => map.Ignore()) + .ForMember(dto => dto.GroupId, map => map.Ignore()); } } } diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs index 939c0ed1b..f57f907fa 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs @@ -132,7 +132,8 @@ namespace LINGYUN.Abp.MessageService.Chat CancellationToken cancellationToken = default) { return await DbContext.Set() - .Where(x => x.ReceiveUserId.Equals(receiveUserId) && x.CreatorId.Equals(sendUserId)) + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || + x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) .WhereIf(type != null, x => x.Type.Equals(type)) .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) .LongCountAsync(GetCancellationToken(cancellationToken)); @@ -148,6 +149,46 @@ namespace LINGYUN.Abp.MessageService.Chat .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } + public virtual async Task> GetLastMessagesByOneFriendAsync( + Guid userId, + string sorting = nameof(LastChatMessage.SendTime), + bool reverse = true, + int maxResultCount = 10, + CancellationToken cancellationToken = default) + { + sorting ??= nameof(LastChatMessage.SendTime); + sorting = reverse ? sorting + " DESC" : sorting; + + var groupMsgQuery = DbContext.Set() + .Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId) + .GroupBy(msg => msg.CreatorId) + .Select(msg => new + { + msg.Key, + MessageId = msg.Max(x => x.MessageId) + }); + + var userMessageQuery = from msg in DbContext.Set() + join gMsg in groupMsgQuery + on msg.MessageId equals gMsg.MessageId + select new LastChatMessage + { + Content = msg.Content, + SendTime = msg.CreationTime, + FormUserId = msg.CreatorId.Value, + FormUserName = msg.SendUserName, + MessageId = msg.MessageId.ToString(), + MessageType = msg.Type, + TenantId = msg.TenantId, + ToUserId = msg.ReceiveUserId + }; + + return await userMessageQuery + .OrderBy(sorting) + .Take(maxResultCount) + .ToListAsync(GetCancellationToken(cancellationToken)); + } + public virtual async Task> GetUserMessagesAsync( Guid sendUserId, Guid receiveUserId, @@ -159,13 +200,14 @@ namespace LINGYUN.Abp.MessageService.Chat int maxResultCount = 10, CancellationToken cancellationToken = default) { + sorting ??= nameof(UserMessage.MessageId); sorting = reverse ? sorting + " desc" : sorting; var userMessages = await DbContext.Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) | + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) .WhereIf(type != null, x => x.Type.Equals(type)) .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) - .OrderBy(sorting ?? nameof(GroupMessage.MessageId)) + .OrderBy(sorting) .PageBy(skipCount, maxResultCount) .AsNoTracking() .ToListAsync(GetCancellationToken(cancellationToken)); @@ -181,7 +223,7 @@ namespace LINGYUN.Abp.MessageService.Chat CancellationToken cancellationToken = default) { var userMessagesCount = await DbContext.Set() - .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) | + .Where(x => (x.CreatorId.Equals(sendUserId) && x.ReceiveUserId.Equals(receiveUserId)) || x.CreatorId.Equals(receiveUserId) && x.ReceiveUserId.Equals(sendUserId)) .WhereIf(type != null, x => x.Type.Equals(type)) .WhereIf(!filter.IsNullOrWhiteSpace(), x => x.Content.Contains(filter) || x.SendUserName.Contains(filter)) diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs index a656d9977..b3da8b1f7 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs @@ -27,6 +27,41 @@ namespace LINGYUN.Abp.MessageService.Chat .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); } + public virtual async Task> GetAllMembersAsync( + Guid userId, + string sorting = nameof(UserChatFriend.RemarkName), + bool reverse = false, + CancellationToken cancellationToken = default) + { + sorting = reverse ? sorting + " DESC" : sorting; + var userFriendQuery = from ucf in DbContext.Set() + join ucc in DbContext.Set() + on ucf.FrientId equals ucc.UserId + where ucf.UserId == userId + select new UserFriend + { + Age = ucc.Age, + AvatarUrl = ucc.AvatarUrl, + Birthday = ucc.Birthday, + Black = ucf.Black, + Description = ucc.Description, + DontDisturb = ucf.DontDisturb, + FriendId = ucf.FrientId, + NickName = ucc.NickName, + RemarkName = ucf.RemarkName ?? ucc.NickName, + Sex = ucc.Sex, + Sign = ucc.Sign, + SpecialFocus = ucf.SpecialFocus, + TenantId = ucf.TenantId, + UserId = ucf.UserId, + UserName = ucc.UserName + }; + + return await userFriendQuery + .OrderBy(sorting ?? $"{nameof(UserChatFriend.RemarkName)} DESC") + .ToListAsync(GetCancellationToken(cancellationToken)); + } + public virtual async Task GetMemberAsync(Guid userId, Guid friendId, CancellationToken cancellationToken = default) { var userFriendQuery = from ucf in DbContext.Set() @@ -58,6 +93,7 @@ namespace LINGYUN.Abp.MessageService.Chat public virtual async Task> GetMembersAsync(Guid userId, string filter = "", string sorting = nameof(UserChatFriend.UserId), bool reverse = false, int skipCount = 0, int maxResultCount = 10, CancellationToken cancellationToken = default) { + sorting = reverse ? sorting + " desc" : sorting; // 过滤用户资料 var userChatCardQuery = DbContext.Set() .WhereIf(!filter.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(filter) || ucc.NickName.Contains(filter)); diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/ChatController.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/ChatController.cs index 374b8631a..24c790083 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/ChatController.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/ChatController.cs @@ -21,30 +21,37 @@ namespace LINGYUN.Abp.MessageService.Chat [HttpPost] [Route("groups/join")] - public virtual async Task ApplyJoinGroupAsync(UserJoinGroupDto userJoinGroup) + public virtual async Task ApplyJoinGroupAsync(UserJoinGroupDto input) { - await _chatAppService.ApplyJoinGroupAsync(userJoinGroup); + await _chatAppService.ApplyJoinGroupAsync(input); } [HttpGet] - [Route("messages/group")] - public virtual async Task> GetGroupMessageAsync(GroupMessageGetByPagedDto groupMessageGetByPaged) + [Route("group/messages")] + public virtual async Task> GetGroupMessageAsync(GroupMessageGetByPagedDto input) { - return await _chatAppService.GetGroupMessageAsync(groupMessageGetByPaged); + return await _chatAppService.GetGroupMessageAsync(input); } [HttpGet] [Route("groups/users")] - public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto groupUserGetByPaged) + public virtual async Task> GetGroupUsersAsync(GroupUserGetByPagedDto input) { - return await _chatAppService.GetGroupUsersAsync(groupUserGetByPaged); + return await _chatAppService.GetGroupUsersAsync(input); } [HttpGet] - [Route("messages/me")] - public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto userMessageGetByPaged) + [Route("my-messages")] + public virtual async Task> GetMyChatMessageAsync(UserMessageGetByPagedDto input) { - return await _chatAppService.GetMyChatMessageAsync(userMessageGetByPaged); + return await _chatAppService.GetMyChatMessageAsync(input); + } + + [HttpGet] + [Route("my-last-messages")] + public virtual async Task> GetMyLastChatMessageAsync(GetUserLastMessageDto input) + { + return await _chatAppService.GetMyLastChatMessageAsync(input); } [HttpGet] @@ -56,23 +63,23 @@ namespace LINGYUN.Abp.MessageService.Chat [HttpPost] [Route("groups/users/accept")] - public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto groupAcceptUser) + public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input) { - await _chatAppService.GroupAcceptUserAsync(groupAcceptUser); + await _chatAppService.GroupAcceptUserAsync(input); } [HttpDelete] [Route("groups/users/remove")] - public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto groupRemoveUser) + public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input) { - await _chatAppService.GroupRemoveUserAsync(groupRemoveUser); + await _chatAppService.GroupRemoveUserAsync(input); } [HttpGet] - [Route("messages/send")] - public virtual async Task SendMessageAsync(ChatMessage chatMessage) + [Route("send-message")] + public virtual async Task SendMessageAsync(ChatMessage input) { - return await _chatAppService.SendMessageAsync(chatMessage); + return await _chatAppService.SendMessageAsync(input); } } } diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs index fafcf3531..bbb24a1e5 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs @@ -31,16 +31,16 @@ namespace LINGYUN.Abp.MessageService.Chat } [HttpGet] - [Route("last-contacts")] - public virtual async Task> GetLastContactFriendsAsync(PagedResultRequestDto input) + [Route("all")] + public virtual async Task> GetAllListAsync(GetMyFriendsDto input) { - return await MyFriendAppService.GetLastContactFriendsAsync(input); + return await MyFriendAppService.GetAllListAsync(input); } [HttpGet] - public virtual async Task> GetMyFriendsAsync(MyFriendGetByPagedDto input) + public virtual async Task> GetListAsync(MyFriendGetByPagedDto input) { - return await MyFriendAppService.GetMyFriendsAsync(input); + return await MyFriendAppService.GetListAsync(input); } } } diff --git a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db index 87685da6a..40ba6aaa2 100644 Binary files a/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db and b/aspnet-core/services/apigateway/LINGYUN.ApiGateway.Host/event-bus-cap.db differ diff --git a/vueJs/src/api/instant-message.ts b/vueJs/src/api/instant-message.ts index 29ff4eb55..f95129b1e 100644 --- a/vueJs/src/api/instant-message.ts +++ b/vueJs/src/api/instant-message.ts @@ -1,9 +1,14 @@ import ApiService from './serviceBase' -import { PagedResultDto, PagedAndSortedResultRequestDto, PagedResultRequestDto } from './types' +import { PagedResultDto, PagedAndSortedResultRequestDto, ListResultDto } from './types' const serviceUrl = process.env.VUE_APP_BASE_API export default class ImApiService { + public static addFriend(payload: AddUserFriend) { + const _url = '/api/im/my-friends' + return ApiService.Post(_url, payload, serviceUrl) + } + public static getMyFriends(payload: MyFriendGetByPaged) { let _url = '/api/im/my-friends' _url += '?filter=' + payload.filter @@ -14,8 +19,23 @@ export default class ImApiService { return ApiService.Get>(_url, serviceUrl) } + public static getMyAllFriends(payload: MyFrientGetAll) { + let _url = '/api/im/my-friends/all' + _url += '?sorting=' + payload.sorting + _url += '&reverse=' + payload.reverse + return ApiService.Get>(_url, serviceUrl) + } + + public static getMyLastMessages(payload: GetUserLastMessage) { + let _url = '/api/im/chat/my-last-messages' + _url += '?sorting=' + payload.sorting + _url += '&reverse=' + payload.reverse + _url += '&maxResultCount=' + payload.maxResultCount + return ApiService.Get>(_url, serviceUrl) + } + public static getMyChatMessages(payload: UserMessageGetByPaged) { - let _url = '/api/im/chat/messages/me' + let _url = '/api/im/chat/my-messages' _url += '?receiveUserId=' + payload.receiveUserId _url += '&messageType=' + payload.messageType _url += '&filter=' + payload.filter @@ -27,6 +47,19 @@ export default class ImApiService { } } +export class AddUserFriend { + friendId!: string + remarkName!: string + + constructor( + friendId: string, + remarkName: string + ) { + this.friendId = friendId + this.remarkName = remarkName + } +} + export enum Sex { Male, @@ -62,6 +95,17 @@ export class MyFriendGetByPaged extends PagedAndSortedResultRequestDto { reverse = false } +export class MyFrientGetAll { + sorting = 'UserName' + reverse = false +} + +export class GetUserLastMessage { + sorting = 'SendTime' + reverse = false + maxResultCount = 10 +} + export class UserMessageGetByPaged extends PagedAndSortedResultRequestDto { filter = '' messageType = MessageType.Text diff --git a/vueJs/src/api/user-lookup.ts b/vueJs/src/api/user-lookup.ts new file mode 100644 index 000000000..645fe10ad --- /dev/null +++ b/vueJs/src/api/user-lookup.ts @@ -0,0 +1,16 @@ +import ApiService from './serviceBase' +import { ListResultDto } from './types' +import { User } from './users' + +const IdentityServiceUrl = process.env.VUE_APP_BASE_API + +export default class UserLookupApiService { + public static searchUsers(filter = '', sorting = 'UserName', skipCount = 0, maxResultCount = 10) { + let _url = '/api/identity/users/lookup/search' + _url += '?filter=' + filter + _url += '&sorting=' + sorting + _url += '&skipCount=' + skipCount + _url += '&maxResultCount=' + maxResultCount + return ApiService.Get>(_url, IdentityServiceUrl) + } +} diff --git a/vueJs/src/components/InstantMessage/components/AddFriend.vue b/vueJs/src/components/InstantMessage/components/AddFriend.vue new file mode 100644 index 000000000..fe02efacd --- /dev/null +++ b/vueJs/src/components/InstantMessage/components/AddFriend.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/vueJs/src/components/InstantMessage/index.vue b/vueJs/src/components/InstantMessage/index.vue index 1236c44bc..64f2568fa 100644 --- a/vueJs/src/components/InstantMessage/index.vue +++ b/vueJs/src/components/InstantMessage/index.vue @@ -1,48 +1,40 @@ diff --git a/vueJs/src/mixins/EventBusMiXin.ts b/vueJs/src/mixins/EventBusMiXin.ts index af6fb439e..547765407 100644 --- a/vueJs/src/mixins/EventBusMiXin.ts +++ b/vueJs/src/mixins/EventBusMiXin.ts @@ -61,6 +61,6 @@ export default class EventBusMiXin extends Vue { * @param args 事件参数列表 */ protected trigger(name: string, ...args: any[]) { - this.$events.emit(name, args) + this.$events.emit(name, ...args) } }