From c2ed6d47f1584faf876e416a9bf24400f205d5d7 Mon Sep 17 00:00:00 2001 From: Athou Date: Tue, 26 Nov 2013 06:33:16 +0100 Subject: [PATCH] force a full refresh of the user's feeds when he logs in --- .../com/commafeed/backend/model/User.java | 6 ++++- .../services/FeedSubscriptionService.java | 8 ++++++ .../frontend/rest/resources/AbstractREST.java | 25 +++++++++++++++++++ .../frontend/rest/resources/FeedREST.java | 6 +---- .../resources/changelogs/db.changelog-1.4.xml | 6 +++++ 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/commafeed/backend/model/User.java b/src/main/java/com/commafeed/backend/model/User.java index 6703cb0c..20cb6ddb 100644 --- a/src/main/java/com/commafeed/backend/model/User.java +++ b/src/main/java/com/commafeed/backend/model/User.java @@ -32,7 +32,7 @@ public class User extends AbstractModel { @Column(length = 32, nullable = false, unique = true) private String name; - + @Column(length = 255, unique = true) private String email; @@ -66,4 +66,8 @@ public class User extends AbstractModel { @OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) private Set subscriptions; + @Column(name = "last_full_refresh") + @Temporal(TemporalType.TIMESTAMP) + private Date lastFullRefresh; + } diff --git a/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java b/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java index ae6d5978..79db77e3 100644 --- a/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java +++ b/src/main/java/com/commafeed/backend/services/FeedSubscriptionService.java @@ -95,6 +95,14 @@ public class FeedSubscriptionService { } } + public void refreshAll(User user) { + List subs = feedSubscriptionDAO.findAll(user); + for (FeedSubscription sub : subs) { + Feed feed = sub.getFeed(); + taskGiver.add(feed, true); + } + } + public UnreadCount getUnreadCount(User user, FeedSubscription sub) { UnreadCount count = cache.getUnreadCount(sub); if (count == null) { diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java index 88f6ca55..1c2334a9 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AbstractREST.java @@ -1,6 +1,8 @@ package com.commafeed.frontend.rest.resources; import java.lang.reflect.Method; +import java.util.Date; +import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.inject.Inject; @@ -16,6 +18,8 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import lombok.extern.slf4j.Slf4j; + import org.apache.wicket.ThreadContext; import org.apache.wicket.authentication.IAuthenticationStrategy; import org.apache.wicket.authroles.authorization.strategies.role.Roles; @@ -28,6 +32,7 @@ import com.codahale.metrics.MetricRegistry; import com.commafeed.backend.dao.UserDAO; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole.Role; +import com.commafeed.backend.services.FeedSubscriptionService; import com.commafeed.frontend.CommaFeedApplication; import com.commafeed.frontend.CommaFeedSession; import com.commafeed.frontend.SecurityCheck; @@ -35,6 +40,7 @@ import com.commafeed.frontend.SecurityCheck; @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @SecurityCheck(Role.USER) +@Slf4j public abstract class AbstractREST { @Context @@ -49,6 +55,9 @@ public abstract class AbstractREST { @Inject private UserDAO userDAO; + @Inject + FeedSubscriptionService feedSubscriptionService; + @PostConstruct public void init() { CommaFeedApplication app = CommaFeedApplication.get(); @@ -98,6 +107,8 @@ public abstract class AbstractREST { @AroundInvoke public Object intercept(InvocationContext context) throws Exception { + startFullRefresh(getUser()); + Method method = context.getMethod(); // check security @@ -137,6 +148,19 @@ public abstract class AbstractREST { return result; } + private void startFullRefresh(User user) { + if (user == null) + return; + + Date now = new Date(); + if (user.getLastFullRefresh() == null || (now.getTime() - user.getLastFullRefresh().getTime()) > TimeUnit.MINUTES.toMillis(30)) { + log.info("Starting full refresh for {}", user.getName()); + user.setLastFullRefresh(now); + userDAO.saveOrUpdate(user); + feedSubscriptionService.refreshAll(user); + } + } + private boolean checkRole(Role requiredRole) { if (requiredRole == Role.NONE) { return true; @@ -146,4 +170,5 @@ public abstract class AbstractREST { boolean authorized = roles.hasAnyRole(new Roles(requiredRole.name())); return authorized; } + } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java index 65c950bd..5a4551bd 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/FeedREST.java @@ -274,11 +274,7 @@ public class FeedREST extends AbstractREST { @GET @ApiOperation(value = "Queue all feeds of the user for refresh", notes = "Manually add all feeds of the user to the refresh queue") public Response queueAllForRefresh() { - List subs = feedSubscriptionDAO.findAll(getUser()); - for (FeedSubscription sub : subs) { - Feed feed = sub.getFeed(); - taskGiver.add(feed, true); - } + feedSubscriptionService.refreshAll(getUser()); return Response.ok().build(); } diff --git a/src/main/resources/changelogs/db.changelog-1.4.xml b/src/main/resources/changelogs/db.changelog-1.4.xml index adafc792..ded25898 100644 --- a/src/main/resources/changelogs/db.changelog-1.4.xml +++ b/src/main/resources/changelogs/db.changelog-1.4.xml @@ -42,4 +42,10 @@ + + + + + +