public async Task <ActionResult <IEnumerable <object> > > PostAsync([FromForm] ArticleReadViewModel feed)
        {
            _logger.LogDebug($"Marking story [{feed.StoryId}] as {(feed.Read ? "read" : "unread")} for feed {feed.FeedId}");

            var newArticles = new List <Article>();

            var userAccount = await _userAccountRepository.FindOrCreateAsync(User);

            var userFeedId = 0;

            if (feed.FeedId.HasValue && !feed.StoryId.HasValue)
            {
                if (!feed.MaxStoryId.HasValue || feed.MaxStoryId.Value <= 0)
                {
                    feed.MaxStoryId = int.MaxValue;
                }

                _logger.LogDebug($"Marking all stories as {(feed.Read ? "read" : "unread")}: {feed.FeedId} up to id {feed.MaxStoryId}");
                userFeedId = feed.FeedId.Value;

                var feedToMarkAllAsRead = await _userFeedRepository.GetByIdAsync(feed.FeedId.Value);

                if (feedToMarkAllAsRead != null && feedToMarkAllAsRead.UserAccountId == userAccount.Id)
                {
                    foreach (var article in await _articleRepository.FindUnreadArticlesInUserFeedAsync(feedToMarkAllAsRead))
                    {
                        if (article.Id > feed.MaxStoryId)
                        {
                            newArticles.Add(article);
                            continue;
                        }
                        await MarkAsAsync(feedToMarkAllAsRead, article.Id, feed.Read);
                    }
                }
            }
            else if (feed.StoryId.HasValue)
            {
                var article = await _articleRepository.GetByIdAsync(feed.StoryId.Value);

                var feedToMarkAsRead = (await _userFeedRepository.GetAllByUserAndRssFeedAsync(userAccount, article.RssFeedId)).FirstOrDefault();
                if (feedToMarkAsRead != null)
                {
                    userFeedId = feedToMarkAsRead.Id;
                    await MarkAsAsync(feedToMarkAsRead, article.Id, feed.Read);
                }
                else
                {
                    _logger.LogWarning($"Feed {feed.FeedId} could not be found or is not associated with the current user, will not make any changes");
                }
            }

            return(newArticles
                   .OrderBy(a => a.Published)
                   .Select(a => new { read = false, feed = userFeedId, story = a.Id, heading = a.Heading, article = HtmlPreview.Preview(a.Body), posted = FriendlyDate.ToString(a.Published, feed.OffsetId) })
                   .ToList());
        }
示例#2
0
        public async Task <IActionResult> ArticleRead(Guid id)
        {
            ArticleModel            article          = _articleRepository.Get(id);
            List <CommentViewModel> commentsViewList = new List <CommentViewModel>();

            foreach (CommentModel item in article.Comments)
            {
                ApplicationUser user = await _userManager.FindByIdAsync(item.UserId.ToString());

                commentsViewList.Add(new CommentViewModel()
                {
                    Id        = item.Id,
                    Date      = item.Date.ToString(),
                    Comment   = item.Comment,
                    ArticleId = item.ArticleId,
                    Likes     = item.Likes.Count(),
                    Name      = user.UserName
                });
            }
            List <CommentViewModel> orderedCommentsViewList =
                commentsViewList
                .OrderByDescending(c => c.Date)
                .ToList();
            Markdown        markdown    = new Markdown();
            ApplicationUser articleUser =
                await _userManager.FindByIdAsync(article.UserId.ToString());

            var currentUser = await GetCurrentUser();

            int mark = 0;

            if (_signInManager.IsSignedIn(User) == false)
            {
                mark = 0;
            }
            else
            {
                if (article.Marks.FirstOrDefault(x => x.UserId == new Guid(currentUser.Id)) == null)
                {
                    mark = 0;
                }
                else
                {
                    mark = article.Marks.First(m => m.UserId == new Guid(currentUser.Id)).Value;
                }
            }

            ArticleReadViewModel viewModel = new ArticleReadViewModel()
            {
                Id             = article.Id,
                Text           = markdown.Transform(article.Text),
                Description    = article.Description,
                CreatedDate    = article.CreatedDate,
                LastModifeDate = article.LastModifeDate,
                Specialty      = article.Specialty,
                UserId         = article.UserId,
                Name           = article.Name,
                Rate           = GetAverageRate(article.Marks),
                Comments       = orderedCommentsViewList,
                UserName       = articleUser.UserName,
                Tags           = article.Tags.Select(t => t.Tag.Title).ToList(),
                YourMark       = mark
            };

            if (currentUser != null)
            {
                MarkModel userMark = article.Marks.FirstOrDefault(m => m.UserId == new Guid(currentUser.Id));
                viewModel.IsAvailableRate = currentUser.Id == article.UserId.ToString();
            }
            else
            {
                viewModel.IsAvailableRate = true;
            }
            return(View(viewModel));
        }