public Feed subscribe(User user, String url, String title, FeedCategory category) { final String pubUrl = applicationSettingsService.get().getPublicUrl(); if (StringUtils.isBlank(pubUrl)) { throw new FeedSubscriptionException("Public URL of this CommaFeed instance is not set"); } if (url.startsWith(pubUrl)) { throw new FeedSubscriptionException( "Could not subscribe to a feed from this CommaFeed instance"); } Feed feed = feedService.findOrCreate(url); FeedSubscription sub = feedSubscriptionDAO.findByFeed(user, feed); if (sub == null) { sub = new FeedSubscription(); sub.setFeed(feed); sub.setUser(user); } sub.setCategory(category); sub.setPosition(0); sub.setTitle(FeedUtils.truncate(title, 128)); feedSubscriptionDAO.saveOrUpdate(sub); taskGiver.add(feed, false); cache.invalidateUserRootCategory(user); return feed; }
public Feed subscribe(User user, String url, String title, FeedCategory category) { final String pubUrl = applicationSettingsService.get().getPublicUrl(); if (StringUtils.isBlank(pubUrl)) { throw new FeedSubscriptionException("Public URL of this CommaFeed instance is not set"); } if (url.startsWith(pubUrl)) { throw new FeedSubscriptionException( "Could not subscribe to a feed from this CommaFeed instance"); } Feed feed = feedService.findOrCreate(url); FeedSubscription sub = feedSubscriptionDAO.findByFeed(user, feed); boolean newSubscription = false; if (sub == null) { sub = new FeedSubscription(); sub.setFeed(feed); sub.setUser(user); newSubscription = true; } sub.setCategory(category); sub.setPosition(0); sub.setTitle(FeedUtils.truncate(title, 128)); feedSubscriptionDAO.saveOrUpdate(sub); if (newSubscription) { List<FeedEntryStatus> statuses = Lists.newArrayList(); List<FeedEntry> allEntries = feedEntryDAO.findByFeed(feed, 0, 10); for (FeedEntry entry : allEntries) { FeedEntryStatus status = new FeedEntryStatus(); status.setEntry(entry); status.setRead(false); status.setSubscription(sub); statuses.add(status); } feedEntryStatusDAO.saveOrUpdate(statuses); } taskGiver.add(feed); return feed; }
@Path("/entries") @GET @ApiOperation( value = "Get category entries", notes = "Get a list of category entries", responseClass = "com.commafeed.frontend.model.Entries") public Response getCategoryEntries( @ApiParam(value = "id of the category, 'all' or 'starred'", required = true) @QueryParam("id") String id, @ApiParam( value = "all entries or only unread ones", allowableValues = "all,unread", required = true) @DefaultValue("unread") @QueryParam("readType") ReadingMode readType, @ApiParam(value = "only entries newer than this") @QueryParam("newerThan") Long newerThan, @ApiParam(value = "offset for paging") @DefaultValue("0") @QueryParam("offset") int offset, @ApiParam(value = "limit for paging, default 20, maximum 1000") @DefaultValue("20") @QueryParam("limit") int limit, @ApiParam(value = "date ordering", allowableValues = "asc,desc") @QueryParam("order") @DefaultValue("desc") ReadingOrder order, @ApiParam( value = "search for keywords in either the title or the content of the entries, separated by spaces, 3 characters minimum") @QueryParam("keywords") String keywords, @ApiParam(value = "return only entry ids") @DefaultValue("false") @QueryParam("onlyIds") boolean onlyIds) { Preconditions.checkNotNull(readType); keywords = StringUtils.trimToNull(keywords); Preconditions.checkArgument(keywords == null || StringUtils.length(keywords) >= 3); limit = Math.min(limit, 1000); limit = Math.max(0, limit); Entries entries = new Entries(); entries.setOffset(offset); entries.setLimit(limit); boolean unreadOnly = readType == ReadingMode.unread; if (StringUtils.isBlank(id)) { id = ALL; } Date newerThanDate = newerThan == null ? null : new Date(Long.valueOf(newerThan)); if (ALL.equals(id)) { entries.setName("All"); List<FeedSubscription> subscriptions = feedSubscriptionDAO.findAll(getUser()); List<FeedEntryStatus> list = feedEntryStatusDAO.findBySubscriptions( subscriptions, unreadOnly, keywords, newerThanDate, offset, limit + 1, order, true, onlyIds); for (FeedEntryStatus status : list) { entries .getEntries() .add( Entry.build( status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get().isImageProxyEnabled())); } } else if (STARRED.equals(id)) { entries.setName("Starred"); List<FeedEntryStatus> starred = feedEntryStatusDAO.findStarred( getUser(), newerThanDate, offset, limit + 1, order, !onlyIds); for (FeedEntryStatus status : starred) { entries .getEntries() .add( Entry.build( status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get().isImageProxyEnabled())); } } else { FeedCategory parent = feedCategoryDAO.findById(getUser(), Long.valueOf(id)); if (parent != null) { List<FeedCategory> categories = feedCategoryDAO.findAllChildrenCategories(getUser(), parent); List<FeedSubscription> subs = feedSubscriptionDAO.findByCategories(getUser(), categories); List<FeedEntryStatus> list = feedEntryStatusDAO.findBySubscriptions( subs, unreadOnly, keywords, newerThanDate, offset, limit + 1, order, true, onlyIds); for (FeedEntryStatus status : list) { entries .getEntries() .add( Entry.build( status, applicationSettingsService.get().getPublicUrl(), applicationSettingsService.get().isImageProxyEnabled())); } entries.setName(parent.getName()); } } boolean hasMore = entries.getEntries().size() > limit; if (hasMore) { entries.setHasMore(true); entries.getEntries().remove(entries.getEntries().size() - 1); } entries.setTimestamp(System.currentTimeMillis()); FeedUtils.removeUnwantedFromSearch(entries.getEntries(), keywords); return Response.ok(entries).build(); }