Esempio n. 1
0
        public int RecountReplies()
        {
            var query = from message in DbContext.Messages
                        where message.ParentId == 0
                        select message.Id;

            var recordCount = query.Count();

            var take       = SettingsRepository.TopicsPerPage(true);
            var totalSteps = (int)Math.Ceiling(1D * recordCount / take);

            return(totalSteps);
        }
Esempio n. 2
0
        public void RecountRepliesContinue(InputModels.Continue input)
        {
            input.ThrowIfNull(nameof(input));

            var parentMessageQuery = from message in DbContext.Messages
                                     where message.ParentId == 0
                                     orderby message.Id descending
                                     select message;

            var take = SettingsRepository.TopicsPerPage(true);
            var skip = input.CurrentStep * take;

            var parents = parentMessageQuery.Skip(skip).Take(take).ToList();

            foreach (var parent in parents)
            {
                RecountRepliesForTopic(parent);
            }
        }
Esempio n. 3
0
        public List <int> GetIndexIds(int boardId, int page, int unreadFilter, DateTime historyTimeLimit, List <DataModels.Participant> participation, List <DataModels.ViewLog> viewLogs)
        {
            var take = SettingsRepository.TopicsPerPage();
            var skip = (page - 1) * take;

            var forbiddenBoardIdsQuery = from role in RoleRepository.SiteRoles
                                         join board in RoleRepository.BoardRoles on role.Id equals board.RoleId
                                         where !UserContext.Roles.Contains(role.Id)
                                         select board.BoardId;

            var forbiddenBoardIds = forbiddenBoardIdsQuery.ToList();

            var messageQuery = from message in DbContext.Messages
                               where message.ParentId == 0
                               select new {
                message.Id,
                message.LastReplyPosted
            };

            if (boardId > 0)
            {
                messageQuery = from message in DbContext.Messages
                               join messageBoard in DbContext.MessageBoards on message.Id equals messageBoard.MessageId
                               where message.ParentId == 0
                               where messageBoard.BoardId == boardId
                               select new {
                    message.Id,
                    message.LastReplyPosted
                };
            }

            if (unreadFilter > 0)
            {
                messageQuery = messageQuery.Where(m => m.LastReplyPosted > historyTimeLimit);
            }

            var pinnedTopicIds = PinRepository.Select(item => item.MessageId).ToList();

            var sortedMessageQuery = from message in messageQuery
                                     let pinned = pinnedTopicIds.Contains(message.Id)
                                                  orderby message.LastReplyPosted descending
                                                  orderby pinned descending
                                                  select new {
                message.Id,
                message.LastReplyPosted
            };

            var messageIds = new List <int>();
            var attempts   = 0;
            var skipped    = 0;

            foreach (var message in sortedMessageQuery)
            {
                if (IsAccessDenied(message.Id, forbiddenBoardIds))
                {
                    if (attempts++ > 100)
                    {
                        break;
                    }

                    continue;
                }

                var unreadLevel = unreadFilter == 0 ? 0 : GetUnreadLevel(message.Id, message.LastReplyPosted, participation, viewLogs);

                if (unreadLevel < unreadFilter)
                {
                    if (attempts++ > 100)
                    {
                        break;
                    }

                    continue;
                }

                if (skipped++ < skip)
                {
                    continue;
                }

                messageIds.Add(message.Id);

                if (messageIds.Count == take)
                {
                    break;
                }
            }

            return(messageIds);
        }