public async Task <bool> VerifyJoined(string userId, Conversation target) { if (target == null) { return(false); } switch (target.Discriminator) { case nameof(GroupConversation): { var relation = await UserGroupRelations .SingleOrDefaultAsync(t => t.UserId == userId && t.GroupId == target.Id); if (relation == null) { return(false); } break; } case nameof(PrivateConversation): { var privateConversation = target as PrivateConversation; if (privateConversation?.RequesterId != userId && privateConversation?.TargetId != userId) { return(false); } break; } } return(true); }
public async Task <List <Conversation> > MyConversations(string userId) { var personalRelations = await PrivateConversations .AsNoTracking() .Where(t => t.RequesterId == userId || t.TargetId == userId) .Include(t => t.RequestUser) .Include(t => t.TargetUser) .Include(t => t.Messages) .ThenInclude(t => t.Ats) .ToListAsync(); var groups = await UserGroupRelations .AsNoTracking() .Where(t => t.UserId == userId) .Include(t => t.Group.Messages) .ThenInclude(t => t.Ats) .Include(t => t.User) .ToListAsync(); var myConversations = new List <Conversation>(); myConversations.AddRange(personalRelations); myConversations.AddRange(groups.Select(t => t.Group)); return(myConversations); }
public async Task <DateTime> SetLastRead(Conversation conversation, string userId) { if (conversation is PrivateConversation) { var query = Messages .Where(t => t.ConversationId == conversation.Id) .Where(t => t.SenderId != userId); try { return((await query .Where(t => t.Read) .OrderByDescending(t => t.SendTime) .FirstOrDefaultAsync()) ?.SendTime ?? DateTime.MinValue); } finally { await query .Where(t => t.Read == false) .ForEachAsync(t => t.Read = true); } } else if (conversation is GroupConversation) { var relation = await UserGroupRelations .SingleOrDefaultAsync(t => t.UserId == userId && t.GroupId == conversation.Id); try { return(relation.ReadTimeStamp); } finally { relation.ReadTimeStamp = DateTime.UtcNow; } } else { throw new NotImplementedException(); } }
public async Task <UserGroupRelation> GetRelationFromGroup(string userId, int groupId) { return(await UserGroupRelations .SingleOrDefaultAsync(t => t.UserId == userId && t.GroupId == groupId)); }