From 99ce880fe047c0f3c4c0931e0715ebf62b4b2bc8 Mon Sep 17 00:00:00 2001 From: Athou Date: Mon, 8 Apr 2013 15:49:34 +0200 Subject: [PATCH] populate statuses as read when a user subscribes --- .../commafeed/backend/dao/FeedService.java | 8 ++++ .../backend/dao/FeedSubscriptionService.java | 46 ++++++++++++++++++- .../com/commafeed/backend/dao/GenericDAO.java | 6 +++ .../commafeed/backend/feeds/OPMLImporter.java | 20 +------- .../rest/resources/SubscriptionsREST.java | 17 ++----- 5 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedService.java b/src/main/java/com/commafeed/backend/dao/FeedService.java index ed0b0e41..236874ed 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedService.java @@ -7,6 +7,7 @@ import javax.ejb.Stateless; import com.commafeed.backend.model.Feed; import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.common.collect.Iterables; +import com.uaihebert.model.EasyCriteria; @Stateless @SuppressWarnings("serial") @@ -16,4 +17,11 @@ public class FeedService extends GenericDAO { List feeds = findByField(MF.i(proxy().getUrl()), url); return Iterables.getFirst(feeds, null); } + + public Feed getByIdWithEntries(Long feedId) { + EasyCriteria criteria = createCriteria(); + criteria.andEquals(MF.i(proxy().getId()), feedId); + criteria.leftJoinFetch(MF.i(proxy().getEntries())); + return criteria.getSingleResult(); + } } diff --git a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionService.java b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionService.java index d5f76bb4..29dd917a 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedSubscriptionService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedSubscriptionService.java @@ -1,14 +1,19 @@ package com.commafeed.backend.dao; import java.util.List; +import java.util.Set; import javax.ejb.Stateless; import javax.inject.Inject; import com.commafeed.backend.model.Feed; +import com.commafeed.backend.model.FeedCategory; +import com.commafeed.backend.model.FeedEntry; +import com.commafeed.backend.model.FeedEntryStatus; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; import com.commafeed.frontend.utils.ModelFactory.MF; +import com.google.api.client.util.Lists; import com.google.common.collect.Iterables; import com.uaihebert.factory.EasyCriteriaFactory; import com.uaihebert.model.EasyCriteria; @@ -20,6 +25,45 @@ public class FeedSubscriptionService extends GenericDAO { @Inject FeedCategoryService feedCategoryService; + @Inject + FeedService feedService; + + @Inject + FeedEntryStatusService feedEntryStatusService; + + public void subscribe(User user, String url, String title, + FeedCategory category) { + + Feed feed = feedService.findByUrl(url); + if (feed == null) { + feed = new Feed(); + feed.setUrl(url); + feedService.save(feed); + } + + FeedSubscription sub = findByFeed(user, feed); + if (sub == null) { + sub = new FeedSubscription(); + sub.setFeed(feed); + sub.setUser(user); + } + sub.setCategory(category); + sub.setTitle(title); + saveOrUpdate(sub); + + List statuses = Lists.newArrayList(); + Set allEntries = feedService + .getByIdWithEntries(feed.getId()).getEntries(); + for (FeedEntry entry : allEntries) { + FeedEntryStatus status = new FeedEntryStatus(); + status.setEntry(entry); + status.setRead(true); + status.setSubscription(sub); + statuses.add(status); + } + feedEntryStatusService.save(statuses); + } + public FeedSubscription findById(User user, Long id) { EasyCriteria criteria = createCriteria(); criteria.andEquals(MF.i(proxy().getUser()), user); @@ -43,7 +87,7 @@ public class FeedSubscriptionService extends GenericDAO { public List findAll(User user) { EasyCriteria criteria = createCriteria(); criteria.andEquals(MF.i(proxy().getUser()), user); - + criteria.innerJoinFetch(MF.i(proxy().getFeed())); criteria.innerJoinFetch(MF.i(proxy().getUser())); criteria.leftJoinFetch(MF.i(proxy().getCategory())); diff --git a/src/main/java/com/commafeed/backend/dao/GenericDAO.java b/src/main/java/com/commafeed/backend/dao/GenericDAO.java index da2318cc..18eb7599 100644 --- a/src/main/java/com/commafeed/backend/dao/GenericDAO.java +++ b/src/main/java/com/commafeed/backend/dao/GenericDAO.java @@ -38,6 +38,12 @@ public abstract class GenericDAO implements em.persist(object); } + public void save(List objects) { + for (Object object : objects) { + em.persist(object); + } + } + public void update(List objects) { for (Object object : objects) { em.merge(object); diff --git a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java b/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java index 19d1b990..e9fd6904 100644 --- a/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java +++ b/src/main/java/com/commafeed/backend/feeds/OPMLImporter.java @@ -10,9 +10,7 @@ import org.apache.commons.lang.StringUtils; import com.commafeed.backend.dao.FeedCategoryService; import com.commafeed.backend.dao.FeedService; import com.commafeed.backend.dao.FeedSubscriptionService; -import com.commafeed.backend.model.Feed; import com.commafeed.backend.model.FeedCategory; -import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.User; import com.sun.syndication.feed.opml.Opml; import com.sun.syndication.feed.opml.Outline; @@ -60,23 +58,9 @@ public class OPMLImporter { handleOutline(user, child, category); } } else { - Feed feed = feedService.findByUrl(outline.getXmlUrl()); - if (feed == null) { - feed = new Feed(); - feed.setUrl(outline.getXmlUrl()); - feedService.save(feed); - } - FeedSubscription sub = feedSubscriptionService.findByFeed(user, - feed); - if (sub == null) { - sub = new FeedSubscription(); - sub.setFeed(feed); - sub.setUser(user); - } - sub.setCategory(parent); - sub.setTitle(outline.getText()); - feedSubscriptionService.saveOrUpdate(sub); + feedSubscriptionService.subscribe(user, outline.getXmlUrl(), + outline.getText(), parent); } } } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java index 6c713dc8..5f5b37a8 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/SubscriptionsREST.java @@ -61,20 +61,13 @@ public class SubscriptionsREST extends AbstractREST { String url = prependHttp(req.getUrl()); + FeedCategory category = EntriesREST.ALL.equals(req.getCategoryId()) ? null + : feedCategoryService + .findById(Long.valueOf(req.getCategoryId())); Feed fetchedFeed = fetchFeed(url); - Feed feed = feedService.findByUrl(fetchedFeed.getUrl()); - if (feed == null) { - feed = fetchedFeed; - feedService.save(feed); - } + feedSubscriptionService.subscribe(getUser(), fetchedFeed.getUrl(), + req.getTitle(), category); - FeedSubscription sub = new FeedSubscription(); - sub.setCategory(EntriesREST.ALL.equals(req.getCategoryId()) ? null - : feedCategoryService.findById(Long.valueOf(req.getCategoryId()))); - sub.setFeed(feed); - sub.setTitle(req.getTitle()); - sub.setUser(getUser()); - feedSubscriptionService.save(sub); return Response.ok(Status.OK).build(); }