Skip to content

v0.2.51..v0.2.52 changeset UserResource.java

Garret Voltz edited this page Jan 15, 2020 · 1 revision
diff --git a/hoot-services/src/main/java/hoot/services/controllers/osm/user/UserResource.java b/hoot-services/src/main/java/hoot/services/controllers/osm/user/UserResource.java
index ed73702..4595ac2 100644
--- a/hoot-services/src/main/java/hoot/services/controllers/osm/user/UserResource.java
+++ b/hoot-services/src/main/java/hoot/services/controllers/osm/user/UserResource.java
@@ -22,20 +22,25 @@
  * This will properly maintain the copyright information. DigitalGlobe
  * copyrights will be updated automatically.
  *
- * @copyright Copyright (C) 2016, 2017, 2018, 2019 DigitalGlobe (http://www.digitalglobe.com/)
+ * @copyright Copyright (C) 2016, 2017, 2018, 2019, 2020 DigitalGlobe (http://www.digitalglobe.com/)
  */
 package hoot.services.controllers.osm.user;
 
 import static hoot.services.models.db.QUsers.users;
 import static hoot.services.utils.DbUtils.createQuery;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
@@ -58,6 +63,7 @@ import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 import com.querydsl.core.Tuple;
+import com.querydsl.core.types.OrderSpecifier;
 
 import hoot.services.controllers.auth.UserManager;
 import hoot.services.controllers.osm.OsmResponseHeaderGenerator;
@@ -189,25 +195,50 @@ public class UserResource {
     @GET
     @Path("/all")
     @Produces(MediaType.APPLICATION_JSON)
-    public Response getAllUsers(@Context HttpServletRequest request) {
+    public Response getAllUsers(@Context HttpServletRequest request,
+            @QueryParam("sort") @DefaultValue("") String sort,
+            @QueryParam("privileges") @DefaultValue("") String privileges) {
         Users currentUser = Users.fromRequest(request);
 
         try {
             List<Tuple> userInfo;
+            OrderSpecifier<?> sorter;
+            Collection<String> activePrivileges = new ArrayList<>();
+
+            switch (sort) {
+                case "-auth":
+                    sorter = users.hootservices_last_authorize.desc();
+                    break;
+                case "+auth":
+                    sorter = users.hootservices_last_authorize.asc();
+                    break;
+                case "-name":
+                    sorter = users.displayName.desc();
+                    break;
+                case "+name":
+                default:
+                    sorter = users.displayName.asc();
+                    break;
+            }
 
             // Run the proper query to retrieve user data based on the request users privileges
             // Admin user gets extra info on other users
             if (adminUserCheck(currentUser)) {
+                if (!privileges.isEmpty()) {
+                    activePrivileges = Arrays.stream(privileges.split(","))
+                            .collect(Collectors.toList());
+                }
+
                 userInfo = createQuery()
                         .select(users.id, users.displayName, users.hootservices_last_authorize, users.privileges)
                         .from(users)
-                        .orderBy(users.displayName.asc())
+                        .orderBy(sorter)
                         .fetch();
             } else {
                 userInfo = createQuery()
                         .select(users.id, users.displayName)
                         .from(users)
-                        .orderBy(users.displayName.asc())
+                        .orderBy(sorter)
                         .fetch();
             }
 
@@ -215,15 +246,26 @@ public class UserResource {
 
             for (Tuple tuple : userInfo) {
                 Users user = new Users();
-                user.setId(tuple.get(users.id));
-                user.setDisplayName(tuple.get(users.displayName));
 
                 if (adminUserCheck(currentUser)) {
-                    user.setHootservicesLastAuthorize(tuple.get(users.hootservices_last_authorize));
-                    user.setPrivileges(tuple.get(users.privileges));
+                    Map<String, String> substitutionMap = (Map<String, String>) tuple.get(users.privileges);
+                    Collection<String> filterPrivileges = substitutionMap.keySet()
+                            .stream().filter(map -> substitutionMap.get(map).equals("true"))
+                            .collect(Collectors.toSet());
+
+                    if (activePrivileges.size() == 0 || filterPrivileges.containsAll(activePrivileges)) {
+                        user.setId(tuple.get(users.id));
+                        user.setDisplayName(tuple.get(users.displayName));
+                        user.setHootservicesLastAuthorize(tuple.get(users.hootservices_last_authorize));
+                        user.setPrivileges(tuple.get(users.privileges));
+                        userList.add(user);
+                    }
+
+                } else {
+                    user.setId(tuple.get(users.id));
+                    user.setDisplayName(tuple.get(users.displayName));
+                    userList.add(user);
                 }
-
-                userList.add(user);
             }
 
             return Response.ok().entity(userList).build();
@@ -299,29 +341,12 @@ public class UserResource {
     }
 
     /**
-     * Gets all types of privileges a user can have
-     *
-     * GET hoot-services/osm/api/0.6/user/getPrivilegeOptions
-     *
-     * @param request
-     * @return list of privileges a user can have
-     */
-    @GET
-    @Path("/getPrivilegeOptions")
-    @Produces(MediaType.APPLICATION_JSON)
-    public Response getPrivilegeOptions(@Context HttpServletRequest request) {
-        String[] privilegeOptions = { "admin", "advanced" };
-
-        return Response.ok().entity(privilegeOptions).build();
-    }
-
-    /**
      * Checks if the specified user is an admin user
      *
      * @param user
      * @return true if user has admin privileges, else false
      */
-    private static boolean adminUserCheck(Users user) {
+    public static boolean adminUserCheck(Users user) {
         Map<String, String> privileges = PostgresUtils.postgresObjToHStore(user.getPrivileges());
         return privileges != null && ("true").equals(privileges.get("admin"));
     }
Clone this wiki locally