public PageModels.TopicDisplayPage GetDisplayPageModel(int id, int pageId = 1, int target = 0) { var viewModel = new PageModels.TopicDisplayPage(); var record = DbContext.Messages.Find(id); if (record is null) { throw new HttpNotFoundError(); } var parentId = id; if (record.ParentId > 0) { parentId = record.ParentId; } var messageIdQuery = from message in DbContext.Messages where message.Id == parentId || message.ParentId == parentId select message.Id; var messageIds = messageIdQuery.ToList(); if (parentId != id) { viewModel.RedirectPath = GetRedirectPath(id, record.ParentId, messageIds); return(viewModel); } if (target > 0) { var targetPage = MessageRepository.GetPageNumber(target, messageIds); if (targetPage != pageId) { viewModel.RedirectPath = GetRedirectPath(target, id, messageIds); return(viewModel); } } var assignedBoardsQuery = from messageBoard in DbContext.MessageBoards join board in DbContext.Boards on messageBoard.BoardId equals board.Id where messageBoard.MessageId == record.Id select board; var assignedBoards = assignedBoardsQuery.ToList(); var boardRoles = RoleRepository.BoardRoles.Where(r => assignedBoards.Any(b => b.Id == r.BoardId)).Select(r => r.RoleId).ToList(); if (!UserContext.IsAdmin && boardRoles.Any() && !boardRoles.Intersect(UserContext.Roles).Any()) { throw new HttpForbiddenError(); } if (pageId < 1) { pageId = 1; } var take = SettingsRepository.MessagesPerPage(); var skip = take * (pageId - 1); var totalPages = Convert.ToInt32(Math.Ceiling(1.0 * messageIds.Count / take)); var pageMessageIds = messageIds.Skip(skip).Take(take).ToList(); record.ViewCount++; DbContext.Update(record); DbContext.SaveChanges(); var messages = TopicRepository.GetMessages(pageMessageIds); if (string.IsNullOrEmpty(record.ShortPreview)) { record.ShortPreview = "No subject"; } var showFavicons = SettingsRepository.ShowFavicons(); viewModel = new PageModels.TopicDisplayPage { Id = record.Id, TopicHeader = new ItemModels.TopicHeader { StartedById = record.PostedById, Subject = record.ShortPreview, Views = record.ViewCount, }, Messages = messages, Categories = BoardRepository.CategoryIndex(), AssignedBoards = new List <ViewModels.Boards.Items.IndexBoard>(), IsAuthenticated = UserContext.IsAuthenticated, CanManage = UserContext.IsAdmin || record.PostedById == UserContext.ApplicationUser.Id, TotalPages = totalPages, ReplyCount = record.ReplyCount, ViewCount = record.ViewCount, CurrentPage = pageId, ShowFavicons = showFavicons, ReplyForm = new ItemModels.ReplyForm { Id = record.Id } }; foreach (var assignedBoard in assignedBoards) { var indexBoard = BoardRepository.GetIndexBoard(assignedBoard); viewModel.AssignedBoards.Add(indexBoard); } var latestMessageTime = messages.Max(r => r.RecordTime); TopicRepository.MarkRead(record.Id, latestMessageTime, pageMessageIds); return(viewModel); }