committed by
GitHub
63 changed files with 2685 additions and 1395 deletions
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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() |
|||
{ |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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; } |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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
|
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,10 @@ |
|||
namespace LINGYUN.Abp.IM |
|||
{ |
|||
public enum UserOnlineState |
|||
{ |
|||
Online, |
|||
Offline, |
|||
Busy, |
|||
Stealth |
|||
} |
|||
} |
|||
@ -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: 还应该有获取我的未读消息 获取我的未读群组消息
|
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
} |
|||
|
|||
@ -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; } |
|||
} |
|||
} |
|||
@ -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; } |
|||
} |
|||
} |
|||
@ -0,0 +1,9 @@ |
|||
using Volo.Abp.Application.Dtos; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Groups |
|||
{ |
|||
public class GroupSearchInput : PagedAndSortedResultRequestDto |
|||
{ |
|||
public string Filter { get; set; } |
|||
} |
|||
} |
|||
@ -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 |
|||
{ |
|||
@ -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; } |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
@ -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, |
|||
}; |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
|
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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; } |
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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 }); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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; |
|||
} |
|||
} |
|||
} |
|||
@ -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所在程序集
|
|||
}); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
} |
|||
@ -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
|
|||
} |
|||
} |
|||
} |
|||
@ -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"); |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue