summaryrefslogtreecommitdiff
path: root/src/main/java/com/android/vts/api
diff options
context:
space:
mode:
authorRyan Campbell <ryanjcampbell@google.com>2017-08-23 12:38:16 -0700
committerRyan Campbell <ryanjcampbell@google.com>2017-08-23 12:38:16 -0700
commit788031ccad40b70b0c4479a96a4d82b88e88c90c (patch)
tree196a7764dedb113d4dacd17e905a276aa444c53d /src/main/java/com/android/vts/api
parentbf87c647f9907b73df940150bd2ea98c99329e10 (diff)
downloaddashboard-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.java133
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 {