populate statuses as read when a user subscribes

This commit is contained in:
Athou
2013-04-08 15:49:34 +02:00
parent fb71ee6b84
commit 99ce880fe0
5 changed files with 66 additions and 31 deletions

View File

@@ -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<Feed> {
List<Feed> feeds = findByField(MF.i(proxy().getUrl()), url);
return Iterables.getFirst(feeds, null);
}
public Feed getByIdWithEntries(Long feedId) {
EasyCriteria<Feed> criteria = createCriteria();
criteria.andEquals(MF.i(proxy().getId()), feedId);
criteria.leftJoinFetch(MF.i(proxy().getEntries()));
return criteria.getSingleResult();
}
}

View File

@@ -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<FeedSubscription> {
@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<FeedEntryStatus> statuses = Lists.newArrayList();
Set<FeedEntry> 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<FeedSubscription> criteria = createCriteria();
criteria.andEquals(MF.i(proxy().getUser()), user);
@@ -43,7 +87,7 @@ public class FeedSubscriptionService extends GenericDAO<FeedSubscription> {
public List<FeedSubscription> findAll(User user) {
EasyCriteria<FeedSubscription> 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()));

View File

@@ -38,6 +38,12 @@ public abstract class GenericDAO<T extends AbstractModel> implements
em.persist(object);
}
public void save(List<T> objects) {
for (Object object : objects) {
em.persist(object);
}
}
public void update(List<T> objects) {
for (Object object : objects) {
em.merge(object);

View File

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

View File

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