summaryrefslogtreecommitdiff
path: root/src/main/java/com/android/vts/api/UserFavoriteRestServlet.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/android/vts/api/UserFavoriteRestServlet.java')
-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 {