Browse Source

Merge pull request #378 from colinin/4.4.1

调整消息服务分组命名空间
pull/396/head
yx lin 4 years ago
committed by GitHub
parent
commit
302e04b68b
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs
  2. 40
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs
  3. 33
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/UserOnlineChecker.cs
  4. 6
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/Group.cs
  5. 24
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/GroupUserCard.cs
  6. 50
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/IGroupStore.cs
  7. 26
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/IUserGroupStore.cs
  8. 26
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/UserGroup.cs
  9. 15
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserOnlineChanger.cs
  10. 14
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserOnlineChecker.cs
  11. 46
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs
  12. 92
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserCard.cs
  13. 10
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs
  14. 4
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj
  15. 4
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs
  16. 101
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs
  17. 43
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs
  18. 38
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupAcceptUserDto.cs
  19. 28
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupRemoveUserDto.cs
  20. 9
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupSearchInput.cs
  21. 2
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupUserGetByPagedDto.cs
  22. 28
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/UserJoinGroupDto.cs
  23. 23
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/IGroupAppService.cs
  24. 40
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/IUserGroupAppService.cs
  25. 14
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationServiceBase.cs
  26. 105
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs
  27. 8
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs
  28. 40
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Groups/GroupAppService.cs
  29. 86
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Groups/UserGroupAppService.cs
  30. 32
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Groups/ChatGroupConsts.cs
  31. 51
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs
  32. 4
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs
  33. 74
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs
  34. 224
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs
  35. 31
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IGroupRepository.cs
  36. 154
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/ChatGroup.cs
  37. 64
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupChatBlack.cs
  38. 50
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupMessage.cs
  39. 72
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupStore.cs
  40. 55
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IGroupRepository.cs
  41. 38
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IGroupRepositoryExtensions.cs
  42. 14
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IUserChatGroupRepository.cs
  43. 54
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserChatGroup.cs
  44. 148
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserGroupCard.cs
  45. 34
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserGroupStore.cs
  46. 158
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs
  47. 42
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs
  48. 27
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs
  49. 27
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs
  50. 70
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/AbpMessageServiceEntityFrameworkCoreModule.cs
  51. 30
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/IMessageServiceDbContext.cs
  52. 60
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/MessageServiceDbContext.cs
  53. 381
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/MessageServiceDbContextModelCreatingExtensions.cs
  54. 142
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Groups/EfCoreGroupRepository.cs
  55. 121
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Groups/EfCoreUserChatGroupRepository.cs
  56. 51
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs
  57. 114
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs
  58. 35
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Groups/GroupController.cs
  59. 55
      aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Groups/UserGroupController.cs
  60. 622
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/20211110144233_Add-Field-Online-Avatar.Designer.cs
  61. 47
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/20211110144233_Add-Field-Online-Avatar.cs
  62. 22
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/MessageServiceHostMigrationsDbContextModelSnapshot.cs
  63. 16
      aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/appsettings.Development.json

6
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/AbpIMSignalROptions.cs

@ -10,10 +10,16 @@
/// 用户上线接收方法名称
/// </summary>
public string UserOnlineMethod { get; set; }
/// <summary>
/// 用户下线接收方法名称
/// </summary>
public string UserOfflineMethod { get; set; }
public AbpIMSignalROptions()
{
GetChatMessageMethod = "get-chat-message";
UserOnlineMethod = "on-user-onlined";
UserOfflineMethod = "on-user-offlined";
}
}
}

40
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.IM.Contract;
using LINGYUN.Abp.IM.Group;
using LINGYUN.Abp.IM.Groups;
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.RealTime.Client;
using LINGYUN.Abp.RealTime.SignalR;
@ -19,6 +19,8 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{
protected IMessageProcessor Processor => LazyServiceProvider.LazyGetRequiredService<IMessageProcessor>();
protected IUserOnlineChanger OnlineChanger => LazyServiceProvider.LazyGetService<IUserOnlineChanger>();
protected AbpIMSignalROptions Options { get; }
protected IFriendStore FriendStore { get; }
protected IMessageStore MessageStore { get; }
@ -39,21 +41,43 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
protected override async Task OnClientConnectedAsync(IOnlineClient client)
{
await base.OnClientConnectedAsync(client);
// 加入通讯组
// 用户上线
await OnlineChanger?.ChangeAsync(client.TenantId, client.UserId.Value, UserOnlineState.Online);
await SendUserOnlineStateAsync(client);
}
protected override async Task OnClientDisconnectedAsync(IOnlineClient client)
{
await base.OnClientDisconnectedAsync(client);
// 用户下线
await OnlineChanger?.ChangeAsync(client.TenantId, client.UserId.Value, UserOnlineState.Offline);
await SendUserOnlineStateAsync(client, false);
}
protected virtual async Task SendUserOnlineStateAsync(IOnlineClient client, bool isOnlined = true)
{
var methodName = isOnlined ? Options.UserOnlineMethod : Options.UserOfflineMethod;
var userGroups = await UserGroupStore.GetUserGroupsAsync(client.TenantId, client.UserId.Value);
foreach (var group in userGroups)
{
// 应使用群组标识
await Groups.AddToGroupAsync(client.ConnectionId, group.Id);
if (isOnlined)
{
// 应使用群组标识
await Groups.AddToGroupAsync(client.ConnectionId, group.Id);
}
var groupClient = Clients.Group(group.Id);
if (groupClient != null)
{
// 发送用户上线通知
await groupClient.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value);
// 发送用户线通知
await groupClient.SendAsync(methodName, client.TenantId, client.UserId.Value);
}
}
// 发送好友上线通知
var userFriends = await FriendStore.GetListAsync(client.TenantId, client.UserId.Value);
if (userFriends.Count > 0)
{
@ -61,7 +85,7 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
var userClients = Clients.Users(friendClientIds);
if (userClients != null)
{
await userClients.SendAsync(Options.UserOnlineMethod, client.TenantId, client.UserId.Value);
await userClients.SendAsync(methodName, client.TenantId, client.UserId.Value);
}
}
}

33
aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/UserOnlineChecker.cs

@ -0,0 +1,33 @@
using LINGYUN.Abp.RealTime.Client;
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.IM.SignalR
{
public class UserOnlineChecker : IUserOnlineChecker, ITransientDependency
{
private readonly IOnlineClientManager _onlineClientManager;
public UserOnlineChecker(
IOnlineClientManager onlineClientManager)
{
_onlineClientManager = onlineClientManager;
}
public virtual Task<bool> CheckAsync(
Guid? tenantId,
Guid userId,
CancellationToken cancellationToken = default)
{
var onlineClients = _onlineClientManager
.GetAllClients(client => client.UserId.Equals(userId));
var userOnlined = onlineClients?.Any() == true;
return Task.FromResult(userOnlined);
}
}
}

6
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/Group.cs → aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/Group.cs

@ -1,4 +1,4 @@
namespace LINGYUN.Abp.IM.Group
namespace LINGYUN.Abp.IM.Groups
{
public class Group
{
@ -11,6 +11,10 @@
/// </summary>
public string Name { get; set; }
/// <summary>
/// 群组头像
/// </summary>
public string AvatarUrl { get; set; }
/// <summary>
/// 允许匿名聊天
/// </summary>
public bool AllowAnonymous { get; set; }

24
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/GroupUserCard.cs → aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/GroupUserCard.cs

@ -1,12 +1,12 @@
namespace LINGYUN.Abp.IM.Group
{
public class GroupUserCard : UserCard
{
public long GroupId { get; set; }
public bool IsAdmin { get; set; }
public bool IsSuperAdmin { get; set; }
public GroupUserCard()
{
}
}
}
namespace LINGYUN.Abp.IM.Groups
{
public class GroupUserCard : UserCard
{
public long GroupId { get; set; }
public bool IsAdmin { get; set; }
public bool IsSuperAdmin { get; set; }
public GroupUserCard()
{
}
}
}

50
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/IGroupStore.cs

@ -0,0 +1,50 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM.Groups
{
public interface IGroupStore
{
/// <summary>
/// 获取群组信息
/// </summary>
/// <param name="tenantId"></param>
/// <param name="groupId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<Group> GetAsync(
Guid? tenantId,
string groupId,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群组数
/// </summary>
/// <param name="tenantId"></param>
/// <param name="filter"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<int> GetCountAsync(
Guid? tenantId,
string filter = null,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群组列表
/// </summary>
/// <param name="tenantId"></param>
/// <param name="filter"></param>
/// <param name="sorting"></param>
/// <param name="skipCount"></param>
/// <param name="maxResultCount"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<Group>> GetListAsync(
Guid? tenantId,
string filter = null,
string sorting = nameof(Group.Name),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}
}

26
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/IUserGroupStore.cs → aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/IUserGroupStore.cs

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM.Group
namespace LINGYUN.Abp.IM.Groups
{
public interface IUserGroupStore
{
@ -15,7 +15,7 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="userId"></param>
/// <returns></returns>
Task<bool> MemberHasInGroupAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default);
@ -27,8 +27,8 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="userId"></param>
/// <returns></returns>
Task<GroupUserCard> GetUserGroupCardAsync(
Guid? tenantId,
long groupId,
Guid? tenantId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default);
/// <summary>
@ -48,7 +48,7 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="groupId"></param>
/// <returns></returns>
Task<IEnumerable<GroupUserCard>> GetMembersAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
CancellationToken cancellationToken = default);
/// <summary>
@ -58,7 +58,7 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="groupId"></param>
/// <returns></returns>
Task<int> GetMembersCountAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
CancellationToken cancellationToken = default);
/// <summary>
@ -71,10 +71,10 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="maxResultCount"></param>
/// <returns></returns>
Task<List<GroupUserCard>> GetMembersAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
string sorting = nameof(GroupUserCard.UserId),
int skipCount = 0,
string sorting = nameof(GroupUserCard.UserId),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
/// <summary>
@ -85,8 +85,8 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="groupId"></param>
/// <returns></returns>
Task AddUserToGroupAsync(
Guid? tenantId,
Guid userId,
Guid? tenantId,
Guid userId,
long groupId,
Guid acceptUserId,
CancellationToken cancellationToken = default);
@ -98,8 +98,8 @@ namespace LINGYUN.Abp.IM.Group
/// <param name="groupId"></param>
/// <returns></returns>
Task RemoveUserFormGroupAsync(
Guid? tenantId,
Guid userId,
Guid? tenantId,
Guid userId,
long groupId,
CancellationToken cancellationToken = default);
}

26
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Group/UserGroup.cs → aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Groups/UserGroup.cs

@ -1,13 +1,13 @@
using System;
namespace LINGYUN.Abp.IM.Group
{
public class UserGroup
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public long GroupId { get; set; }
public bool IsAdmin { get; set; }
public bool IsSuperAdmin { get; set; }
}
}
using System;
namespace LINGYUN.Abp.IM.Groups
{
public class UserGroup
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
public long GroupId { get; set; }
public bool IsAdmin { get; set; }
public bool IsSuperAdmin { get; set; }
}
}

15
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserOnlineChanger.cs

@ -0,0 +1,15 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM
{
public interface IUserOnlineChanger
{
Task ChangeAsync(
Guid? tenantId,
Guid userId,
UserOnlineState state,
CancellationToken cancellationToken = default);
}
}

14
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/IUserOnlineChecker.cs

@ -0,0 +1,14 @@
using System;
using System.Threading;
using System.Threading.Tasks;
namespace LINGYUN.Abp.IM
{
public interface IUserOnlineChecker
{
Task<bool> CheckAsync(
Guid? tenantId,
Guid userId,
CancellationToken cancellationToken = default);
}
}

46
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/IMessageStore.cs

@ -26,10 +26,10 @@ namespace LINGYUN.Abp.IM.Messages
/// <param name="type"></param>
/// <returns></returns>
Task<long> GetGroupMessageCountAsync(
Guid? tenantId,
long groupId,
string filter = "",
Guid? tenantId,
long groupId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群组聊天记录
@ -43,12 +43,12 @@ namespace LINGYUN.Abp.IM.Messages
/// <param name="maxResultCount"></param>
/// <returns></returns>
Task<List<ChatMessage>> GetGroupMessageAsync(
Guid? tenantId,
long groupId,
string filter = "",
Guid? tenantId,
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(ChatMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
/// <summary>
@ -56,12 +56,14 @@ namespace LINGYUN.Abp.IM.Messages
/// </summary>
/// <param name="tenantId"></param>
/// <param name="userId"></param>
/// <param name="state"></param>
/// <param name="sorting"></param>
/// <param name="maxResultCount"></param>
/// <returns></returns>
Task<List<LastChatMessage>> GetLastChatMessagesAsync(
Guid? tenantId,
Guid userId,
MessageState? state = null,
string sorting = nameof(LastChatMessage.SendTime),
int maxResultCount = 10,
CancellationToken cancellationToken = default
@ -76,27 +78,33 @@ namespace LINGYUN.Abp.IM.Messages
/// <param name="type"></param>
/// <returns></returns>
Task<long> GetChatMessageCountAsync(
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
string filter = "",
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
/// <summary>
/// 获取与某个用户聊天记录
/// 获取用户聊天记录
/// </summary>
/// <param name="tenantId"></param>
/// <param name="userId"></param>
/// <param name="sendUserId"></param>
/// <param name="receiveUserId"></param>
/// <param name="type"></param>
/// <param name="filter"></param>
/// <param name="sorting"></param>
/// <param name="skipCount"></param>
/// <param name="maxResultCount"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<ChatMessage>> GetChatMessageAsync(
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
string filter = "",
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
string sorting = nameof(ChatMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}

92
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserCard.cs

@ -1,45 +1,47 @@
using System;
namespace LINGYUN.Abp.IM
{
public class UserCard
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
#region 细粒度的用户资料
public string UserName { get; set; }
/// <summary>
/// 头像
/// </summary>
public string AvatarUrl { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 性别
/// </summary>
public Sex Sex { get; set; }
/// <summary>
/// 签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 说明
/// </summary>
public string Description { get; set; }
/// <summary>
/// 生日
/// </summary>
public DateTime? Birthday { get; set; }
#endregion
}
}
using System;
namespace LINGYUN.Abp.IM
{
public class UserCard
{
public Guid? TenantId { get; set; }
public Guid UserId { get; set; }
#region 细粒度的用户资料
public string UserName { get; set; }
/// <summary>
/// 头像
/// </summary>
public string AvatarUrl { get; set; }
/// <summary>
/// 昵称
/// </summary>
public string NickName { get; set; }
/// <summary>
/// 年龄
/// </summary>
public int Age { get; set; }
/// <summary>
/// 性别
/// </summary>
public Sex Sex { get; set; }
/// <summary>
/// 签名
/// </summary>
public string Sign { get; set; }
/// <summary>
/// 说明
/// </summary>
public string Description { get; set; }
/// <summary>
/// 生日
/// </summary>
public DateTime? Birthday { get; set; }
public bool Online { get; set; }
#endregion
}
}

10
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/UserOnlineState.cs

@ -0,0 +1,10 @@
namespace LINGYUN.Abp.IM
{
public enum UserOnlineState
{
Online,
Offline,
Busy,
Stealth
}
}

4
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj

@ -28,8 +28,4 @@
<ProjectReference Include="..\..\message\LINGYUN.Abp.MessageService.Domain.Shared\LINGYUN.Abp.MessageService.Domain.Shared.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="LINGYUN\Abp\MessageService\Group\" />
</ItemGroup>
</Project>

4
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GetUserLastMessageDto.cs

@ -1,4 +1,5 @@
using Volo.Abp.Application.Dtos;
using LINGYUN.Abp.IM.Messages;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.MessageService.Chat
{
@ -6,5 +7,6 @@ namespace LINGYUN.Abp.MessageService.Chat
{
public int MaxResultCount { get; set; }
public string Sorting { get; set; }
public MessageState? State { get; set; }
}
}

101
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IChatAppService.cs

@ -1,65 +1,36 @@
using LINGYUN.Abp.IM.Messages;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Chat
{
public interface IChatAppService : IApplicationService
{
/// <summary>
/// 发送消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ChatMessageSendResultDto> SendMessageAsync(ChatMessage input);
///// <summary>
///// 申请加入群组
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//Task ApplyJoinGroupAsync(UserJoinGroupDto input);
///// <summary>
///// 获取我的群组
///// </summary>
///// <returns></returns>
//Task<ListResultDto<Group>> GetMyGroupsAsync();
///// <summary>
///// 获取群组用户
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//Task<PagedResultDto<GroupUserCard>> GetGroupUsersAsync(GroupUserGetByPagedDto input);
///// <summary>
///// 处理用户群组申请
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//Task GroupAcceptUserAsync(GroupAcceptUserDto input);
///// <summary>
///// 群组移除用户
///// </summary>
///// <param name="input"></param>
///// <returns></returns>
//Task GroupRemoveUserAsync(GroupRemoveUserDto input);
/// <summary>
/// 获取群组消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<ChatMessage>> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input);
/// <summary>
/// 获取我的消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<ChatMessage>> GetMyChatMessageAsync(UserMessageGetByPagedDto input);
/// <summary>
/// 获取我最近的消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ListResultDto<LastChatMessage>> GetMyLastChatMessageAsync(GetUserLastMessageDto input);
//TOTO: 还应该有获取我的未读消息 获取我的未读群组消息
}
}
using LINGYUN.Abp.IM.Messages;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Chat
{
public interface IChatAppService : IApplicationService
{
/// <summary>
/// 发送消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ChatMessageSendResultDto> SendMessageAsync(ChatMessage input);
/// <summary>
/// 获取群组消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<ChatMessage>> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input);
/// <summary>
/// 获取我的消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<ChatMessage>> GetMyChatMessageAsync(UserMessageGetByPagedDto input);
/// <summary>
/// 获取我最近的消息
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<ListResultDto<LastChatMessage>> GetMyLastChatMessageAsync(GetUserLastMessageDto input);
//TOTO: 还应该有获取我的未读消息 获取我的未读群组消息
}
}

43
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/IMyFriendAppService.cs

@ -1,20 +1,23 @@
using LINGYUN.Abp.IM.Contract;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Chat
{
public interface IMyFriendAppService : IApplicationService
{
Task<PagedResultDto<UserFriend>> GetListAsync(MyFriendGetByPagedDto input);
Task<ListResultDto<UserFriend>> GetAllListAsync(GetMyFriendsDto input);
Task CreateAsync(MyFriendCreateDto input);
Task DeleteAsync(MyFriendOperationDto input);
Task AddRequestAsync(MyFriendAddRequestDto input);
}
}
using LINGYUN.Abp.IM.Contract;
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Chat
{
public interface IMyFriendAppService : IApplicationService
{
Task<UserFriend> GetAsync(Guid friendId);
Task<PagedResultDto<UserFriend>> GetListAsync(MyFriendGetByPagedDto input);
Task<ListResultDto<UserFriend>> GetAllListAsync(GetMyFriendsDto input);
Task CreateAsync(MyFriendCreateDto input);
Task DeleteAsync(MyFriendOperationDto input);
Task AddRequestAsync(MyFriendAddRequestDto input);
}
}

38
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupAcceptUserDto.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupAcceptUserDto.cs

@ -1,19 +1,19 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Chat
{
public class GroupAcceptUserDto
{
[Required]
public Guid UserId { get; set; }
[Required]
public long GroupId { get; set; }
public bool AllowAccept { get; set; } = true;
[StringLength(64)]
public string RejectReason { get; set; }
}
}
using System;
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupAcceptUserDto
{
[Required]
public Guid UserId { get; set; }
[Required]
public long GroupId { get; set; }
public bool AllowAccept { get; set; } = true;
[StringLength(64)]
public string RejectReason { get; set; }
}
}

28
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupRemoveUserDto.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupRemoveUserDto.cs

@ -1,14 +1,14 @@
using System;
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Chat
{
public class GroupRemoveUserDto
{
[Required]
public Guid UserId { get; set; }
[Required]
public long GroupId { get; set; }
}
}
using System;
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupRemoveUserDto
{
[Required]
public Guid UserId { get; set; }
[Required]
public long GroupId { get; set; }
}
}

9
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupSearchInput.cs

@ -0,0 +1,9 @@
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupSearchInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
}
}

2
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/GroupUserGetByPagedDto.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/GroupUserGetByPagedDto.cs

@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.MessageService.Chat
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupUserGetByPagedDto : PagedAndSortedResultRequestDto
{

28
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Chat/Dto/UserJoinGroupDto.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/Dto/UserJoinGroupDto.cs

@ -1,14 +1,14 @@
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Chat
{
public class UserJoinGroupDto
{
[Required]
public long GroupId { get; set; }
[Required]
[StringLength(100)]
public string JoinInfo { get; set; }
}
}
using System.ComponentModel.DataAnnotations;
namespace LINGYUN.Abp.MessageService.Groups
{
public class UserJoinGroupDto
{
[Required]
public long GroupId { get; set; }
[Required]
[StringLength(100)]
public string JoinInfo { get; set; }
}
}

23
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/IGroupAppService.cs

@ -0,0 +1,23 @@
using LINGYUN.Abp.IM.Groups;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Groups
{
public interface IGroupAppService : IApplicationService
{
/// <summary>
/// 搜索群组
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<Group>> SearchAsync(GroupSearchInput input);
/// <summary>
/// 获取群组信息
/// </summary>
/// <param name="groupId"></param>
/// <returns></returns>
Task<Group> GetAsync(string groupId);
}
}

40
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/Groups/IUserGroupAppService.cs

@ -0,0 +1,40 @@
using LINGYUN.Abp.IM.Groups;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService.Groups
{
public interface IUserGroupAppService : IApplicationService
{
/// <summary>
/// 申请加入群组
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task ApplyJoinGroupAsync(UserJoinGroupDto input);
/// <summary>
/// 获取我的群组
/// </summary>
/// <returns></returns>
Task<ListResultDto<Group>> GetMyGroupsAsync();
/// <summary>
/// 获取群组用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task<PagedResultDto<GroupUserCard>> GetGroupUsersAsync(GroupUserGetByPagedDto input);
/// <summary>
/// 处理用户群组申请
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task GroupAcceptUserAsync(GroupAcceptUserDto input);
/// <summary>
/// 群组移除用户
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
Task GroupRemoveUserAsync(GroupRemoveUserDto input);
}
}

14
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationServiceBase.cs

@ -0,0 +1,14 @@
using LINGYUN.Abp.MessageService.Localization;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.MessageService
{
public abstract class AbpMessageServiceApplicationServiceBase : ApplicationService
{
protected AbpMessageServiceApplicationServiceBase()
{
LocalizationResource = typeof(MessageServiceResource);
ObjectMapperContext = typeof(AbpMessageServiceApplicationModule);
}
}
}

105
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/ChatAppService.cs

@ -1,4 +1,4 @@
using LINGYUN.Abp.IM.Group;
using LINGYUN.Abp.IM.Groups;
using LINGYUN.Abp.IM.Messages;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
@ -28,13 +28,23 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<PagedResultDto<ChatMessage>> GetMyChatMessageAsync(UserMessageGetByPagedDto input)
{
var chatMessageCount = await _messageStore
.GetChatMessageCountAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId,
input.Filter, input.MessageType);
.GetChatMessageCountAsync(
CurrentTenant.Id,
CurrentUser.GetId(),
input.ReceiveUserId,
input.MessageType,
input.Filter);
var chatMessages = await _messageStore
.GetChatMessageAsync(CurrentTenant.Id, CurrentUser.GetId(), input.ReceiveUserId,
input.Filter, input.Sorting,
input.MessageType, input.SkipCount, input.MaxResultCount);
.GetChatMessageAsync(
CurrentTenant.Id,
CurrentUser.GetId(),
input.ReceiveUserId,
input.MessageType,
input.Filter,
input.Sorting,
input.SkipCount,
input.MaxResultCount);
return new PagedResultDto<ChatMessage>(chatMessageCount, chatMessages);
}
@ -42,86 +52,43 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<ListResultDto<LastChatMessage>> GetMyLastChatMessageAsync(GetUserLastMessageDto input)
{
var chatMessages = await _messageStore
.GetLastChatMessagesAsync(CurrentTenant.Id, CurrentUser.GetId(),
input.Sorting, input.MaxResultCount);
.GetLastChatMessagesAsync(
CurrentTenant.Id,
CurrentUser.GetId(),
input.State,
input.Sorting,
input.MaxResultCount);
return new ListResultDto<LastChatMessage>(chatMessages);
}
public virtual async Task<PagedResultDto<ChatMessage>> GetMyGroupMessageAsync(GroupMessageGetByPagedDto input)
{
if (! await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()))
if (!await _userGroupStore.MemberHasInGroupAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId()))
{
throw new BusinessException(MessageServiceErrorCodes.YouHaveNotJoinedGroup);
}
var groupMessageCount = await _messageStore
.GetGroupMessageCountAsync(CurrentTenant.Id, input.GroupId,
input.Filter, input.MessageType);
.GetGroupMessageCountAsync(
CurrentTenant.Id,
input.GroupId,
input.MessageType,
input.Filter);
var groupMessages = await _messageStore
.GetGroupMessageAsync(CurrentTenant.Id, input.GroupId,
input.Filter, input.Sorting,
input.MessageType, input.SkipCount, input.MaxResultCount);
.GetGroupMessageAsync(
CurrentTenant.Id,
input.GroupId,
input.MessageType,
input.Filter,
input.Sorting,
input.SkipCount,
input.MaxResultCount);
return new PagedResultDto<ChatMessage>(groupMessageCount, groupMessages);
}
//public virtual async Task<PagedResultDto<GroupUserCard>> GetGroupUsersAsync(GroupUserGetByPagedDto input)
//{
// var groupUserCardCount = await _userGroupStore
// .GetMembersCountAsync(CurrentTenant.Id, input.GroupId);
// var groupUserCards = await _userGroupStore.GetMembersAsync(CurrentTenant.Id,
// input.GroupId, input.Sorting, input.Reverse,
// input.SkipCount, input.MaxResultCount);
// return new PagedResultDto<GroupUserCard>(groupUserCardCount, groupUserCards);
//}
//[Authorize]
//public virtual async Task<ListResultDto<Group>> GetMyGroupsAsync()
//{
// var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId());
// return new ListResultDto<Group>(myGroups.ToImmutableList());
//}
//public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input)
//{
// var myGroupCard = await _userGroupStore
// .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId());
// if (myGroupCard == null)
// {
// // 当前登录用户不再用户组
// throw new UserFriendlyException("");
// }
// if (!myGroupCard.IsAdmin)
// {
// // 当前登录用户没有加人权限
// throw new UserFriendlyException("");
// }
// await _userGroupStore
// .AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId());
//}
//public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input)
//{
// var myGroupCard = await _userGroupStore
// .GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId());
// if (myGroupCard == null)
// {
// // 当前登录用户不再用户组
// throw new UserFriendlyException("");
// }
// if (!myGroupCard.IsAdmin)
// {
// // 当前登录用户没有踢人权限
// throw new UserFriendlyException("");
// }
// await _userGroupStore
// .RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId);
//}
public virtual async Task<ChatMessageSendResultDto> SendMessageAsync(ChatMessage input)
{

8
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Chat/MyFriendAppService.cs

@ -1,6 +1,7 @@
using LINGYUN.Abp.IM.Contract;
using LINGYUN.Abp.MessageService.Localization;
using Microsoft.AspNetCore.Authorization;
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -25,6 +26,11 @@ namespace LINGYUN.Abp.MessageService.Chat
LocalizationResource = typeof(MessageServiceResource);
}
public virtual async Task<UserFriend> GetAsync(Guid friendId)
{
return await FriendStore.GetMemberAsync(CurrentTenant.Id, CurrentUser.GetId(), friendId);
}
public virtual async Task CreateAsync(MyFriendCreateDto input)
{
var friendCard = await UserChatCardRepository.GetMemberAsync(input.FriendId);
@ -59,7 +65,7 @@ namespace LINGYUN.Abp.MessageService.Chat
var myFriends = await FriendStore
.GetPagedListAsync(CurrentTenant.Id, CurrentUser.GetId(),
input.Filter, input.Sorting,
input.Filter, input.Sorting,
input.SkipCount, input.MaxResultCount);
return new PagedResultDto<UserFriend>(myFrientCount, myFriends);

40
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Groups/GroupAppService.cs

@ -0,0 +1,40 @@
using LINGYUN.Abp.IM.Groups;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
namespace LINGYUN.Abp.MessageService.Groups
{
[AllowAnonymous]
public class GroupAppService : AbpMessageServiceApplicationServiceBase, IGroupAppService
{
private readonly IGroupStore _groupStore;
public GroupAppService(
IGroupStore groupStore)
{
_groupStore = groupStore;
}
public virtual async Task<Group> GetAsync(string groupId)
{
return await _groupStore.GetAsync(CurrentTenant.Id, groupId);
}
public virtual async Task<PagedResultDto<Group>> SearchAsync(GroupSearchInput input)
{
var count = await _groupStore.GetCountAsync(
CurrentTenant.Id,
input.Filter);
var groups = await _groupStore.GetListAsync(
CurrentTenant.Id,
input.Filter,
input.Sorting,
input.SkipCount,
input.MaxResultCount);
return new PagedResultDto<Group>(count, groups);
}
}
}

86
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/Groups/UserGroupAppService.cs

@ -0,0 +1,86 @@
using LINGYUN.Abp.IM.Groups;
using Microsoft.AspNetCore.Authorization;
using System;
using System.Collections.Immutable;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Users;
namespace LINGYUN.Abp.MessageService.Groups
{
[Authorize]
public class UserGroupAppService : AbpMessageServiceApplicationServiceBase, IUserGroupAppService
{
private readonly IUserGroupStore _userGroupStore;
public UserGroupAppService(
IUserGroupStore userGroupStore)
{
_userGroupStore = userGroupStore;
}
public virtual Task ApplyJoinGroupAsync(UserJoinGroupDto input)
{
throw new NotImplementedException();
}
public virtual async Task<PagedResultDto<GroupUserCard>> GetGroupUsersAsync(GroupUserGetByPagedDto input)
{
var groupUserCardCount = await _userGroupStore
.GetMembersCountAsync(CurrentTenant.Id, input.GroupId);
var groupUserCards = await _userGroupStore.GetMembersAsync(
CurrentTenant.Id,
input.GroupId,
input.Sorting,
input.SkipCount,
input.MaxResultCount);
return new PagedResultDto<GroupUserCard>(groupUserCardCount, groupUserCards);
}
public virtual async Task<ListResultDto<Group>> GetMyGroupsAsync()
{
var myGroups = await _userGroupStore.GetUserGroupsAsync(CurrentTenant.Id, CurrentUser.GetId());
return new ListResultDto<Group>(myGroups.ToImmutableList());
}
public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input)
{
var myGroupCard = await _userGroupStore
.GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId());
if (myGroupCard == null)
{
// 当前登录用户不再用户组
throw new UserFriendlyException("");
}
if (!myGroupCard.IsAdmin)
{
// 当前登录用户没有加人权限
throw new UserFriendlyException("");
}
await _userGroupStore
.AddUserToGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId, CurrentUser.GetId());
}
public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input)
{
var myGroupCard = await _userGroupStore
.GetUserGroupCardAsync(CurrentTenant.Id, input.GroupId, CurrentUser.GetId());
if (myGroupCard == null)
{
// 当前登录用户不再用户组
throw new UserFriendlyException("");
}
if (!myGroupCard.IsAdmin)
{
// 当前登录用户没有踢人权限
throw new UserFriendlyException("");
}
await _userGroupStore
.RemoveUserFormGroupAsync(CurrentTenant.Id, input.UserId, input.GroupId);
}
}
}

32
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Group/ChatGroupConsts.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain.Shared/LINGYUN/Abp/MessageService/Groups/ChatGroupConsts.cs

@ -1,15 +1,17 @@
namespace LINGYUN.Abp.MessageService.Group
{
public class ChatGroupConsts
{
public const int MaxNameLength = 20;
public const int MaxTagLength = 512;
public const int MaxAddressLength = 256;
public const int MaxNoticeLength = 64;
public const int MaxDescriptionLength = 128;
}
}
namespace LINGYUN.Abp.MessageService.Groups
{
public class ChatGroupConsts
{
public const int MaxNameLength = 20;
public const int MaxTagLength = 512;
public const int MaxAddressLength = 256;
public const int MaxNoticeLength = 64;
public const int MaxDescriptionLength = 128;
public const int MaxAvatarUrlLength = 128;
}
}

51
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IMessageRepository.cs

@ -1,5 +1,5 @@
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Groups;
using System;
using System.Collections.Generic;
using System.Threading;
@ -26,35 +26,36 @@ namespace LINGYUN.Abp.MessageService.Chat
CancellationToken cancellationToken = default);
Task<UserMessage> GetUserMessageAsync(
long id,
long id,
CancellationToken cancellationToken = default);
Task<GroupMessage> GetGroupMessageAsync(
long id,
long id,
CancellationToken cancellationToken = default);
Task<long> GetUserMessagesCountAsync(
Guid sendUserId,
Guid receiveUserId,
string filter = "",
MessageType? type = null,
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
Task<long> GetCountAsync(
long groupId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
Task<long> GetCountAsync(
Guid sendUserId,
Guid receiveUserId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
Task<List<LastChatMessage>> GetLastMessagesByOneFriendAsync(
Task<List<LastChatMessage>> GetLastMessagesAsync(
Guid userId,
MessageState? state = null,
string sorting = nameof(LastChatMessage.SendTime),
int maxResultCount = 10,
CancellationToken cancellationToken = default);
@ -62,42 +63,42 @@ namespace LINGYUN.Abp.MessageService.Chat
Task<List<UserMessage>> GetUserMessagesAsync(
Guid sendUserId,
Guid receiveUserId,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
Task<long> GetGroupMessagesCountAsync(
long groupId,
string filter = "",
long groupId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
Task<List<GroupMessage>> GetGroupMessagesAsync(
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
Task<long> GetUserGroupMessagesCountAsync(
Guid sendUserId,
long groupId,
string filter = "",
Guid sendUserId,
long groupId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default);
Task<List<GroupMessage>> GetUserGroupMessagesAsync(
Guid sendUserId,
long groupId,
Guid sendUserId,
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}

4
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/IUserChatCardRepository.cs

@ -9,6 +9,10 @@ namespace LINGYUN.Abp.MessageService.Chat
{
public interface IUserChatCardRepository : IBasicRepository<UserChatCard, long>
{
Task<UserChatCard> FindByUserIdAsync(
Guid userId,
CancellationToken cancellationToken = default);
Task<bool> CheckUserIdExistsAsync(
Guid userId,
CancellationToken cancellationToken = default);

74
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/MessageStore.cs

@ -1,6 +1,6 @@
using LINGYUN.Abp.IM.Contract;
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Groups;
using System;
using System.Collections.Generic;
using System.Threading;
@ -70,19 +70,26 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<List<ChatMessage>> GetGroupMessageAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(ChatMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
var groupMessages = await _messageRepository
.GetGroupMessagesAsync(groupId, filter, sorting, type, skipCount, maxResultCount, cancellationToken);
.GetGroupMessagesAsync(
groupId,
type,
filter,
sorting,
skipCount,
maxResultCount,
cancellationToken);
var chatMessages = _objectMapper.Map<List<GroupMessage>, List<ChatMessage>>(groupMessages);
@ -91,20 +98,28 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<List<ChatMessage>> GetChatMessageAsync(
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
string sorting = nameof(ChatMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
var userMessages = await _messageRepository
.GetUserMessagesAsync(sendUserId, receiveUserId, filter, sorting, type, skipCount, maxResultCount, cancellationToken);
.GetUserMessagesAsync(
sendUserId,
receiveUserId,
type,
filter,
sorting,
skipCount,
maxResultCount,
cancellationToken);
var chatMessages = _objectMapper.Map<List<UserMessage>, List<ChatMessage>>(userMessages);
@ -115,6 +130,7 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<List<LastChatMessage>> GetLastChatMessagesAsync(
Guid? tenantId,
Guid userId,
MessageState? state = null,
string sorting = nameof(LastChatMessage.SendTime),
int maxResultCount = 10,
CancellationToken cancellationToken = default
@ -123,34 +139,34 @@ namespace LINGYUN.Abp.MessageService.Chat
using (_currentTenant.Change(tenantId))
{
return await _messageRepository
.GetLastMessagesByOneFriendAsync(userId, sorting, maxResultCount, cancellationToken);
.GetLastMessagesAsync(userId, state, sorting, maxResultCount, cancellationToken);
}
}
public virtual async Task<long> GetGroupMessageCountAsync(
Guid? tenantId,
long groupId,
string filter = "",
Guid? tenantId,
long groupId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
return await _messageRepository.GetCountAsync(groupId, filter, type, cancellationToken);
return await _messageRepository.GetCountAsync(groupId, type, filter, cancellationToken);
}
}
public virtual async Task<long> GetChatMessageCountAsync(
Guid? tenantId,
Guid sendUserId,
Guid receiveUserId,
string filter = "",
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, filter, type, cancellationToken);
return await _messageRepository.GetCountAsync(sendUserId, receiveUserId, type, filter, cancellationToken);
}
}
@ -202,10 +218,10 @@ namespace LINGYUN.Abp.MessageService.Chat
}
var message = new UserMessage(
long.Parse(chatMessage.MessageId),
chatMessage.FormUserId,
chatMessage.FormUserName,
chatMessage.Content,
long.Parse(chatMessage.MessageId),
chatMessage.FormUserId,
chatMessage.FormUserName,
chatMessage.Content,
chatMessage.MessageType);
message.SendToUser(chatMessage.ToUserId.Value);
@ -215,7 +231,7 @@ namespace LINGYUN.Abp.MessageService.Chat
}
protected virtual async Task StoreGroupMessageAsync(
ChatMessage chatMessage,
ChatMessage chatMessage,
long groupId,
CancellationToken cancellationToken = default)
{
@ -239,10 +255,10 @@ namespace LINGYUN.Abp.MessageService.Chat
}
var message = new GroupMessage(
long.Parse(chatMessage.MessageId),
chatMessage.FormUserId,
chatMessage.FormUserName,
chatMessage.Content,
long.Parse(chatMessage.MessageId),
chatMessage.FormUserId,
chatMessage.FormUserName,
chatMessage.Content,
chatMessage.MessageType);
message.SendToGroup(groupId);

224
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Chat/UserChatCard.cs

@ -1,105 +1,119 @@
using LINGYUN.Abp.IM;
using LINGYUN.Abp.MessageService.Utils;
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.MessageService.Chat
{
/// <summary>
/// 用户卡片
/// </summary>
public class UserChatCard : AuditedAggregateRoot<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 用户标识
/// </summary>
public virtual Guid UserId { get; protected set; }
/// <summary>
/// 用户名
/// </summary>
public virtual string UserName { get; protected set; }
/// <summary>
/// 性别
/// </summary>
public virtual Sex Sex { get; set; }
/// <summary>
/// 签名
/// </summary>
public virtual string Sign { get; set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 说明
/// </summary>
public virtual string Description { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public virtual string AvatarUrl { get; protected set; }
/// <summary>
/// 生日
/// </summary>
public virtual DateTime? Birthday { get; protected set; }
/// <summary>
/// 年龄
/// </summary>
public virtual int Age { get; protected set; }
protected UserChatCard()
{
}
public UserChatCard(
Guid userId,
string userName,
Sex sex,
string nickName = null,
string avatarUrl = "",
Guid? tenantId = null)
{
Sex = sex;
UserId = userId;
UserName = userName;
NickName = nickName ?? userName;
AvatarUrl = avatarUrl;
TenantId = tenantId;
}
public void SetBirthday(DateTime birthday, IClock clock)
{
Birthday = birthday;
Age = DateTimeHelper.CalcAgrByBirthdate(birthday, clock.Now);
}
public void SetAvatarUrl(string url)
{
AvatarUrl = url;
}
public UserCard ToUserCard()
{
return new UserCard
{
Age = Age,
AvatarUrl = AvatarUrl,
Birthday = Birthday,
Description = Description,
NickName = NickName,
Sex = Sex,
Sign = Sign,
UserId = UserId,
UserName = UserName,
TenantId = TenantId
};
}
}
}
using LINGYUN.Abp.IM;
using LINGYUN.Abp.MessageService.Utils;
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.MessageService.Chat
{
/// <summary>
/// 用户卡片
/// </summary>
public class UserChatCard : AuditedAggregateRoot<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 用户标识
/// </summary>
public virtual Guid UserId { get; protected set; }
/// <summary>
/// 用户名
/// </summary>
public virtual string UserName { get; protected set; }
/// <summary>
/// 性别
/// </summary>
public virtual Sex Sex { get; set; }
/// <summary>
/// 签名
/// </summary>
public virtual string Sign { get; set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 说明
/// </summary>
public virtual string Description { get; set; }
/// <summary>
/// 头像地址
/// </summary>
public virtual string AvatarUrl { get; protected set; }
/// <summary>
/// 生日
/// </summary>
public virtual DateTime? Birthday { get; protected set; }
/// <summary>
/// 年龄
/// </summary>
public virtual int Age { get; protected set; }
public virtual DateTime? LastOnlineTime { get; protected set; }
public virtual UserOnlineState State { get; protected set; }
protected UserChatCard()
{
}
public UserChatCard(
Guid userId,
string userName,
Sex sex,
string nickName = null,
string avatarUrl = "",
Guid? tenantId = null)
{
Sex = sex;
UserId = userId;
UserName = userName;
NickName = nickName ?? userName;
AvatarUrl = avatarUrl;
TenantId = tenantId;
}
public void SetBirthday(DateTime birthday, IClock clock)
{
Birthday = birthday;
Age = DateTimeHelper.CalcAgrByBirthdate(birthday, clock.Now);
}
public void SetAvatarUrl(string url)
{
AvatarUrl = url;
}
public void ChangeState(IClock clock, UserOnlineState state)
{
State = state;
if (State == UserOnlineState.Online)
{
LastOnlineTime = clock.Now;
}
}
public UserCard ToUserCard()
{
return new UserCard
{
Age = Age,
AvatarUrl = AvatarUrl,
Birthday = Birthday,
Description = Description,
NickName = NickName,
Sex = Sex,
Sign = Sign,
UserId = UserId,
UserName = UserName,
TenantId = TenantId,
Online = State == UserOnlineState.Online,
};
}
}
}

31
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IGroupRepository.cs

@ -1,31 +0,0 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.MessageService.Group
{
public interface IGroupRepository : IBasicRepository<ChatGroup, long>
{
/// <summary>
/// 用户是否已被拉黑
/// </summary>
/// <param name="id"></param>
/// <param name="formUserId"></param>
/// <returns></returns>
Task<bool> UserHasBlackedAsync(
long id,
Guid formUserId,
CancellationToken cancellationToken = default);
Task<ChatGroup> FindByIdAsync(
long id,
CancellationToken cancellationToken = default);
Task<List<UserGroupCard>> GetGroupAdminAsync(
long id,
CancellationToken cancellationToken = default);
}
}

154
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/ChatGroup.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/ChatGroup.cs

@ -1,75 +1,79 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Group
{
/// <summary>
/// 聊天群组
/// </summary>
public class ChatGroup : AuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 群主
/// </summary>
public virtual Guid AdminUserId { get; protected set; }
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
/// <summary>
/// 群组名称
/// </summary>
public virtual string Name { get; protected set; }
/// <summary>
/// 群组标记
/// </summary>
public virtual string Tag { get; protected set; }
/// <summary>
/// 群组地址
/// </summary>
public virtual string Address { get; set; }
/// <summary>
/// 群组公告
/// </summary>
public virtual string Notice { get; set; }
/// <summary>
/// 最大用户数量
/// </summary>
public virtual int MaxUserCount { get; protected set; }
/// <summary>
/// 允许匿名聊天
/// </summary>
public virtual bool AllowAnonymous { get; set; }
/// <summary>
/// 允许发送消息
/// </summary>
public virtual bool AllowSendMessage { get; set; }
/// <summary>
/// 群组说明
/// </summary>
public virtual string Description { get; set; }
protected ChatGroup()
{
}
public ChatGroup(
long id,
Guid adminUserId,
string name,
string tag = "",
string address = "",
int maxUserCount = 200)
{
GroupId = id;
AdminUserId = adminUserId;
Name = name;
Tag = tag;
Address = address;
MaxUserCount = maxUserCount;
}
}
}
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Groups
{
/// <summary>
/// 聊天群组
/// </summary>
public class ChatGroup : AuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 群主
/// </summary>
public virtual Guid AdminUserId { get; protected set; }
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
/// <summary>
/// 群组名称
/// </summary>
public virtual string Name { get; protected set; }
/// <summary>
/// 群组标记
/// </summary>
public virtual string Tag { get; protected set; }
/// <summary>
/// 群组地址
/// </summary>
public virtual string Address { get; set; }
/// <summary>
/// 群组公告
/// </summary>
public virtual string Notice { get; set; }
/// <summary>
/// 最大用户数量
/// </summary>
public virtual int MaxUserCount { get; protected set; }
/// <summary>
/// 允许匿名聊天
/// </summary>
public virtual bool AllowAnonymous { get; set; }
/// <summary>
/// 允许发送消息
/// </summary>
public virtual bool AllowSendMessage { get; set; }
/// <summary>
/// 群组说明
/// </summary>
public virtual string Description { get; set; }
/// <summary>
/// 群组头像地址
/// </summary>
public virtual string AvatarUrl { get; set; }
protected ChatGroup()
{
}
public ChatGroup(
long id,
Guid adminUserId,
string name,
string tag = "",
string address = "",
int maxUserCount = 200)
{
GroupId = id;
AdminUserId = adminUserId;
Name = name;
Tag = tag;
Address = address;
MaxUserCount = maxUserCount;
}
}
}

64
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/GroupChatBlack.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupChatBlack.cs

@ -1,32 +1,32 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Group
{
/// <summary>
/// 用户黑名单
/// </summary>
public class GroupChatBlack : CreationAuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
/// <summary>
/// 拉黑的用户
/// </summary>
public virtual Guid ShieldUserId { get; protected set; }
protected GroupChatBlack() { }
public GroupChatBlack(long groupId, Guid shieldUserId, Guid? tenantId)
{
GroupId = groupId;
ShieldUserId = shieldUserId;
TenantId = tenantId;
}
}
}
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Groups
{
/// <summary>
/// 用户黑名单
/// </summary>
public class GroupChatBlack : CreationAuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
/// <summary>
/// 拉黑的用户
/// </summary>
public virtual Guid ShieldUserId { get; protected set; }
protected GroupChatBlack() { }
public GroupChatBlack(long groupId, Guid shieldUserId, Guid? tenantId)
{
GroupId = groupId;
ShieldUserId = shieldUserId;
TenantId = tenantId;
}
}
}

50
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/GroupMessage.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupMessage.cs

@ -1,25 +1,25 @@
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Chat;
using System;
namespace LINGYUN.Abp.MessageService.Group
{
public class GroupMessage : Message
{
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
protected GroupMessage() { }
public GroupMessage(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text)
: base(id, sendUserId, sendUserName, content, type)
{
}
public void SendToGroup(long groupId)
{
GroupId = groupId;
}
}
}
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Chat;
using System;
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupMessage : Message
{
/// <summary>
/// 群组标识
/// </summary>
public virtual long GroupId { get; protected set; }
protected GroupMessage() { }
public GroupMessage(long id, Guid sendUserId, string sendUserName, string content, MessageType type = MessageType.Text)
: base(id, sendUserId, sendUserName, content, type)
{
}
public void SendToGroup(long groupId)
{
GroupId = groupId;
}
}
}

72
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/GroupStore.cs

@ -0,0 +1,72 @@
using LINGYUN.Abp.IM.Groups;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
namespace LINGYUN.Abp.MessageService.Groups
{
public class GroupStore : IGroupStore, ITransientDependency
{
private readonly IObjectMapper _objectMapper;
private readonly ICurrentTenant _currentTenant;
private readonly IGroupRepository _groupRepository;
public GroupStore(
IObjectMapper objectMapper,
ICurrentTenant currentTenant,
IGroupRepository groupRepository)
{
_objectMapper = objectMapper;
_currentTenant = currentTenant;
_groupRepository = groupRepository;
}
public virtual async Task<Group> GetAsync(
Guid? tenantId,
string groupId,
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
var group = await _groupRepository.FindByIdAsync(long.Parse(groupId), cancellationToken);
return _objectMapper.Map<ChatGroup, Group>(group);
}
}
public virtual async Task<int> GetCountAsync(
Guid? tenantId,
string filter = null,
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
return await _groupRepository.GetCountAsync(filter, cancellationToken);
}
}
public virtual async Task<List<Group>> GetListAsync(
Guid? tenantId,
string filter = null,
string sorting = nameof(Group.Name),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
using (_currentTenant.Change(tenantId))
{
var groups = await _groupRepository.GetListAsync(
filter,
sorting,
skipCount,
maxResultCount,
cancellationToken);
return _objectMapper.Map<List<ChatGroup>, List<Group>>(groups);
}
}
}
}

55
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IGroupRepository.cs

@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.MessageService.Groups
{
public interface IGroupRepository : IBasicRepository<ChatGroup, long>
{
/// <summary>
/// 用户是否已被拉黑
/// </summary>
/// <param name="id"></param>
/// <param name="formUserId"></param>
/// <returns></returns>
Task<bool> UserHasBlackedAsync(
long id,
Guid formUserId,
CancellationToken cancellationToken = default);
Task<ChatGroup> FindByIdAsync(
long id,
CancellationToken cancellationToken = default);
Task<List<UserGroupCard>> GetGroupAdminAsync(
long id,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群组数
/// </summary>
/// <param name="filter"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<int> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取群组列表
/// </summary>
/// <param name="filter"></param>
/// <param name="sorting"></param>
/// <param name="skipCount"></param>
/// <param name="maxResultCount"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<ChatGroup>> GetListAsync(
string filter = null,
string sorting = nameof(ChatGroup.Name),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
}
}

38
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IGroupRepositoryExtensions.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IGroupRepositoryExtensions.cs

@ -1,19 +1,19 @@
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.MessageService.Group
{
public static class IGroupRepositoryExtensions
{
public static async Task<ChatGroup> GetByIdAsync(
this IGroupRepository repository,
long id,
CancellationToken cancellationToken = default)
{
var group = await repository.FindByIdAsync(id, cancellationToken);
return group ?? throw new BusinessException(MessageServiceErrorCodes.GroupNotFount);
}
}
}
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.MessageService.Groups
{
public static class IGroupRepositoryExtensions
{
public static async Task<ChatGroup> GetByIdAsync(
this IGroupRepository repository,
long id,
CancellationToken cancellationToken = default)
{
var group = await repository.FindByIdAsync(id, cancellationToken);
return group ?? throw new BusinessException(MessageServiceErrorCodes.GroupNotFount);
}
}
}

14
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/IUserChatGroupRepository.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/IUserChatGroupRepository.cs

@ -1,11 +1,11 @@
using LINGYUN.Abp.IM.Group;
using LINGYUN.Abp.IM.Groups;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories;
namespace LINGYUN.Abp.MessageService.Group
namespace LINGYUN.Abp.MessageService.Groups
{
public interface IUserChatGroupRepository : IBasicRepository<UserChatGroup, long>
{
@ -16,7 +16,7 @@ namespace LINGYUN.Abp.MessageService.Group
/// <param name="userId"></param>
/// <returns></returns>
Task<bool> MemberHasInGroupAsync(
long groupId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default);
/// <summary>
@ -27,7 +27,7 @@ namespace LINGYUN.Abp.MessageService.Group
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<GroupUserCard> GetMemberAsync(
long groupId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default);
/// <summary>
@ -49,9 +49,9 @@ namespace LINGYUN.Abp.MessageService.Group
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<GroupUserCard>> GetMembersAsync(
long groupId,
long groupId,
string sorting = nameof(GroupUserCard.UserId),
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default);
/// <summary>
@ -60,7 +60,7 @@ namespace LINGYUN.Abp.MessageService.Group
/// <param name="userId"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<List<LINGYUN.Abp.IM.Group.Group>> GetMemberGroupsAsync(
Task<List<Group>> GetMemberGroupsAsync(
Guid userId,
CancellationToken cancellationToken = default);
/// <summary>

54
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserChatGroup.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserChatGroup.cs

@ -1,27 +1,27 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Group
{
/// <summary>
/// 用户群组
/// </summary>
public class UserChatGroup : CreationAuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
public virtual Guid UserId { get; protected set; }
public virtual long GroupId { get; protected set; }
protected UserChatGroup() { }
public UserChatGroup(long groupId, Guid userId, Guid acceptUserId, Guid? tenantId = null)
{
UserId = userId;
GroupId = groupId;
CreatorId = acceptUserId;
TenantId = tenantId;
}
}
}
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.MessageService.Groups
{
/// <summary>
/// 用户群组
/// </summary>
public class UserChatGroup : CreationAuditedEntity<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
public virtual Guid UserId { get; protected set; }
public virtual long GroupId { get; protected set; }
protected UserChatGroup() { }
public UserChatGroup(long groupId, Guid userId, Guid acceptUserId, Guid? tenantId = null)
{
UserId = userId;
GroupId = groupId;
CreatorId = acceptUserId;
TenantId = tenantId;
}
}
}

148
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupCard.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserGroupCard.cs

@ -1,74 +1,74 @@
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.MessageService.Group
{
/// <summary>
/// 用户群组卡片
/// </summary>
public class UserGroupCard : AuditedAggregateRoot<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 用户标识
/// </summary>
public virtual Guid UserId { get; protected set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 是否管理员
/// </summary>
public virtual bool IsAdmin { get; protected set; }
/// <summary>
/// 禁言期止
/// </summary>
public virtual DateTime? SilenceEnd { get; protected set; }
protected UserGroupCard()
{
}
public UserGroupCard(
Guid userId,
string nickName = "",
bool isAdmin = false,
DateTime? silenceEnd = null,
Guid? tenantId = null)
{
UserId = userId;
NickName = nickName;
IsAdmin = isAdmin;
SilenceEnd = silenceEnd;
TenantId = tenantId;
}
/// <summary>
/// 设置管理员
/// </summary>
/// <param name="admin"></param>
public void SetAdmin(bool admin)
{
IsAdmin = admin;
}
/// <summary>
/// 禁言
/// </summary>
/// <param name="clock"></param>
/// <param name="seconds"></param>
public void Silence(IClock clock, double seconds)
{
SilenceEnd = clock.Now.AddSeconds(seconds);
}
/// <summary>
/// 解除禁言
/// </summary>
public void UnSilence()
{
SilenceEnd = null;
}
}
}
using System;
using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.MessageService.Groups
{
/// <summary>
/// 用户群组卡片
/// </summary>
public class UserGroupCard : AuditedAggregateRoot<long>, IMultiTenant
{
/// <summary>
/// 租户
/// </summary>
public virtual Guid? TenantId { get; protected set; }
/// <summary>
/// 用户标识
/// </summary>
public virtual Guid UserId { get; protected set; }
/// <summary>
/// 昵称
/// </summary>
public virtual string NickName { get; set; }
/// <summary>
/// 是否管理员
/// </summary>
public virtual bool IsAdmin { get; protected set; }
/// <summary>
/// 禁言期止
/// </summary>
public virtual DateTime? SilenceEnd { get; protected set; }
protected UserGroupCard()
{
}
public UserGroupCard(
Guid userId,
string nickName = "",
bool isAdmin = false,
DateTime? silenceEnd = null,
Guid? tenantId = null)
{
UserId = userId;
NickName = nickName;
IsAdmin = isAdmin;
SilenceEnd = silenceEnd;
TenantId = tenantId;
}
/// <summary>
/// 设置管理员
/// </summary>
/// <param name="admin"></param>
public void SetAdmin(bool admin)
{
IsAdmin = admin;
}
/// <summary>
/// 禁言
/// </summary>
/// <param name="clock"></param>
/// <param name="seconds"></param>
public void Silence(IClock clock, double seconds)
{
SilenceEnd = clock.Now.AddSeconds(seconds);
}
/// <summary>
/// 解除禁言
/// </summary>
public void UnSilence()
{
SilenceEnd = null;
}
}
}

34
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Group/UserGroupStore.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Groups/UserGroupStore.cs

@ -1,29 +1,25 @@
using LINGYUN.Abp.IM.Group;
using LINGYUN.Abp.IM.Groups;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.ObjectMapping;
using Volo.Abp.Uow;
namespace LINGYUN.Abp.MessageService.Group
namespace LINGYUN.Abp.MessageService.Groups
{
public class UserGroupStore : IUserGroupStore, ITransientDependency
{
private readonly IObjectMapper _objectMapper;
private readonly ICurrentTenant _currentTenant;
private readonly IUnitOfWorkManager _unitOfWorkManager;
private readonly IUserChatGroupRepository _userChatGroupRepository;
public UserGroupStore(
IObjectMapper objectMapper,
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager,
IUserChatGroupRepository userChatGroupRepository)
{
_objectMapper = objectMapper;
_currentTenant = currentTenant;
_unitOfWorkManager = unitOfWorkManager;
_userChatGroupRepository = userChatGroupRepository;
@ -42,9 +38,9 @@ namespace LINGYUN.Abp.MessageService.Group
}
public virtual async Task AddUserToGroupAsync(
Guid? tenantId,
Guid userId,
long groupId,
Guid? tenantId,
Guid userId,
long groupId,
Guid acceptUserId,
CancellationToken cancellationToken = default)
{
@ -66,8 +62,8 @@ namespace LINGYUN.Abp.MessageService.Group
}
public async Task<GroupUserCard> GetUserGroupCardAsync(
Guid? tenantId,
long groupId,
Guid? tenantId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default)
{
@ -80,7 +76,7 @@ namespace LINGYUN.Abp.MessageService.Group
}
public async Task<IEnumerable<GroupUserCard>> GetMembersAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
CancellationToken cancellationToken = default)
{
@ -90,8 +86,8 @@ namespace LINGYUN.Abp.MessageService.Group
}
}
public async Task<IEnumerable<LINGYUN.Abp.IM.Group.Group>> GetUserGroupsAsync(
Guid? tenantId,
public async Task<IEnumerable<Group>> GetUserGroupsAsync(
Guid? tenantId,
Guid userId,
CancellationToken cancellationToken = default)
{
@ -102,8 +98,8 @@ namespace LINGYUN.Abp.MessageService.Group
}
public async Task RemoveUserFormGroupAsync(
Guid? tenantId,
Guid userId,
Guid? tenantId,
Guid userId,
long groupId,
CancellationToken cancellationToken = default)
{
@ -130,10 +126,10 @@ namespace LINGYUN.Abp.MessageService.Group
}
public async Task<List<GroupUserCard>> GetMembersAsync(
Guid? tenantId,
Guid? tenantId,
long groupId,
string sorting = nameof(GroupUserCard.UserId),
int skipCount = 0,
string sorting = nameof(GroupUserCard.UserId),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{

158
aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Mapper/MessageServiceDomainAutoMapperProfile.cs

@ -1,77 +1,81 @@
using AutoMapper;
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using LINGYUN.Abp.Notifications;
using Newtonsoft.Json;
using System;
using Volo.Abp.AutoMapper;
using Volo.Abp.Data;
namespace LINGYUN.Abp.MessageService.Mapper
{
public class MessageServiceDomainAutoMapperProfile : Profile
{
public MessageServiceDomainAutoMapperProfile()
{
//CreateMap<Notification, NotificationInfo>()
// .ForMember(dto => dto.Id, map => map.MapFrom(src => src.NotificationId))
// .ForMember(dto => dto.Name, map => map.MapFrom(src => src.NotificationName))
// .ForMember(dto => dto.Lifetime, map => map.Ignore())
// .ForMember(dto => dto.Type, map => map.MapFrom(src => src.Type))
// .ForMember(dto => dto.Severity, map => map.MapFrom(src => src.Severity))
// .ForMember(dto => dto.Data, map => map.MapFrom((src, nfi) =>
// {
// var dataType = Type.GetType(src.NotificationTypeName);
// var data = JsonConvert.DeserializeObject(src.NotificationData, dataType);
// if(data != null && data is NotificationData notificationData)
// {
// if (notificationData.NeedLocalizer())
// {
// var title = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("title").ToString());
// var message = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("message").ToString());
// notificationData.TrySetData("title", title);
// notificationData.TrySetData("message", message);
// }
// return notificationData;
// }
// return new NotificationData();
// }));
CreateMap<Notification, NotificationInfo>()
.ConvertUsing<NotificationTypeConverter>();
CreateMap<UserSubscribe, NotificationSubscriptionInfo>();
CreateMessageMap<GroupMessage, ChatMessage>()
.ForMember(dto => dto.Content, map => map.MapFrom(src => src.Content))
.ForMember(dto => dto.GroupId, map => map.MapFrom(src => src.GroupId.ToString()))
.Ignore(dto => dto.ToUserId);
CreateMessageMap<UserMessage, ChatMessage>()
.ForMember(dto => dto.ToUserId, map => map.MapFrom(src => src.ReceiveUserId))
.Ignore(dto => dto.GroupId);
CreateMessageMap<UserMessage, LastChatMessage>()
.ForMember(dto => dto.ToUserId, map => map.MapFrom(src => src.ReceiveUserId))
.Ignore(dto => dto.GroupId);
}
protected IMappingExpression<TSource, TDestination> CreateMessageMap<TSource, TDestination>()
where TSource : Message
where TDestination : ChatMessage
{
return CreateMap<TSource, TDestination>()
.ForMember(dto => dto.Content, map => map.MapFrom(src => src.Content))
.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.MapFrom(src => src.GetProperty(nameof(ChatMessage.IsAnonymous), false)))
.MapExtraProperties();
}
}
}
using AutoMapper;
using LINGYUN.Abp.IM.Groups;
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Groups;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using LINGYUN.Abp.Notifications;
using Volo.Abp.AutoMapper;
using Volo.Abp.Data;
namespace LINGYUN.Abp.MessageService.Mapper
{
public class MessageServiceDomainAutoMapperProfile : Profile
{
public MessageServiceDomainAutoMapperProfile()
{
//CreateMap<Notification, NotificationInfo>()
// .ForMember(dto => dto.Id, map => map.MapFrom(src => src.NotificationId))
// .ForMember(dto => dto.Name, map => map.MapFrom(src => src.NotificationName))
// .ForMember(dto => dto.Lifetime, map => map.Ignore())
// .ForMember(dto => dto.Type, map => map.MapFrom(src => src.Type))
// .ForMember(dto => dto.Severity, map => map.MapFrom(src => src.Severity))
// .ForMember(dto => dto.Data, map => map.MapFrom((src, nfi) =>
// {
// var dataType = Type.GetType(src.NotificationTypeName);
// var data = JsonConvert.DeserializeObject(src.NotificationData, dataType);
// if(data != null && data is NotificationData notificationData)
// {
// if (notificationData.NeedLocalizer())
// {
// var title = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("title").ToString());
// var message = JsonConvert.DeserializeObject<LocalizableStringInfo>(notificationData.TryGetData("message").ToString());
// notificationData.TrySetData("title", title);
// notificationData.TrySetData("message", message);
// }
// return notificationData;
// }
// return new NotificationData();
// }));
CreateMap<Notification, NotificationInfo>()
.ConvertUsing<NotificationTypeConverter>();
CreateMap<UserSubscribe, NotificationSubscriptionInfo>();
CreateMessageMap<GroupMessage, ChatMessage>()
.ForMember(dto => dto.Content, map => map.MapFrom(src => src.Content))
.ForMember(dto => dto.GroupId, map => map.MapFrom(src => src.GroupId.ToString()))
.Ignore(dto => dto.ToUserId);
CreateMessageMap<UserMessage, ChatMessage>()
.ForMember(dto => dto.ToUserId, map => map.MapFrom(src => src.ReceiveUserId))
.Ignore(dto => dto.GroupId);
CreateMessageMap<UserMessage, LastChatMessage>()
.ForMember(dto => dto.ToUserId, map => map.MapFrom(src => src.ReceiveUserId))
.Ignore(dto => dto.GroupId);
CreateMap<ChatGroup, Group>()
.ForMember(g => g.Id, map => map.MapFrom(src => src.GroupId.ToString()))
.ForMember(g => g.MaxUserLength, map => map.MapFrom(src => src.MaxUserCount))
.Ignore(g => g.GroupUserCount);
}
protected IMappingExpression<TSource, TDestination> CreateMessageMap<TSource, TDestination>()
where TSource : Message
where TDestination : ChatMessage
{
return CreateMap<TSource, TDestination>()
.ForMember(dto => dto.Content, map => map.MapFrom(src => src.Content))
.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.MapFrom(src => src.GetProperty(nameof(ChatMessage.IsAnonymous), false)))
.MapExtraProperties();
}
}
}

42
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreMessageRepository.cs

@ -1,6 +1,6 @@
using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Groups;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
@ -18,7 +18,7 @@ namespace LINGYUN.Abp.MessageService.Chat
IMessageRepository, ITransientDependency
{
public EfCoreMessageRepository(
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
@ -34,11 +34,11 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<List<GroupMessage>> GetGroupMessagesAsync(
long groupId,
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
@ -57,8 +57,8 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<long> GetGroupMessagesCountAsync(
long groupId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
var groupMessagesCount = await (await GetDbContextAsync()).Set<GroupMessage>()
@ -71,12 +71,12 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<List<GroupMessage>> GetUserGroupMessagesAsync(
Guid sendUserId,
Guid sendUserId,
long groupId,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
@ -94,10 +94,10 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<long> GetUserGroupMessagesCountAsync(
Guid sendUserId,
long groupId,
string filter = "",
Guid sendUserId,
long groupId,
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
var groupMessagesCount = await (await GetDbContextAsync()).Set<GroupMessage>()
@ -110,8 +110,8 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<long> GetCountAsync(
long groupId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
return await (await GetDbContextAsync()).Set<GroupMessage>()
@ -124,8 +124,8 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<long> GetCountAsync(
Guid sendUserId,
Guid receiveUserId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
return await (await GetDbContextAsync()).Set<UserMessage>()
@ -146,15 +146,17 @@ namespace LINGYUN.Abp.MessageService.Chat
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<LastChatMessage>> GetLastMessagesByOneFriendAsync(
public virtual async Task<List<LastChatMessage>> GetLastMessagesAsync(
Guid userId,
MessageState? state = null,
string sorting = nameof(LastChatMessage.SendTime),
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var groupMsgQuery = dbContext.Set<UserMessage>()
.Where(msg => msg.ReceiveUserId == userId || msg.CreatorId == userId)
.Where(msg => msg.ReceiveUserId == userId)
.WhereIf(state.HasValue, x => x.SendState == state)
.GroupBy(msg => new { msg.CreatorId, msg.ReceiveUserId })
.Select(msg => new
{
@ -187,10 +189,10 @@ namespace LINGYUN.Abp.MessageService.Chat
public virtual async Task<List<UserMessage>> GetUserMessagesAsync(
Guid sendUserId,
Guid receiveUserId,
MessageType? type = null,
string filter = "",
string sorting = nameof(UserMessage.MessageId),
MessageType? type = null,
int skipCount = 0,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
@ -208,10 +210,10 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<long> GetUserMessagesCountAsync(
Guid sendUserId,
Guid sendUserId,
Guid receiveUserId,
string filter = "",
MessageType? type = null,
string filter = "",
CancellationToken cancellationToken = default)
{
var userMessagesCount = await (await GetDbContextAsync()).Set<UserMessage>()

27
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatCardRepository.cs

@ -15,11 +15,20 @@ namespace LINGYUN.Abp.MessageService.Chat
public class EfCoreUserChatCardRepository : EfCoreRepository<IMessageServiceDbContext, UserChatCard, long>, IUserChatCardRepository
{
public EfCoreUserChatCardRepository(
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<UserChatCard> FindByUserIdAsync(
Guid userId,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(ucc => ucc.UserId == userId)
.FirstAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<bool> CheckUserIdExistsAsync(Guid userId, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
@ -36,8 +45,8 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<int> GetMemberCountAsync(
string findUserName = "",
int? startAge = null,
string findUserName = "",
int? startAge = null,
int? endAge = null,
Sex? sex = null,
CancellationToken cancellationToken = default)
@ -46,18 +55,18 @@ namespace LINGYUN.Abp.MessageService.Chat
.WhereIf(!findUserName.IsNullOrWhiteSpace(), ucc => ucc.UserName.Contains(findUserName))
.WhereIf(startAge.HasValue, ucc => ucc.Age >= startAge.Value)
.WhereIf(endAge.HasValue, ucc => ucc.Age <= endAge.Value)
.WhereIf(sex.HasValue, ucc => ucc.Sex == sex)
.WhereIf(sex.HasValue, ucc => ucc.Sex == sex)
.CountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<UserCard>> GetMembersAsync(
string findUserName = "",
string findUserName = "",
int? startAge = null,
int? endAge = null,
Sex? sex = null,
int? endAge = null,
Sex? sex = null,
string sorting = nameof(UserChatCard.UserId),
int skipCount = 0,
int maxResultCount = 10,
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())

27
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatFriendRepository.cs

@ -1,4 +1,5 @@
using LINGYUN.Abp.IM.Contract;
using LINGYUN.Abp.IM;
using LINGYUN.Abp.IM.Contract;
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
@ -15,7 +16,7 @@ namespace LINGYUN.Abp.MessageService.Chat
public class EfCoreUserChatFriendRepository : EfCoreRepository<IMessageServiceDbContext, UserChatFriend, long>, IUserChatFriendRepository
{
public EfCoreUserChatFriendRepository(
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
@ -54,7 +55,8 @@ namespace LINGYUN.Abp.MessageService.Chat
SpecialFocus = ucf.SpecialFocus,
TenantId = ucf.TenantId,
UserId = ucf.UserId,
UserName = ucc.UserName
UserName = ucc.UserName,
Online = ucc.State == UserOnlineState.Online,
};
return await userFriendQuery
@ -85,7 +87,8 @@ namespace LINGYUN.Abp.MessageService.Chat
SpecialFocus = ucf.SpecialFocus,
TenantId = ucf.TenantId,
UserId = ucf.UserId,
UserName = ucc.UserName
UserName = ucc.UserName,
Online = ucc.State == UserOnlineState.Online,
};
return await userFriendQuery
@ -93,11 +96,11 @@ namespace LINGYUN.Abp.MessageService.Chat
}
public virtual async Task<List<UserFriend>> GetMembersAsync(
Guid userId,
string filter = "",
string sorting = nameof(UserChatFriend.UserId),
int skipCount = 0,
int maxResultCount = 10,
Guid userId,
string filter = "",
string sorting = nameof(UserChatFriend.UserId),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
@ -131,7 +134,8 @@ namespace LINGYUN.Abp.MessageService.Chat
SpecialFocus = ucf.SpecialFocus,
TenantId = ucf.TenantId,
UserId = ucf.UserId,
UserName = ucc.UserName
UserName = ucc.UserName,
Online = ucc.State == UserOnlineState.Online,
};
return await userFriendQuery
@ -173,7 +177,8 @@ namespace LINGYUN.Abp.MessageService.Chat
SpecialFocus = ucf.SpecialFocus,
TenantId = ucf.TenantId,
UserId = ucf.UserId,
UserName = ucc.UserName
UserName = ucc.UserName,
Online = ucc.State == UserOnlineState.Online,
};
return await userFriendQuery

70
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/AbpMessageServiceEntityFrameworkCoreModule.cs

@ -1,35 +1,35 @@
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[DependsOn(
typeof(AbpMessageServiceDomainModule),
typeof(AbpEntityFrameworkCoreModule))]
public class AbpMessageServiceEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<MessageServiceDbContext>(options =>
{
options.AddRepository<Notification, EfCoreNotificationRepository>();
options.AddRepository<UserNotification, EfCoreUserNotificationRepository>();
options.AddRepository<UserSubscribe, EfCoreUserSubscribeRepository>();
options.AddRepository<ChatGroup, EfCoreGroupRepository>();
options.AddRepository<UserChatGroup, EfCoreUserChatGroupRepository>();
options.AddRepository<UserChatCard, EfCoreUserChatCardRepository>();
options.AddRepository<UserChatSetting, EfCoreUserChatSettingRepository>();
options.AddRepository<UserChatFriend, EfCoreUserChatFriendRepository>();
options.AddDefaultRepositories(includeAllEntities: true);
});
}
}
}
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Groups;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[DependsOn(
typeof(AbpMessageServiceDomainModule),
typeof(AbpEntityFrameworkCoreModule))]
public class AbpMessageServiceEntityFrameworkCoreModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAbpDbContext<MessageServiceDbContext>(options =>
{
options.AddRepository<Notification, EfCoreNotificationRepository>();
options.AddRepository<UserNotification, EfCoreUserNotificationRepository>();
options.AddRepository<UserSubscribe, EfCoreUserSubscribeRepository>();
options.AddRepository<ChatGroup, EfCoreGroupRepository>();
options.AddRepository<UserChatGroup, EfCoreUserChatGroupRepository>();
options.AddRepository<UserChatCard, EfCoreUserChatCardRepository>();
options.AddRepository<UserChatSetting, EfCoreUserChatSettingRepository>();
options.AddRepository<UserChatFriend, EfCoreUserChatFriendRepository>();
options.AddDefaultRepositories(includeAllEntities: true);
});
}
}
}

30
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/IMessageServiceDbContext.cs

@ -1,15 +1,15 @@
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Group;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[ConnectionStringName(AbpMessageServiceDbProperties.ConnectionStringName)]
public interface IMessageServiceDbContext : IEfCoreDbContext
{
DbSet<UserChatCard> UserChatCards { get; set; }
DbSet<UserGroupCard> UserGroupCards { get; set; }
}
}
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Groups;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[ConnectionStringName(AbpMessageServiceDbProperties.ConnectionStringName)]
public interface IMessageServiceDbContext : IEfCoreDbContext
{
DbSet<UserChatCard> UserChatCards { get; set; }
DbSet<UserGroupCard> UserGroupCards { get; set; }
}
}

60
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/MessageServiceDbContext.cs

@ -1,30 +1,30 @@
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Group;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[ConnectionStringName(AbpMessageServiceDbProperties.ConnectionStringName)]
public class MessageServiceDbContext : AbpDbContext<MessageServiceDbContext>, IMessageServiceDbContext
{
public DbSet<UserChatCard> UserChatCards { get; set; }
public DbSet<UserGroupCard> UserGroupCards { get; set; }
public MessageServiceDbContext(DbContextOptions<MessageServiceDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ConfigureMessageService(options =>
{
options.TablePrefix = AbpMessageServiceDbProperties.DefaultTablePrefix;
options.Schema = AbpMessageServiceDbProperties.DefaultSchema;
});
base.OnModelCreating(modelBuilder);
}
}
}
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Groups;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
[ConnectionStringName(AbpMessageServiceDbProperties.ConnectionStringName)]
public class MessageServiceDbContext : AbpDbContext<MessageServiceDbContext>, IMessageServiceDbContext
{
public DbSet<UserChatCard> UserChatCards { get; set; }
public DbSet<UserGroupCard> UserGroupCards { get; set; }
public MessageServiceDbContext(DbContextOptions<MessageServiceDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ConfigureMessageService(options =>
{
options.TablePrefix = AbpMessageServiceDbProperties.DefaultTablePrefix;
options.Schema = AbpMessageServiceDbProperties.DefaultSchema;
});
base.OnModelCreating(modelBuilder);
}
}
}

381
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/EntityFrameworkCore/MessageServiceDbContextModelCreatingExtensions.cs

@ -1,190 +1,191 @@
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Group;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using Microsoft.EntityFrameworkCore;
using System;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
public static class MessageServiceDbContextModelCreatingExtensions
{
public static void ConfigureMessageService(
this ModelBuilder builder,
Action<MessageServiceModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new MessageServiceModelBuilderConfigurationOptions();
optionsAction?.Invoke(options);
builder.Entity<Notification>(b =>
{
b.ToTable(options.TablePrefix + "Notifications", options.Schema);
b.Property(p => p.NotificationName).HasMaxLength(NotificationConsts.MaxNameLength).IsRequired();
b.Property(p => p.NotificationTypeName).HasMaxLength(NotificationConsts.MaxTypeNameLength).IsRequired();
b.Property(p => p.NotificationData).HasMaxLength(NotificationConsts.MaxDataLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.NotificationName });
});
builder.Entity<UserNotification>(b =>
{
b.ToTable(options.TablePrefix + "UserNotifications", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.NotificationId })
.HasName("IX_Tenant_User_Notification_Id");
});
builder.Entity<UserSubscribe>(b =>
{
b.ToTable(options.TablePrefix + "UserSubscribes", options.Schema);
b.Property(p => p.NotificationName).HasMaxLength(SubscribeConsts.MaxNotificationNameLength).IsRequired();
b.Property(p => p.UserName)
.HasMaxLength(SubscribeConsts.MaxUserNameLength)
.HasDefaultValue("/")// 不是必须的
.IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.NotificationName })
.HasName("IX_Tenant_User_Notification_Name")
.IsUnique();
});
builder.Entity<UserMessage>(b =>
{
b.ToTable(options.TablePrefix + "UserMessages", options.Schema);
b.Property(p => p.SendUserName).HasMaxLength(MessageConsts.MaxSendUserNameLength).IsRequired();
b.Property(p => p.Content).HasMaxLength(MessageConsts.MaxContentLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.ReceiveUserId });
});
builder.Entity<GroupMessage>(b =>
{
b.ToTable(options.TablePrefix + "GroupMessages", options.Schema);
b.Property(p => p.SendUserName).HasMaxLength(MessageConsts.MaxSendUserNameLength).IsRequired();
b.Property(p => p.Content).HasMaxLength(MessageConsts.MaxContentLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId });
});
builder.Entity<UserChatFriend>(b =>
{
b.ToTable(options.TablePrefix + "UserChatFriends", options.Schema);
b.Property(p => p.RemarkName).HasMaxLength(UserChatFriendConsts.MaxRemarkNameLength);
b.Property(p => p.Description).HasMaxLength(UserChatFriendConsts.MaxDescriptionLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.FrientId });
});
builder.Entity<UserChatCard>(b =>
{
b.ToTable(options.TablePrefix + "UserChatCards", options.Schema);
b.Property(p => p.UserName).HasMaxLength(UserChatCardConsts.MaxUserNameLength).IsRequired();
b.Property(p => p.AvatarUrl).HasMaxLength(UserChatCardConsts.MaxAvatarUrlLength);
b.Property(p => p.Description).HasMaxLength(UserChatCardConsts.MaxDescriptionLength);
b.Property(p => p.NickName).HasMaxLength(UserChatCardConsts.MaxNickNameLength);
b.Property(p => p.Sign).HasMaxLength(UserChatCardConsts.MaxSignLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
builder.Entity<UserGroupCard>(b =>
{
b.ToTable(options.TablePrefix + "UserGroupCards", options.Schema);
b.Property(p => p.NickName).HasMaxLength(UserChatCardConsts.MaxNickNameLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
builder.Entity<UserChatSetting>(b =>
{
b.ToTable(options.TablePrefix + "UserChatSettings", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
//builder.Entity<UserSpecialFocus>(b =>
//{
// b.ToTable(options.TablePrefix + "UserSpecialFocuss", options.Schema);
// b.ConfigureMultiTenant();
// b.HasIndex(p => new { p.TenantId, p.UserId });
//});
//builder.Entity<UserChatBlack>(b =>
//{
// b.ToTable(options.TablePrefix + "UserChatBlacks", options.Schema);
// b.ConfigureMultiTenant();
// b.HasIndex(p => new { p.TenantId, p.UserId });
//});
builder.Entity<GroupChatBlack>(b =>
{
b.ToTable(options.TablePrefix + "GroupChatBlacks", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId });
});
builder.Entity<ChatGroup>(b =>
{
b.ToTable(options.TablePrefix + "ChatGroups", options.Schema);
b.Property(p => p.Name).HasMaxLength(ChatGroupConsts.MaxNameLength).IsRequired();
b.Property(p => p.Tag).HasMaxLength(ChatGroupConsts.MaxTagLength);
b.Property(p => p.Notice).HasMaxLength(ChatGroupConsts.MaxNoticeLength);
b.Property(p => p.Address).HasMaxLength(ChatGroupConsts.MaxAddressLength);
b.Property(p => p.Description).HasMaxLength(ChatGroupConsts.MaxDescriptionLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.Name });
});
builder.Entity<UserChatGroup>(b =>
{
b.ToTable(options.TablePrefix + "UserChatGroups", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId, p.UserId });
});
}
}
}
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.Groups;
using LINGYUN.Abp.MessageService.Notifications;
using LINGYUN.Abp.MessageService.Subscriptions;
using Microsoft.EntityFrameworkCore;
using System;
using Volo.Abp;
using Volo.Abp.EntityFrameworkCore.Modeling;
namespace LINGYUN.Abp.MessageService.EntityFrameworkCore
{
public static class MessageServiceDbContextModelCreatingExtensions
{
public static void ConfigureMessageService(
this ModelBuilder builder,
Action<MessageServiceModelBuilderConfigurationOptions> optionsAction = null)
{
Check.NotNull(builder, nameof(builder));
var options = new MessageServiceModelBuilderConfigurationOptions();
optionsAction?.Invoke(options);
builder.Entity<Notification>(b =>
{
b.ToTable(options.TablePrefix + "Notifications", options.Schema);
b.Property(p => p.NotificationName).HasMaxLength(NotificationConsts.MaxNameLength).IsRequired();
b.Property(p => p.NotificationTypeName).HasMaxLength(NotificationConsts.MaxTypeNameLength).IsRequired();
b.Property(p => p.NotificationData).HasMaxLength(NotificationConsts.MaxDataLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.NotificationName });
});
builder.Entity<UserNotification>(b =>
{
b.ToTable(options.TablePrefix + "UserNotifications", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.NotificationId })
.HasDatabaseName("IX_Tenant_User_Notification_Id");
});
builder.Entity<UserSubscribe>(b =>
{
b.ToTable(options.TablePrefix + "UserSubscribes", options.Schema);
b.Property(p => p.NotificationName).HasMaxLength(SubscribeConsts.MaxNotificationNameLength).IsRequired();
b.Property(p => p.UserName)
.HasMaxLength(SubscribeConsts.MaxUserNameLength)
.HasDefaultValue("/")// 不是必须的
.IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.NotificationName })
.HasDatabaseName("IX_Tenant_User_Notification_Name")
.IsUnique();
});
builder.Entity<UserMessage>(b =>
{
b.ToTable(options.TablePrefix + "UserMessages", options.Schema);
b.Property(p => p.SendUserName).HasMaxLength(MessageConsts.MaxSendUserNameLength).IsRequired();
b.Property(p => p.Content).HasMaxLength(MessageConsts.MaxContentLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.ReceiveUserId });
});
builder.Entity<GroupMessage>(b =>
{
b.ToTable(options.TablePrefix + "GroupMessages", options.Schema);
b.Property(p => p.SendUserName).HasMaxLength(MessageConsts.MaxSendUserNameLength).IsRequired();
b.Property(p => p.Content).HasMaxLength(MessageConsts.MaxContentLength).IsRequired();
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId });
});
builder.Entity<UserChatFriend>(b =>
{
b.ToTable(options.TablePrefix + "UserChatFriends", options.Schema);
b.Property(p => p.RemarkName).HasMaxLength(UserChatFriendConsts.MaxRemarkNameLength);
b.Property(p => p.Description).HasMaxLength(UserChatFriendConsts.MaxDescriptionLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId, p.FrientId });
});
builder.Entity<UserChatCard>(b =>
{
b.ToTable(options.TablePrefix + "UserChatCards", options.Schema);
b.Property(p => p.UserName).HasMaxLength(UserChatCardConsts.MaxUserNameLength).IsRequired();
b.Property(p => p.AvatarUrl).HasMaxLength(UserChatCardConsts.MaxAvatarUrlLength);
b.Property(p => p.Description).HasMaxLength(UserChatCardConsts.MaxDescriptionLength);
b.Property(p => p.NickName).HasMaxLength(UserChatCardConsts.MaxNickNameLength);
b.Property(p => p.Sign).HasMaxLength(UserChatCardConsts.MaxSignLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
builder.Entity<UserGroupCard>(b =>
{
b.ToTable(options.TablePrefix + "UserGroupCards", options.Schema);
b.Property(p => p.NickName).HasMaxLength(UserChatCardConsts.MaxNickNameLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
builder.Entity<UserChatSetting>(b =>
{
b.ToTable(options.TablePrefix + "UserChatSettings", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.UserId });
});
//builder.Entity<UserSpecialFocus>(b =>
//{
// b.ToTable(options.TablePrefix + "UserSpecialFocuss", options.Schema);
// b.ConfigureMultiTenant();
// b.HasIndex(p => new { p.TenantId, p.UserId });
//});
//builder.Entity<UserChatBlack>(b =>
//{
// b.ToTable(options.TablePrefix + "UserChatBlacks", options.Schema);
// b.ConfigureMultiTenant();
// b.HasIndex(p => new { p.TenantId, p.UserId });
//});
builder.Entity<GroupChatBlack>(b =>
{
b.ToTable(options.TablePrefix + "GroupChatBlacks", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId });
});
builder.Entity<ChatGroup>(b =>
{
b.ToTable(options.TablePrefix + "ChatGroups", options.Schema);
b.Property(p => p.Name).HasMaxLength(ChatGroupConsts.MaxNameLength).IsRequired();
b.Property(p => p.Tag).HasMaxLength(ChatGroupConsts.MaxTagLength);
b.Property(p => p.Notice).HasMaxLength(ChatGroupConsts.MaxNoticeLength);
b.Property(p => p.Address).HasMaxLength(ChatGroupConsts.MaxAddressLength);
b.Property(p => p.Description).HasMaxLength(ChatGroupConsts.MaxDescriptionLength);
b.Property(p => p.AvatarUrl).HasMaxLength(ChatGroupConsts.MaxAvatarUrlLength);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.Name });
});
builder.Entity<UserChatGroup>(b =>
{
b.ToTable(options.TablePrefix + "UserChatGroups", options.Schema);
b.ConfigureByConvention();
b.HasIndex(p => new { p.TenantId, p.GroupId, p.UserId });
});
}
}
}

142
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreGroupRepository.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Groups/EfCoreGroupRepository.cs

@ -1,58 +1,84 @@
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.Group
{
public class EfCoreGroupRepository : EfCoreRepository<IMessageServiceDbContext, ChatGroup, long>,
IGroupRepository, ITransientDependency
{
public EfCoreGroupRepository(
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<ChatGroup> FindByIdAsync(
long id,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => x.GroupId.Equals(id))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<UserGroupCard>> GetGroupAdminAsync(
long id,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var groupAdmins = await (from gp in dbContext.Set<ChatGroup>()
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
where ugc.IsAdmin
select ugc)
.ToListAsync(GetCancellationToken(cancellationToken));
return groupAdmins;
}
public virtual async Task<bool> UserHasBlackedAsync(
long id,
Guid formUserId,
CancellationToken cancellationToken = default)
{
var userHasBlack = await (await GetDbContextAsync()).Set<GroupChatBlack>()
.AnyAsync(x => x.GroupId.Equals(id) && x.ShieldUserId.Equals(formUserId), GetCancellationToken(cancellationToken));
return userHasBlack;
}
}
}
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.Groups
{
public class EfCoreGroupRepository : EfCoreRepository<IMessageServiceDbContext, ChatGroup, long>,
IGroupRepository, ITransientDependency
{
public EfCoreGroupRepository(
IDbContextProvider<IMessageServiceDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<int> GetCountAsync(
string filter = null,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x =>
x.Name.Contains(filter) || x.Tag.Contains(filter))
.CountAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<ChatGroup>> GetListAsync(
string filter = null,
string sorting = nameof(ChatGroup.Name),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.WhereIf(!filter.IsNullOrWhiteSpace(), x =>
x.Name.Contains(filter) || x.Tag.Contains(filter))
.OrderBy(sorting ?? nameof(ChatGroup.Name))
.PageBy(skipCount, maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<ChatGroup> FindByIdAsync(
long id,
CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync())
.Where(x => x.GroupId.Equals(id))
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<UserGroupCard>> GetGroupAdminAsync(
long id,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var groupAdmins = await (from gp in dbContext.Set<ChatGroup>()
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
where ugc.IsAdmin
select ugc)
.ToListAsync(GetCancellationToken(cancellationToken));
return groupAdmins;
}
public virtual async Task<bool> UserHasBlackedAsync(
long id,
Guid formUserId,
CancellationToken cancellationToken = default)
{
var userHasBlack = await (await GetDbContextAsync()).Set<GroupChatBlack>()
.AnyAsync(x => x.GroupId.Equals(id) && x.ShieldUserId.Equals(formUserId), GetCancellationToken(cancellationToken));
return userHasBlack;
}
}
}

121
aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Group/EfCoreUserChatGroupRepository.cs → aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Groups/EfCoreUserChatGroupRepository.cs

@ -1,8 +1,7 @@
using LINGYUN.Abp.IM.Group;
using LINGYUN.Abp.IM.Groups;
using LINGYUN.Abp.MessageService.Chat;
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using System;
using System.Collections.Generic;
using System.Linq;
@ -13,7 +12,7 @@ using Volo.Abp.DependencyInjection;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.Group
namespace LINGYUN.Abp.MessageService.Groups
{
public class EfCoreUserChatGroupRepository : EfCoreRepository<IMessageServiceDbContext, UserChatGroup, long>,
IUserChatGroupRepository, ITransientDependency
@ -24,72 +23,72 @@ namespace LINGYUN.Abp.MessageService.Group
}
public virtual async Task<GroupUserCard> GetMemberAsync(
long groupId,
Guid userId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var cardQuery = from gp in dbContext.Set<ChatGroup>()
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
join uc in dbContext.Set<UserChatCard>()
on ugc.UserId equals uc.UserId
where gp.GroupId == groupId && ugc.UserId == userId
select new GroupUserCard
{
TenantId = uc.TenantId,
UserId = uc.UserId,
UserName = uc.UserName,
Age = uc.Age,
AvatarUrl = uc.AvatarUrl,
IsAdmin = ugc.IsAdmin,
IsSuperAdmin = gp.AdminUserId == uc.UserId,
GroupId = gp.GroupId,
Birthday = uc.Birthday,
Description = uc.Description,
NickName = ugc.NickName ?? uc.NickName,
Sex = uc.Sex,
Sign = uc.Sign
};
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
join uc in dbContext.Set<UserChatCard>()
on ugc.UserId equals uc.UserId
where gp.GroupId == groupId && ugc.UserId == userId
select new GroupUserCard
{
TenantId = uc.TenantId,
UserId = uc.UserId,
UserName = uc.UserName,
Age = uc.Age,
AvatarUrl = uc.AvatarUrl,
IsAdmin = ugc.IsAdmin,
IsSuperAdmin = gp.AdminUserId == uc.UserId,
GroupId = gp.GroupId,
Birthday = uc.Birthday,
Description = uc.Description,
NickName = ugc.NickName ?? uc.NickName,
Sex = uc.Sex,
Sign = uc.Sign
};
return await cardQuery
.FirstOrDefaultAsync(GetCancellationToken(cancellationToken));
}
public virtual async Task<List<GroupUserCard>> GetMembersAsync(
long groupId,
string sorting = nameof(UserChatCard.UserId),
int skipCount = 0,
int maxResultCount = 10,
long groupId,
string sorting = nameof(UserChatCard.UserId),
int skipCount = 0,
int maxResultCount = 10,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
var cardQuery = from gp in dbContext.Set<ChatGroup>()
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
join uc in dbContext.Set<UserChatCard>()
on ugc.UserId equals uc.UserId
where gp.GroupId == groupId
select new GroupUserCard
{
TenantId = uc.TenantId,
UserId = uc.UserId,
UserName = uc.UserName,
Age = uc.Age,
AvatarUrl = uc.AvatarUrl,
IsAdmin = ugc.IsAdmin,
IsSuperAdmin = gp.AdminUserId == uc.UserId,
GroupId = gp.GroupId,
Birthday = uc.Birthday,
Description = uc.Description,
NickName = ugc.NickName ?? uc.NickName,
Sex = uc.Sex,
Sign = uc.Sign
};
join ucg in dbContext.Set<UserChatGroup>()
on gp.GroupId equals ucg.GroupId
join ugc in dbContext.Set<UserGroupCard>()
on ucg.UserId equals ugc.UserId
join uc in dbContext.Set<UserChatCard>()
on ugc.UserId equals uc.UserId
where gp.GroupId == groupId
select new GroupUserCard
{
TenantId = uc.TenantId,
UserId = uc.UserId,
UserName = uc.UserName,
Age = uc.Age,
AvatarUrl = uc.AvatarUrl,
IsAdmin = ugc.IsAdmin,
IsSuperAdmin = gp.AdminUserId == uc.UserId,
GroupId = gp.GroupId,
Birthday = uc.Birthday,
Description = uc.Description,
NickName = ugc.NickName ?? uc.NickName,
Sex = uc.Sex,
Sign = uc.Sign
};
return await cardQuery
.OrderBy(sorting ?? nameof(UserChatCard.UserId))
@ -98,7 +97,7 @@ namespace LINGYUN.Abp.MessageService.Group
}
public virtual async Task<int> GetMembersCountAsync(
long groupId,
long groupId,
CancellationToken cancellationToken = default)
{
var dbContext = await GetDbContextAsync();
@ -117,8 +116,8 @@ namespace LINGYUN.Abp.MessageService.Group
}
public virtual async Task<bool> MemberHasInGroupAsync(
long groupId,
Guid userId,
long groupId,
Guid userId,
CancellationToken cancellationToken = default)
{
return await (await GetDbContextAsync()).Set<UserChatGroup>()
@ -126,7 +125,7 @@ namespace LINGYUN.Abp.MessageService.Group
GetCancellationToken(cancellationToken));
}
public virtual async Task<List<IM.Group.Group>> GetMemberGroupsAsync(
public virtual async Task<List<Group>> GetMemberGroupsAsync(
Guid userId,
CancellationToken cancellationToken = default)
{
@ -137,6 +136,7 @@ namespace LINGYUN.Abp.MessageService.Group
where ucg.UserId.Equals(userId)
group ucg by new
{
gp.AvatarUrl,
gp.AllowAnonymous,
gp.AllowSendMessage,
gp.MaxUserCount,
@ -144,8 +144,9 @@ namespace LINGYUN.Abp.MessageService.Group
gp.GroupId,
}
into cg
select new IM.Group.Group
select new Group
{
AvatarUrl = cg.Key.AvatarUrl,
AllowAnonymous = cg.Key.AllowAnonymous,
AllowSendMessage = cg.Key.AllowSendMessage,
MaxUserLength = cg.Key.MaxUserCount,

51
aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs

@ -1,21 +1,30 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.MessageService
{
[DependsOn(
typeof(AbpMessageServiceApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule)
)]
public class AbpMessageServiceHttpApiModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpMessageServiceHttpApiModule).Assembly);
});
}
}
}
using LINGYUN.Abp.MessageService.Localization;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AspNetCore.Mvc;
using Volo.Abp.AspNetCore.Mvc.Localization;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.MessageService
{
[DependsOn(
typeof(AbpMessageServiceApplicationContractsModule),
typeof(AbpAspNetCoreMvcModule)
)]
public class AbpMessageServiceHttpApiModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
PreConfigure<IMvcBuilder>(mvcBuilder =>
{
mvcBuilder.AddApplicationPartIfNotExists(typeof(AbpMessageServiceHttpApiModule).Assembly);
});
PreConfigure<AbpMvcDataAnnotationsLocalizationOptions>(options =>
{
options.AddAssemblyResource(
typeof(MessageServiceResource), // 用于本地化的资源
typeof(AbpMessageServiceApplicationContractsModule).Assembly); // Dto所在程序集
});
}
}
}

114
aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Chat/MyFriendController.cs

@ -1,53 +1,61 @@
using LINGYUN.Abp.IM.Contract;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.MessageService.Chat
{
[RemoteService(Name = AbpMessageServiceConsts.RemoteServiceName)]
[Route("api/im/my-friends")]
public class MyFriendController : AbpController, IMyFriendAppService
{
protected IMyFriendAppService MyFriendAppService { get; }
public MyFriendController(IMyFriendAppService myFriendAppService)
{
MyFriendAppService = myFriendAppService;
}
[HttpPost]
public virtual async Task CreateAsync(MyFriendCreateDto input)
{
await MyFriendAppService.CreateAsync(input);
}
[HttpPost]
[Route("add-request")]
public virtual async Task AddRequestAsync(MyFriendAddRequestDto input)
{
await MyFriendAppService.AddRequestAsync(input);
}
[HttpDelete]
public virtual async Task DeleteAsync(MyFriendOperationDto input)
{
await MyFriendAppService.DeleteAsync(input);
}
[HttpGet]
[Route("all")]
public virtual async Task<ListResultDto<UserFriend>> GetAllListAsync(GetMyFriendsDto input)
{
return await MyFriendAppService.GetAllListAsync(input);
}
[HttpGet]
public virtual async Task<PagedResultDto<UserFriend>> GetListAsync(MyFriendGetByPagedDto input)
{
return await MyFriendAppService.GetListAsync(input);
}
}
}
using LINGYUN.Abp.IM.Contract;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.MessageService.Chat
{
[RemoteService(Name = AbpMessageServiceConsts.RemoteServiceName)]
[Route("api/im/my-friends")]
public class MyFriendController : AbpController, IMyFriendAppService
{
protected IMyFriendAppService MyFriendAppService { get; }
public MyFriendController(IMyFriendAppService myFriendAppService)
{
MyFriendAppService = myFriendAppService;
}
[HttpPost]
public virtual async Task CreateAsync(MyFriendCreateDto input)
{
await MyFriendAppService.CreateAsync(input);
}
[HttpPost]
[Route("add-request")]
public virtual async Task AddRequestAsync(MyFriendAddRequestDto input)
{
await MyFriendAppService.AddRequestAsync(input);
}
[HttpDelete]
public virtual async Task DeleteAsync(MyFriendOperationDto input)
{
await MyFriendAppService.DeleteAsync(input);
}
[HttpGet]
[Route("{friendId}")]
public virtual async Task<UserFriend> GetAsync(Guid friendId)
{
return await MyFriendAppService.GetAsync(friendId);
}
[HttpGet]
[Route("all")]
public virtual async Task<ListResultDto<UserFriend>> GetAllListAsync(GetMyFriendsDto input)
{
return await MyFriendAppService.GetAllListAsync(input);
}
[HttpGet]
public virtual async Task<PagedResultDto<UserFriend>> GetListAsync(MyFriendGetByPagedDto input)
{
return await MyFriendAppService.GetListAsync(input);
}
}
}

35
aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Groups/GroupController.cs

@ -0,0 +1,35 @@
using LINGYUN.Abp.IM.Groups;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.MessageService.Groups
{
[RemoteService(Name = AbpMessageServiceConsts.RemoteServiceName)]
[Route("api/im/groups")]
public class GroupController : AbpController, IGroupAppService
{
private readonly IGroupAppService _service;
public GroupController(IGroupAppService service)
{
_service = service;
}
[HttpGet]
[Route("{groupId}")]
public virtual async Task<Group> GetAsync(string groupId)
{
return await _service.GetAsync(groupId);
}
[HttpGet]
[Route("search")]
public virtual async Task<PagedResultDto<Group>> SearchAsync(GroupSearchInput input)
{
return await _service.SearchAsync(input);
}
}
}

55
aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/Groups/UserGroupController.cs

@ -0,0 +1,55 @@
using LINGYUN.Abp.IM.Groups;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.AspNetCore.Mvc;
namespace LINGYUN.Abp.MessageService.Groups
{
[RemoteService(Name = AbpMessageServiceConsts.RemoteServiceName)]
[Route("api/im/user-groups")]
public class UserGroupController : AbpController, IUserGroupAppService
{
private readonly IUserGroupAppService _service;
public UserGroupController(IUserGroupAppService service)
{
_service = service;
}
[HttpPost]
[Route("join")]
public virtual async Task ApplyJoinGroupAsync(UserJoinGroupDto input)
{
await _service.ApplyJoinGroupAsync(input);
}
[HttpGet]
public virtual async Task<PagedResultDto<GroupUserCard>> GetGroupUsersAsync(GroupUserGetByPagedDto input)
{
return await _service.GetGroupUsersAsync(input);
}
[HttpGet]
[Route("me")]
public virtual async Task<ListResultDto<Group>> GetMyGroupsAsync()
{
return await _service.GetMyGroupsAsync();
}
[HttpPut]
[Route("accept")]
public virtual async Task GroupAcceptUserAsync(GroupAcceptUserDto input)
{
await _service.GroupAcceptUserAsync(input);
}
[HttpPut]
[Route("remove")]
public virtual async Task GroupRemoveUserAsync(GroupRemoveUserDto input)
{
await _service.GroupRemoveUserAsync(input);
}
}
}

622
aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/20211110144233_Add-Field-Online-Avatar.Designer.cs

@ -0,0 +1,622 @@
// <auto-generated />
using System;
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Volo.Abp.EntityFrameworkCore;
namespace LINGYUN.Abp.MessageService.Migrations
{
[DbContext(typeof(MessageServiceHostMigrationsDbContext))]
[Migration("20211110144233_Add-Field-Online-Avatar")]
partial class AddFieldOnlineAvatar
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
.HasAnnotation("Relational:MaxIdentifierLength", 64)
.HasAnnotation("ProductVersion", "5.0.12");
modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatCard", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<int>("Age")
.HasColumnType("int");
b.Property<string>("AvatarUrl")
.HasMaxLength(512)
.HasColumnType("varchar(512)");
b.Property<DateTime?>("Birthday")
.HasColumnType("datetime(6)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("Description")
.HasMaxLength(50)
.HasColumnType("varchar(50)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LastOnlineTime")
.HasColumnType("datetime(6)");
b.Property<string>("NickName")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<int>("Sex")
.HasColumnType("int");
b.Property<string>("Sign")
.HasMaxLength(30)
.HasColumnType("varchar(30)");
b.Property<int>("State")
.HasColumnType("int");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.Property<string>("UserName")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("AppUserChatCards");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatFriend", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<bool>("Black")
.HasColumnType("tinyint(1)");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("Description")
.HasMaxLength(50)
.HasColumnType("varchar(50)");
b.Property<bool>("DontDisturb")
.HasColumnType("tinyint(1)");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<Guid>("FrientId")
.HasColumnType("char(36)");
b.Property<string>("RemarkName")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<bool>("SpecialFocus")
.HasColumnType("tinyint(1)");
b.Property<byte>("Status")
.HasColumnType("tinyint unsigned");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId", "FrientId");
b.ToTable("AppUserChatFriends");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatSetting", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<bool>("AllowAddFriend")
.HasColumnType("tinyint(1)");
b.Property<bool>("AllowAnonymous")
.HasColumnType("tinyint(1)");
b.Property<bool>("AllowReceiveMessage")
.HasColumnType("tinyint(1)");
b.Property<bool>("AllowSendMessage")
.HasColumnType("tinyint(1)");
b.Property<bool>("RequireAddFriendValition")
.HasColumnType("tinyint(1)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("AppUserChatSettings");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserMessage", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.IsRequired()
.HasMaxLength(1048576)
.HasColumnType("longtext");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<long>("MessageId")
.HasColumnType("bigint");
b.Property<Guid>("ReceiveUserId")
.HasColumnType("char(36)");
b.Property<sbyte>("SendState")
.HasColumnType("tinyint");
b.Property<string>("SendUserName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<int>("Type")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("TenantId", "ReceiveUserId");
b.ToTable("AppUserMessages");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.ChatGroup", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<string>("Address")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<Guid>("AdminUserId")
.HasColumnType("char(36)");
b.Property<bool>("AllowAnonymous")
.HasColumnType("tinyint(1)");
b.Property<bool>("AllowSendMessage")
.HasColumnType("tinyint(1)");
b.Property<string>("AvatarUrl")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("Description")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<long>("GroupId")
.HasColumnType("bigint");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<int>("MaxUserCount")
.HasColumnType("int");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("varchar(20)");
b.Property<string>("Notice")
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<string>("Tag")
.HasMaxLength(512)
.HasColumnType("varchar(512)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "Name");
b.ToTable("AppChatGroups");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupChatBlack", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<long>("GroupId")
.HasColumnType("bigint");
b.Property<Guid>("ShieldUserId")
.HasColumnType("char(36)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.HasKey("Id");
b.HasIndex("TenantId", "GroupId");
b.ToTable("AppGroupChatBlacks");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupMessage", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("Content")
.IsRequired()
.HasMaxLength(1048576)
.HasColumnType("longtext");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<long>("GroupId")
.HasColumnType("bigint");
b.Property<long>("MessageId")
.HasColumnType("bigint");
b.Property<sbyte>("SendState")
.HasColumnType("tinyint");
b.Property<string>("SendUserName")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("varchar(64)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<int>("Type")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("TenantId", "GroupId");
b.ToTable("AppGroupMessages");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserChatGroup", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<long>("GroupId")
.HasColumnType("bigint");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId", "GroupId", "UserId");
b.ToTable("AppUserChatGroups");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserGroupCard", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("varchar(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<Guid?>("CreatorId")
.HasColumnType("char(36)")
.HasColumnName("CreatorId");
b.Property<string>("ExtraProperties")
.HasColumnType("longtext")
.HasColumnName("ExtraProperties");
b.Property<bool>("IsAdmin")
.HasColumnType("tinyint(1)");
b.Property<DateTime?>("LastModificationTime")
.HasColumnType("datetime(6)")
.HasColumnName("LastModificationTime");
b.Property<Guid?>("LastModifierId")
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<string>("NickName")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
b.Property<DateTime?>("SilenceEnd")
.HasColumnType("datetime(6)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId");
b.ToTable("AppUserGroupCards");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Notifications.Notification", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<DateTime?>("ExpirationTime")
.HasColumnType("datetime(6)");
b.Property<string>("NotificationData")
.IsRequired()
.HasMaxLength(1048576)
.HasColumnType("longtext");
b.Property<long>("NotificationId")
.HasColumnType("bigint");
b.Property<string>("NotificationName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)");
b.Property<string>("NotificationTypeName")
.IsRequired()
.HasMaxLength(512)
.HasColumnType("varchar(512)");
b.Property<sbyte>("Severity")
.HasColumnType("tinyint");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<int>("Type")
.HasColumnType("int");
b.HasKey("Id");
b.HasIndex("TenantId", "NotificationName");
b.ToTable("AppNotifications");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Notifications.UserNotification", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<long>("NotificationId")
.HasColumnType("bigint");
b.Property<int>("ReadStatus")
.HasColumnType("int");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId", "NotificationId")
.HasDatabaseName("IX_Tenant_User_Notification_Id");
b.ToTable("AppUserNotifications");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Subscriptions.UserSubscribe", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("bigint");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
b.Property<string>("NotificationName")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("varchar(100)");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
b.Property<Guid>("UserId")
.HasColumnType("char(36)");
b.Property<string>("UserName")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(128)
.HasColumnType("varchar(128)")
.HasDefaultValue("/");
b.HasKey("Id");
b.HasIndex("TenantId", "UserId", "NotificationName")
.IsUnique()
.HasDatabaseName("IX_Tenant_User_Notification_Name");
b.ToTable("AppUserSubscribes");
});
#pragma warning restore 612, 618
}
}
}

47
aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/20211110144233_Add-Field-Online-Avatar.cs

@ -0,0 +1,47 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace LINGYUN.Abp.MessageService.Migrations
{
public partial class AddFieldOnlineAvatar : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "LastOnlineTime",
table: "AppUserChatCards",
type: "datetime(6)",
nullable: true);
migrationBuilder.AddColumn<int>(
name: "State",
table: "AppUserChatCards",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddColumn<string>(
name: "AvatarUrl",
table: "AppChatGroups",
type: "varchar(128)",
maxLength: 128,
nullable: true)
.Annotation("MySql:CharSet", "utf8mb4");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "LastOnlineTime",
table: "AppUserChatCards");
migrationBuilder.DropColumn(
name: "State",
table: "AppUserChatCards");
migrationBuilder.DropColumn(
name: "AvatarUrl",
table: "AppChatGroups");
}
}
}

22
aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/Migrations/MessageServiceHostMigrationsDbContextModelSnapshot.cs

@ -17,7 +17,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
.HasAnnotation("Relational:MaxIdentifierLength", 64)
.HasAnnotation("ProductVersion", "5.0.11");
.HasAnnotation("ProductVersion", "5.0.12");
modelBuilder.Entity("LINGYUN.Abp.MessageService.Chat.UserChatCard", b =>
{
@ -65,6 +65,9 @@ namespace LINGYUN.Abp.MessageService.Migrations
.HasColumnType("char(36)")
.HasColumnName("LastModifierId");
b.Property<DateTime?>("LastOnlineTime")
.HasColumnType("datetime(6)");
b.Property<string>("NickName")
.HasMaxLength(256)
.HasColumnType("varchar(256)");
@ -76,6 +79,9 @@ namespace LINGYUN.Abp.MessageService.Migrations
.HasMaxLength(30)
.HasColumnType("varchar(30)");
b.Property<int>("State")
.HasColumnType("int");
b.Property<Guid?>("TenantId")
.HasColumnType("char(36)")
.HasColumnName("TenantId");
@ -248,7 +254,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.ToTable("AppUserMessages");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Group.ChatGroup", b =>
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.ChatGroup", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
@ -267,6 +273,10 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.Property<bool>("AllowSendMessage")
.HasColumnType("tinyint(1)");
b.Property<string>("AvatarUrl")
.HasMaxLength(128)
.HasColumnType("varchar(128)");
b.Property<DateTime>("CreationTime")
.HasColumnType("datetime(6)")
.HasColumnName("CreationTime");
@ -317,7 +327,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.ToTable("AppChatGroups");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Group.GroupChatBlack", b =>
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupChatBlack", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
@ -348,7 +358,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.ToTable("AppGroupChatBlacks");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Group.GroupMessage", b =>
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.GroupMessage", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
@ -405,7 +415,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.ToTable("AppGroupMessages");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Group.UserChatGroup", b =>
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserChatGroup", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()
@ -436,7 +446,7 @@ namespace LINGYUN.Abp.MessageService.Migrations
b.ToTable("AppUserChatGroups");
});
modelBuilder.Entity("LINGYUN.Abp.MessageService.Group.UserGroupCard", b =>
modelBuilder.Entity("LINGYUN.Abp.MessageService.Groups.UserGroupCard", b =>
{
b.Property<long>("Id")
.ValueGeneratedOnAdd()

16
aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/appsettings.Development.json

@ -23,13 +23,13 @@
}
},
"ConnectionStrings": {
"Default": "Server=localhost;Database=Messages;User Id=colin;Password=123456",
"MessageService": "Server=localhost;Database=Messages;User Id=colin;Password=123456",
"AbpIdentity": "Server=localhost;Database=Messages;User Id=colin;Password=123456",
"AbpTenantManagement": "Server=localhost;Database=Platform;User Id=colin;Password=123456",
"AbpSettingManagement": "Server=localhost;Database=Platform;User Id=colin;Password=123456",
"AbpPermissionManagement": "Server=localhost;Database=Platform;User Id=colin;Password=123456",
"AbpLocalizationManagement": "Server=localhost;Database=Platform;User Id=colin;Password=123456"
"Default": "Server=localhost;Database=Messages;User Id=root;Password=123456",
"MessageService": "Server=localhost;Database=Messages;User Id=root;Password=123456",
"AbpIdentity": "Server=localhost;Database=Messages;User Id=root;Password=123456",
"AbpTenantManagement": "Server=localhost;Database=Platform;User Id=root;Password=123456",
"AbpSettingManagement": "Server=localhost;Database=Platform;User Id=root;Password=123456",
"AbpPermissionManagement": "Server=localhost;Database=Platform;User Id=root;Password=123456",
"AbpLocalizationManagement": "Server=localhost;Database=Platform;User Id=root;Password=123456"
},
"Redis": {
"Configuration": "localhost,defaultDatabase=8",
@ -41,7 +41,7 @@
},
"Hangfire": {
"MySql": {
"Connection": "Server=localhost;Database=Messages;User Id=colin;Password=123456;Allow User Variables=true",
"Connection": "Server=localhost;Database=Messages;User Id=root;Password=123456;Allow User Variables=true",
"TablePrefix": "AppHangfire"
},
"Dashboard": {

Loading…
Cancel
Save