Exemple #1
0
        public async Task UnsubscribeFeedAsync(string feedUri, User user)
        {
            var feedId   = Utils.Sha256(feedUri.Trim().ToLower());
            var userFeed = new ServerCore.Models.UserFeed
            {
                UserId = user.Id,
                FeedId = feedId
            };
            var db = _dbFactory.CreateDbContext();

            db.UserFeeds.Attach(userFeed);
            db.UserFeeds.Remove(userFeed);
            await db.SaveChangesAsync();
        }
Exemple #2
0
        private FeedInfo GetFeedInfo(ServerCore.Models.UserFeed userFeed)
        {
            var feed = userFeed.Feed;

            return(new FeedInfo
            {
                ShortId = feed.ShortId,
                Description = feed.Description ?? string.Empty,
                Group = userFeed.Group ?? string.Empty,
                IconUri = feed.IconUri ?? string.Empty,
                Name = feed.Name ?? string.Empty,
                OriginalUri = feed.Uri,
                Uri = feed.Uri,
                WebsiteLink = feed.WebSiteUri ?? string.Empty
            });
        }
Exemple #3
0
        public async Task <Feed> GetFeedItemsAsync(string feedUri, string feedShortId, int page, User user)
        {
            if (string.IsNullOrEmpty(feedUri) && string.IsNullOrEmpty(feedShortId))
            {
                throw new ExternalErrorExcepiton($"FeedUri and FeedShortId can't be empty in both.");
            }

            string feedId = null;
            var    db     = _dbFactory.CreateDbContext();

            if (string.IsNullOrEmpty(feedShortId))
            {
                var originalUri = feedUri;
                feedUri = feedUri.Trim().ToLower();
                feedId  = Utils.Sha256(feedUri);
            }

            // Get feed information.
            // If the user blob is not null, we will get the feed from the user blob because user might customize the group and name on this feed.
            ServerCore.Models.UserFeed userFeed = null;
            ServerCore.Models.Feed     feedInDb = null;
            if (user != null)
            {
                userFeed = await db.UserFeeds.Include(f => f.Feed).FirstOrDefaultAsync(u => u.UserId == user.Id && (u.FeedId == feedId || u.Feed.ShortId == feedShortId));

                feedInDb = userFeed?.Feed;
            }

            // If we didn't get the feed, two possibility:
            // 1. The feed is not subscribed by user yet.
            // 2. Anonymous user.
            // No matter for which case, we will try to get the feed info from feed info table directly.
            if (feedInDb == null)
            {
                feedInDb = await db.Feeds.FirstOrDefaultAsync(f => f.Id == feedId || f.ShortId == feedShortId);
            }

            if (feedInDb == null)
            {
                throw new ExternalErrorExcepiton($"Feed '{feedUri ?? feedShortId}' is not found.");
            }
            feedId = feedInDb.Id;

            var feed = new Feed
            {
                ShortId     = feedInDb.ShortId,
                Description = feedInDb.Description,
                IconUri     = feedInDb.IconUri,
                Name        = feedInDb.Name,
                OriginalUri = feedInDb.Uri,
                Uri         = feedUri,
                WebsiteLink = feedInDb.WebSiteUri,
            };

            if (userFeed != null)
            {
                feed.Group = userFeed.Group;
            }

            // Get feed items.
            var feedItems = await db.FeedItems
                            .Where(f => f.FeedId == feedId)
                            .OrderByDescending(f => f.PublishTimeInUtc)
                            .Skip(page * 50)
                            .Take(50).ToListAsync();

            if (feedItems.Count > 0)
            {
                feed.Items = feedItems.Select(f => new FeedItem
                {
                    Id              = f.Id,
                    Summary         = f.Summary,
                    Content         = f.Content,
                    PermentLink     = f.Uri,
                    PubDate         = f.PublishTimeInUtc,
                    Title           = f.Title,
                    TopicPictureUri = f.TopicPictureUri,
                }).ToList();
            }

            // Mark readed or not.
            if (userFeed != null && userFeed.LastReadedTimeInUtc.Ticks != 0)
            {
                foreach (var feedItem in feed.Items)
                {
                    if (feedItem.PubDate <= userFeed.LastReadedTimeInUtc)
                    {
                        feedItem.IsReaded = true;
                    }
                }
            }

            // Mark stared or not.
            if (user != null)
            {
                // Mark stared or not
                var favorites = db.UserFeedItems.Where(f => f.UserId == user.Id && f.IsFavorite).Select(f => f.FeedItemId).ToList();
                if (favorites.Count > 0)
                {
                    foreach (var feedItem in feed.Items)
                    {
                        if (favorites.Find(id => id == feedItem.PermentLink.Sha256()) != null)
                        {
                            feedItem.IsStared = true;
                        }
                    }
                }
            }

            // All done.
            return(feed);
        }