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,4 +1,4 @@ |
|||
namespace LINGYUN.Abp.IM.Group |
|||
namespace LINGYUN.Abp.IM.Groups |
|||
{ |
|||
public class GroupUserCard : UserCard |
|||
{ |
|||
@ -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,6 +1,6 @@ |
|||
using System; |
|||
|
|||
namespace LINGYUN.Abp.IM.Group |
|||
namespace LINGYUN.Abp.IM.Groups |
|||
{ |
|||
public class UserGroup |
|||
{ |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -0,0 +1,10 @@ |
|||
namespace LINGYUN.Abp.IM |
|||
{ |
|||
public enum UserOnlineState |
|||
{ |
|||
Online, |
|||
Offline, |
|||
Busy, |
|||
Stealth |
|||
} |
|||
} |
|||
@ -1,7 +1,7 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Chat |
|||
namespace LINGYUN.Abp.MessageService.Groups |
|||
{ |
|||
public class GroupAcceptUserDto |
|||
{ |
|||
@ -1,7 +1,7 @@ |
|||
using System; |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Chat |
|||
namespace LINGYUN.Abp.MessageService.Groups |
|||
{ |
|||
public class GroupRemoveUserDto |
|||
{ |
|||
@ -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,6 +1,6 @@ |
|||
using System.ComponentModel.DataAnnotations; |
|||
|
|||
namespace LINGYUN.Abp.MessageService.Chat |
|||
namespace LINGYUN.Abp.MessageService.Groups |
|||
{ |
|||
public class UserJoinGroupDto |
|||
{ |
|||
@ -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,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); |
|||
|
|||
} |
|||
} |
|||
@ -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); |
|||
} |
|||
} |
|||
@ -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