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(); }
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 }); }
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); }