From f0f46169e44a5b2296343c0973ff0ce4f47aca11 Mon Sep 17 00:00:00 2001 From: Athou Date: Sat, 9 Aug 2014 13:25:53 +0200 Subject: [PATCH] next unread servlet --- .../com/commafeed/CommaFeedApplication.java | 11 +++ .../frontend/servlet/NextUnreadServlet.java | 90 +++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java diff --git a/src/main/java/com/commafeed/CommaFeedApplication.java b/src/main/java/com/commafeed/CommaFeedApplication.java index 68d40046..422b51d0 100644 --- a/src/main/java/com/commafeed/CommaFeedApplication.java +++ b/src/main/java/com/commafeed/CommaFeedApplication.java @@ -66,6 +66,7 @@ import com.commafeed.frontend.resource.FeedREST; import com.commafeed.frontend.resource.PubSubHubbubCallbackREST; import com.commafeed.frontend.resource.ServerREST; import com.commafeed.frontend.resource.UserREST; +import com.commafeed.frontend.servlet.NextUnreadServlet; public class CommaFeedApplication extends Application { @@ -167,10 +168,20 @@ public class CommaFeedApplication extends Application { environment.jersey().register(new ServerREST(httpGetter, config, applicationPropertiesService)); environment.jersey().register(new UserREST(userDAO, userRoleDAO, userSettingsDAO, userService, encryptionService)); + NextUnreadServlet nextUnreadServlet = new NextUnreadServlet(feedSubscriptionDAO, feedEntryStatusDAO, feedCategoryDAO, userService, + config); + environment.servlets().addServlet("next", nextUnreadServlet).addMapping("/next"); + environment.lifecycle().manage(startupService); environment.lifecycle().manage(taskGiver); environment.lifecycle().manage(feedWorker); environment.lifecycle().manage(feedUpdater); + + // TODO user registration + // TODO user login page + // TODO cookie support ? + // TODO translations + } public static void main(String[] args) throws Exception { diff --git a/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java new file mode 100644 index 00000000..37b755cc --- /dev/null +++ b/src/main/java/com/commafeed/frontend/servlet/NextUnreadServlet.java @@ -0,0 +1,90 @@ +package com.commafeed.frontend.servlet; + +import java.io.IOException; +import java.util.List; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import lombok.RequiredArgsConstructor; + +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; + +import com.commafeed.CommaFeedConfiguration; +import com.commafeed.backend.dao.FeedCategoryDAO; +import com.commafeed.backend.dao.FeedEntryStatusDAO; +import com.commafeed.backend.dao.FeedSubscriptionDAO; +import com.commafeed.backend.model.FeedCategory; +import com.commafeed.backend.model.FeedEntryStatus; +import com.commafeed.backend.model.FeedSubscription; +import com.commafeed.backend.model.User; +import com.commafeed.backend.model.UserSettings.ReadingOrder; +import com.commafeed.backend.service.UserService; +import com.commafeed.frontend.resource.CategoryREST; +import com.google.common.collect.Iterables; + +@SuppressWarnings("serial") +@RequiredArgsConstructor +public class NextUnreadServlet extends HttpServlet { + + public static final String PARAM_CATEGORYID = "category"; + public static final String PARAM_READINGORDER = "order"; + public static final String PARAM_APIKEY = "apiKey"; + + private final FeedSubscriptionDAO feedSubscriptionDAO; + private final FeedEntryStatusDAO feedEntryStatusDAO; + private final FeedCategoryDAO feedCategoryDAO; + private final UserService userService; + private final CommaFeedConfiguration config; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String categoryId = req.getParameter(PARAM_CATEGORYID); + String orderParam = req.getParameter(PARAM_READINGORDER); + String apiKey = req.getParameter(PARAM_APIKEY); + + if (apiKey == null) { + resp.getWriter().write("api key is required"); + return; + } + + User user = userService.login(apiKey); + if (user == null) { + resp.getWriter().write("unknown user or api key not found"); + return; + } + + ReadingOrder order = ReadingOrder.desc; + + if (StringUtils.equals(orderParam, "asc")) { + order = ReadingOrder.asc; + } + + List statuses = null; + if (StringUtils.isBlank(categoryId) || CategoryREST.ALL.equals(categoryId)) { + List subs = feedSubscriptionDAO.findAll(user); + statuses = feedEntryStatusDAO.findBySubscriptions(user, subs, true, null, null, 0, 1, order, true, false, null); + } else { + FeedCategory category = feedCategoryDAO.findById(user, Long.valueOf(categoryId)); + if (category != null) { + List children = feedCategoryDAO.findAllChildrenCategories(user, category); + List subscriptions = feedSubscriptionDAO.findByCategories(user, children); + statuses = feedEntryStatusDAO.findBySubscriptions(user, subscriptions, true, null, null, 0, 1, order, true, false, null); + } + } + + if (CollectionUtils.isEmpty(statuses)) { + resp.sendRedirect(resp.encodeRedirectURL(config.getApplicationSettings().getPublicUrl())); + } else { + FeedEntryStatus status = Iterables.getFirst(statuses, null); + String url = status.getEntry().getUrl(); + status.setRead(true); + feedEntryStatusDAO.saveOrUpdate(status); + resp.sendRedirect(resp.encodeRedirectURL(url)); + } + } + +}