diff options
author | Ryan Campbell <ryanjcampbell@google.com> | 2017-08-23 12:38:16 -0700 |
---|---|---|
committer | Ryan Campbell <ryanjcampbell@google.com> | 2017-08-23 12:38:16 -0700 |
commit | 788031ccad40b70b0c4479a96a4d82b88e88c90c (patch) | |
tree | 196a7764dedb113d4dacd17e905a276aa444c53d /src/main/java/com/android/vts/api | |
parent | bf87c647f9907b73df940150bd2ea98c99329e10 (diff) | |
download | dashboard-788031ccad40b70b0c4479a96a4d82b88e88c90c.tar.gz |
Allow user to mute notifications on a favorite.
Allow the user to disable email notifications for a test without
removing it from favorites. This is the first step in some actionable
user feedback because this change can be used to allow the user to
unsubscribe from email alerts.
Test: staging
Bug: 62999724
Change-Id: I4df89ba3ac00ab7b173fb503913bda65227fca86
Diffstat (limited to 'src/main/java/com/android/vts/api')
-rw-r--r-- | src/main/java/com/android/vts/api/UserFavoriteRestServlet.java | 133 |
1 files changed, 101 insertions, 32 deletions
diff --git a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java b/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java index f863051..bbb95da 100644 --- a/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java +++ b/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java @@ -25,11 +25,11 @@ import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; import com.google.appengine.api.datastore.Query; -import com.google.appengine.api.datastore.Transaction; import com.google.appengine.api.datastore.Query.CompositeFilterOperator; import com.google.appengine.api.datastore.Query.Filter; import com.google.appengine.api.datastore.Query.FilterOperator; import com.google.appengine.api.datastore.Query.FilterPredicate; +import com.google.appengine.api.datastore.Transaction; import com.google.appengine.api.users.User; import com.google.appengine.api.users.UserService; import com.google.appengine.api.users.UserServiceFactory; @@ -50,40 +50,37 @@ public class UserFavoriteRestServlet extends HttpServlet { Logger.getLogger(UserFavoriteRestServlet.class.getName()); /** - * Add a test to the user's favorites. + * Add a new favorite entity. + * + * @param user The user for which to add a favorite. + * @param test The name of the test. + * @param muteNotifications True if the subscriber has muted notifications, false otherwise. + * @param response The servlet response object. + * @return a json object with the generated key to the new favorite entity. + * @throws IOException */ - @Override - public void doPost(HttpServletRequest request, HttpServletResponse response) + private static JsonObject addFavorite( + User user, String test, boolean muteNotifications, HttpServletResponse response) throws IOException { - UserService userService = UserServiceFactory.getUserService(); - User currentUser = userService.getCurrentUser(); DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); - - // Retrieve the added tests from the request. - String test = request.getPathInfo(); - if (test == null) { - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return; - } - if (test.startsWith("/")) { - test = test.substring(1); - } Key addedTestKey = KeyFactory.createKey(TestEntity.KIND, test); // Filter the tests that exist from the set of tests to add try { datastore.get(addedTestKey); } catch (EntityNotFoundException e) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return; + return null; } Filter userFilter = - new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, currentUser); - Filter testFilter = new FilterPredicate( - UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey); - Query q = new Query(UserFavoriteEntity.KIND) - .setFilter(CompositeFilterOperator.and(userFilter, testFilter)) - .setKeysOnly(); + new FilterPredicate(UserFavoriteEntity.USER, FilterOperator.EQUAL, user); + Filter testFilter = + new FilterPredicate( + UserFavoriteEntity.TEST_KEY, FilterOperator.EQUAL, addedTestKey); + Query q = + new Query(UserFavoriteEntity.KIND) + .setFilter(CompositeFilterOperator.and(userFilter, testFilter)) + .setKeysOnly(); Key favoriteKey = null; @@ -94,7 +91,8 @@ public class UserFavoriteRestServlet extends HttpServlet { break; } if (favoriteKey == null) { - UserFavoriteEntity favorite = new UserFavoriteEntity(currentUser, addedTestKey); + UserFavoriteEntity favorite = + new UserFavoriteEntity(user, addedTestKey, muteNotifications); Entity entity = favorite.toEntity(); datastore.put(entity); favoriteKey = entity.getKey(); @@ -102,24 +100,95 @@ public class UserFavoriteRestServlet extends HttpServlet { txn.commit(); } finally { if (txn.isActive()) { - logger.log(Level.WARNING, + logger.log( + Level.WARNING, "Transaction rollback forced for favorite creation: " + test); txn.rollback(); } } - - response.setContentType("application/json"); - PrintWriter writer = response.getWriter(); JsonObject json = new JsonObject(); json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey))); - writer.print(new Gson().toJson(json)); - writer.flush(); - response.setStatus(HttpServletResponse.SC_OK); + return json; } /** - * Remove a test from the user's favorites. + * @param user The user for which to add a favorite. + * @param favoriteKey The database key to the favorite entity to update. + * @param muteNotifications True if the subscriber has muted notifications, false otherwise. + * @param response The servlet response object. + * @return a json object with the generated key to the new favorite entity. + * @throws IOException */ + private static JsonObject updateFavorite( + User user, Key favoriteKey, boolean muteNotifications, HttpServletResponse response) + throws IOException { + DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); + Entity favoriteEntity; + try { + favoriteEntity = datastore.get(favoriteKey); + } catch (EntityNotFoundException e) { + response.setStatus(HttpServletResponse.SC_BAD_REQUEST); + return null; + } + UserFavoriteEntity favorite = UserFavoriteEntity.fromEntity(favoriteEntity); + if (favorite.user.getUserId() == user.getUserId()) { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); + return null; + } + if (favorite.muteNotifications != muteNotifications) { + Transaction txn = datastore.beginTransaction(); + try { + favorite.muteNotifications = muteNotifications; + datastore.put(favorite.toEntity()); + txn.commit(); + } finally { + if (txn.isActive()) { + logger.log( + Level.WARNING, + "Transaction rollback forced for favorite update: " + favoriteKey); + txn.rollback(); + } + } + } + JsonObject json = new JsonObject(); + json.add("key", new JsonPrimitive(KeyFactory.keyToString(favoriteKey))); + return json; + } + + /** Add a test to the user's favorites. */ + @Override + public void doPost(HttpServletRequest request, HttpServletResponse response) + throws IOException { + UserService userService = UserServiceFactory.getUserService(); + User currentUser = userService.getCurrentUser(); + + boolean muteNotifications = false; + if (request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS) != null) { + muteNotifications = + Boolean.parseBoolean( + request.getParameter(UserFavoriteEntity.MUTE_NOTIFICATIONS)); + } + + String userFavoritesKeyString = request.getParameter("userFavoritesKey"); + String testName = request.getParameter("testName"); + + JsonObject returnData = null; + if (userFavoritesKeyString != null) { + Key userFavoritesKey = KeyFactory.stringToKey(userFavoritesKeyString); + returnData = updateFavorite(currentUser, userFavoritesKey, muteNotifications, response); + } else if (testName != null) { + returnData = addFavorite(currentUser, testName, muteNotifications, response); + } + + if (returnData != null) { + response.setContentType("application/json"); + PrintWriter writer = response.getWriter(); + writer.print(new Gson().toJson(returnData)); + writer.flush(); + } + } + + /** Remove a test from the user's favorites. */ @Override public void doDelete(HttpServletRequest request, HttpServletResponse response) throws IOException { |