From ae4cd0b5e1e7690a4d0f3c846b0572eef97f7edf Mon Sep 17 00:00:00 2001 From: Athou Date: Wed, 10 Apr 2013 10:28:48 +0200 Subject: [PATCH] allow ordering (fix #30) --- .../backend/dao/FeedEntryStatusService.java | 95 ++++++++++--------- .../commafeed/backend/model/UserSettings.java | 16 ++++ .../commafeed/frontend/model/Settings.java | 9 ++ .../rest/resources/AdminUsersREST.java | 3 +- .../frontend/rest/resources/EntriesREST.java | 11 ++- .../frontend/rest/resources/SettingsREST.java | 6 +- src/main/webapp/js/controllers.js | 13 +++ src/main/webapp/templates/_toolbar.html | 4 + 8 files changed, 107 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java index b472312e..bdb08797 100644 --- a/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java +++ b/src/main/java/com/commafeed/backend/dao/FeedEntryStatusService.java @@ -10,6 +10,7 @@ import javax.persistence.NoResultException; import javax.persistence.Query; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Path; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; @@ -23,6 +24,7 @@ import com.commafeed.backend.model.FeedEntry_; import com.commafeed.backend.model.FeedSubscription; import com.commafeed.backend.model.FeedSubscription_; import com.commafeed.backend.model.User; +import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.frontend.utils.ModelFactory.MF; import com.google.api.client.util.Lists; import com.google.api.client.util.Maps; @@ -83,25 +85,21 @@ public class FeedEntryStatusService extends GenericDAO { predicates.add(builder.or(content, title)); query.where(predicates.toArray(new Predicate[0])); - query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( - FeedEntry_.updated))); + + orderBy(query, root, ReadingOrder.desc); TypedQuery q = em.createQuery(query); - if (offset > -1) { - q.setFirstResult(offset); - } - if (limit > -1) { - q.setMaxResults(limit); - } + limit(q, offset, limit); return q.getResultList(); } - public List getStatuses(User user, boolean unreadOnly) { - return getStatuses(user, unreadOnly, -1, -1); + public List getStatuses(User user, boolean unreadOnly, + ReadingOrder order) { + return getStatuses(user, unreadOnly, -1, -1, order); } public List getStatuses(User user, boolean unreadOnly, - int offset, int limit) { + int offset, int limit, ReadingOrder order) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -112,16 +110,10 @@ public class FeedEntryStatusService extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } query.where(predicates.toArray(new Predicate[0])); - query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( - FeedEntry_.updated))); + orderBy(query, root, order); TypedQuery q = em.createQuery(query); - if (offset > -1) { - q.setFirstResult(offset); - } - if (limit > -1) { - q.setMaxResults(limit); - } + limit(q, offset, limit); return q.getResultList(); } @@ -142,12 +134,12 @@ public class FeedEntryStatusService extends GenericDAO { } public List getStatuses(Feed feed, User user, - boolean unreadOnly) { - return getStatuses(feed, user, unreadOnly, -1, -1); + boolean unreadOnly, ReadingOrder order) { + return getStatuses(feed, user, unreadOnly, -1, -1, order); } public List getStatuses(Feed feed, User user, - boolean unreadOnly, int offset, int limit) { + boolean unreadOnly, int offset, int limit, ReadingOrder order) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -161,26 +153,22 @@ public class FeedEntryStatusService extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } query.where(predicates.toArray(new Predicate[0])); - query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( - FeedEntry_.updated))); + + orderBy(query, root, order); TypedQuery q = em.createQuery(query); - if (offset > -1) { - q.setFirstResult(offset); - } - if (limit > -1) { - q.setMaxResults(limit); - } + limit(q, offset, limit); return q.getResultList(); } public List getStatuses(List categories, - User user, boolean unreadOnly) { - return getStatuses(categories, user, unreadOnly, -1, -1); + User user, boolean unreadOnly, ReadingOrder order) { + return getStatuses(categories, user, unreadOnly, -1, -1, order); } public List getStatuses(List categories, - User user, boolean unreadOnly, int offset, int limit) { + User user, boolean unreadOnly, int offset, int limit, + ReadingOrder order) { CriteriaQuery query = builder.createQuery(getType()); Root root = query.from(getType()); @@ -194,32 +182,51 @@ public class FeedEntryStatusService extends GenericDAO { predicates.add(builder.isFalse(root.get(FeedEntryStatus_.read))); } query.where(predicates.toArray(new Predicate[0])); - query.orderBy(builder.desc(root.get(FeedEntryStatus_.entry).get( - FeedEntry_.updated))); + + orderBy(query, root, order); TypedQuery q = em.createQuery(query); - if (offset > -1) { - q.setFirstResult(offset); - } - if (limit > -1) { - q.setMaxResults(limit); - } + limit(q, offset, limit); return q.getResultList(); } + private void limit(TypedQuery query, int offset, int limit) { + if (offset > -1) { + query.setFirstResult(offset); + } + if (limit > -1) { + query.setMaxResults(limit); + } + } + + private void orderBy(CriteriaQuery query, + Root root, ReadingOrder order) { + Path orderPath = root.get(FeedEntryStatus_.entry).get( + FeedEntry_.updated); + if (order == ReadingOrder.asc) { + query.orderBy(builder.asc(orderPath)); + } else { + query.orderBy(builder.desc(orderPath)); + } + + } + public void markFeedEntries(User user, Feed feed, Date olderThan) { - List statuses = getStatuses(feed, user, true); + List statuses = getStatuses(feed, user, true, + ReadingOrder.desc); update(markList(statuses, olderThan)); } public void markCategoryEntries(User user, List categories, Date olderThan) { - List statuses = getStatuses(categories, user, true); + List statuses = getStatuses(categories, user, true, + ReadingOrder.desc); update(markList(statuses, olderThan)); } public void markAllEntries(User user, Date olderThan) { - List statuses = getStatuses(user, true); + List statuses = getStatuses(user, true, + ReadingOrder.desc); update(markList(statuses, olderThan)); } diff --git a/src/main/java/com/commafeed/backend/model/UserSettings.java b/src/main/java/com/commafeed/backend/model/UserSettings.java index 44fba463..d95715a8 100644 --- a/src/main/java/com/commafeed/backend/model/UserSettings.java +++ b/src/main/java/com/commafeed/backend/model/UserSettings.java @@ -18,6 +18,10 @@ public class UserSettings extends AbstractModel { all, unread } + public enum ReadingOrder { + asc, desc + } + @OneToOne @JoinColumn(name = "user_id", nullable = false) private User user; @@ -26,6 +30,10 @@ public class UserSettings extends AbstractModel { @Column(nullable = false) private ReadingMode readingMode; + @Enumerated(EnumType.STRING) + @Column(nullable = false) + private ReadingOrder readingOrder; + @Lob @Column(length = Integer.MAX_VALUE) private String customCss; @@ -54,4 +62,12 @@ public class UserSettings extends AbstractModel { this.customCss = customCss; } + public ReadingOrder getReadingOrder() { + return readingOrder; + } + + public void setReadingOrder(ReadingOrder readingOrder) { + this.readingOrder = readingOrder; + } + } diff --git a/src/main/java/com/commafeed/frontend/model/Settings.java b/src/main/java/com/commafeed/frontend/model/Settings.java index c462483c..2d072a21 100644 --- a/src/main/java/com/commafeed/frontend/model/Settings.java +++ b/src/main/java/com/commafeed/frontend/model/Settings.java @@ -6,6 +6,7 @@ import java.io.Serializable; public class Settings implements Serializable { private String readingMode; + private String readingOrder; private String customCss; public String getReadingMode() { @@ -24,4 +25,12 @@ public class Settings implements Serializable { this.customCss = customCss; } + public String getReadingOrder() { + return readingOrder; + } + + public void setReadingOrder(String readingOrder) { + this.readingOrder = readingOrder; + } + } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/AdminUsersREST.java b/src/main/java/com/commafeed/frontend/rest/resources/AdminUsersREST.java index 884e775c..dc56f006 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/AdminUsersREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/AdminUsersREST.java @@ -17,6 +17,7 @@ import com.commafeed.backend.StartupBean; import com.commafeed.backend.model.User; import com.commafeed.backend.model.UserRole; import com.commafeed.backend.model.UserRole.Role; +import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.frontend.SecurityCheck; import com.commafeed.frontend.model.UserModel; import com.google.common.base.Preconditions; @@ -135,7 +136,7 @@ public class AdminUsersREST extends AbstractREST { .entity("You cannot delete the admin user.").build(); } feedEntryStatusService.delete(feedEntryStatusService.getStatuses(user, - false)); + false, ReadingOrder.desc)); feedSubscriptionService.delete(feedSubscriptionService.findAll(user)); feedCategoryService.delete(feedCategoryService.findAll(user)); userSettingsService.delete(userSettingsService.findByUser(user)); diff --git a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java index 8d72bcda..f7832441 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/EntriesREST.java @@ -18,6 +18,7 @@ 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.UserSettings.ReadingOrder; import com.commafeed.frontend.model.Entries; import com.commafeed.frontend.model.Entry; import com.google.common.base.Preconditions; @@ -42,7 +43,8 @@ public class EntriesREST extends AbstractREST { @QueryParam("id") String id, @QueryParam("readType") ReadType readType, @DefaultValue("0") @QueryParam("offset") int offset, - @DefaultValue("-1") @QueryParam("limit") int limit) { + @DefaultValue("-1") @QueryParam("limit") int limit, + @QueryParam("order") @DefaultValue("desc") ReadingOrder order) { Preconditions.checkNotNull(type); Preconditions.checkNotNull(id); @@ -61,7 +63,7 @@ public class EntriesREST extends AbstractREST { List unreadEntries = feedEntryStatusService .getStatuses(subscription.getFeed(), getUser(), - unreadOnly, offset, limit); + unreadOnly, offset, limit, order); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add(buildEntry(status)); } @@ -72,7 +74,8 @@ public class EntriesREST extends AbstractREST { if (ALL.equals(id)) { entries.setName("All"); List unreadEntries = feedEntryStatusService - .getStatuses(getUser(), unreadOnly, offset, limit); + .getStatuses(getUser(), unreadOnly, offset, limit, + order); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add(buildEntry(status)); } @@ -85,7 +88,7 @@ public class EntriesREST extends AbstractREST { .findAllChildrenCategories(getUser(), feedCategory); List unreadEntries = feedEntryStatusService .getStatuses(childrenCategories, getUser(), - unreadOnly, offset, limit); + unreadOnly, offset, limit, order); for (FeedEntryStatus status : unreadEntries) { entries.getEntries().add(buildEntry(status)); } diff --git a/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java b/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java index 9ffb1fa7..4000a53b 100644 --- a/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java +++ b/src/main/java/com/commafeed/frontend/rest/resources/SettingsREST.java @@ -8,6 +8,7 @@ import javax.ws.rs.core.Response.Status; import com.commafeed.backend.model.UserSettings; import com.commafeed.backend.model.UserSettings.ReadingMode; +import com.commafeed.backend.model.UserSettings.ReadingOrder; import com.commafeed.frontend.model.Settings; import com.google.common.base.Preconditions; @@ -21,9 +22,11 @@ public class SettingsREST extends AbstractREST { UserSettings settings = userSettingsService.findByUser(getUser()); if (settings != null) { s.setReadingMode(settings.getReadingMode().name()); + s.setReadingOrder(settings.getReadingOrder().name()); s.setCustomCss(settings.getCustomCss()); } else { s.setReadingMode(ReadingMode.unread.name()); + s.setReadingOrder(ReadingOrder.desc.name()); } return s; } @@ -32,13 +35,14 @@ public class SettingsREST extends AbstractREST { @POST public Response save(Settings settings) { Preconditions.checkNotNull(settings); - + UserSettings s = userSettingsService.findByUser(getUser()); if (s == null) { s = new UserSettings(); s.setUser(getUser()); } s.setReadingMode(ReadingMode.valueOf(settings.getReadingMode())); + s.setReadingOrder(ReadingOrder.valueOf(settings.getReadingOrder())); s.setCustomCss(settings.getCustomCss()); userSettingsService.saveOrUpdate(s); return Response.ok(Status.OK).build(); diff --git a/src/main/webapp/js/controllers.js b/src/main/webapp/js/controllers.js index 08cbf00e..1e87ad86 100644 --- a/src/main/webapp/js/controllers.js +++ b/src/main/webapp/js/controllers.js @@ -214,6 +214,12 @@ module.controller('ToolbarCtrl', function($scope, $http, $state, $stateParams, SettingsService.save(); } }); + $scope.$watch('settingsService.settings.readingOrder', function(newValue, + oldValue) { + if (newValue && oldValue && newValue != oldValue) { + SettingsService.save(); + } + }); $scope.refresh = function() { $scope.$emit('emitReload'); }; @@ -267,6 +273,12 @@ module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, $scope.$emit('emitReload'); } }); + $scope.$watch('settingsService.settings.readingOrder', function(newValue, + oldValue) { + if (newValue && oldValue && newValue != oldValue) { + $scope.$emit('emitReload'); + } + }); $scope.limit = 10; $scope.busy = false; @@ -302,6 +314,7 @@ module.controller('FeedListCtrl', function($scope, $stateParams, $http, $route, type : $scope.selectedType, id : $scope.selectedId, readType : $scope.settingsService.settings.readingMode, + order : $scope.settingsService.settings.readingOrder, offset : $scope.entries.length, limit : limit }, callback); diff --git a/src/main/webapp/templates/_toolbar.html b/src/main/webapp/templates/_toolbar.html index c4c66f59..80b75ae3 100644 --- a/src/main/webapp/templates/_toolbar.html +++ b/src/main/webapp/templates/_toolbar.html @@ -5,6 +5,10 @@ +
+ + +