Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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();
            }
        }
Ejemplo n.º 4
0
 public async Task <UserGroupRelation> GetRelationFromGroup(string userId, int groupId)
 {
     return(await UserGroupRelations
            .SingleOrDefaultAsync(t => t.UserId == userId && t.GroupId == groupId));
 }