Skip to content

Commit b3df141

Browse files
committed
Changes add/remove member request to contain a body
1 parent 2c51aca commit b3df141

File tree

11 files changed

+299
-115
lines changed

11 files changed

+299
-115
lines changed

src/main/java/edu/hawaii/its/api/controller/GroupingsRestController.java

+38-25
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package edu.hawaii.its.api.controller;
22

33
import java.security.Principal;
4+
import java.util.ArrayList;
45
import java.util.HashMap;
6+
import java.util.List;
57
import java.util.Map;
68

79
import javax.annotation.PostConstruct;
@@ -89,7 +91,7 @@ public class GroupingsRestController {
8991

9092
// Constructor.
9193
public GroupingsRestController() {
92-
policy = Sanitizers.FORMATTING.and(Sanitizers.LINKS);
94+
policy = Sanitizers.FORMATTING;
9395
}
9496

9597
/*
@@ -274,63 +276,59 @@ public ResponseEntity<String> optOut(Principal principal, @PathVariable String g
274276
/**
275277
* Add a list of usersToAdd to include group of grouping at path.
276278
*/
277-
@PostMapping(value = "/{groupingPath}/{usersToAdd}/addMembersToIncludeGroup")
279+
@PutMapping(value = "/{groupingPath}/addMembersToIncludeGroup")
278280
public ResponseEntity<String> addMembersToIncludeGroup(Principal principal,
279281
@PathVariable String groupingPath,
280-
@PathVariable String usersToAdd) {
282+
@RequestBody List<String> usersToAdd) {
281283
logger.info("Entered REST addMembersToIncludeGroup...");
282284
String safeGroupingPath = policy.sanitize(groupingPath);
283-
String safeUsersToAdd = policy.sanitize(usersToAdd);
284-
String uri = String.format(API_2_1_BASE + "/groupings/%s/include-members/%s", safeGroupingPath,
285-
safeUsersToAdd);
286-
return httpRequestService.makeApiRequest(principal.getName(), uri, HttpMethod.PUT);
285+
List<String> safeUsersToAdd = sanitizeList(usersToAdd);
286+
String uri = String.format(API_2_1_BASE + "/groupings/%s/include-members", safeGroupingPath);
287+
return httpRequestService.makeApiRequestWithBody(principal.getName(), uri, safeUsersToAdd, HttpMethod.PUT);
287288
}
288289

289290
/**
290291
* Add a list of usersToAdd to exclude group of grouping at path.
291292
*/
292-
@PostMapping(value = "/{groupingPath}/{usersToAdd}/addMembersToExcludeGroup")
293+
@PutMapping(value = "/{groupingPath}/addMembersToExcludeGroup")
293294
public ResponseEntity<String> addMembersToExcludeGroup(Principal principal,
294295
@PathVariable String groupingPath,
295-
@PathVariable String usersToAdd) {
296+
@RequestBody List<String> usersToAdd) {
296297
logger.info("Entered REST addMembersToExcludeGroup...");
297298
String safeGroupingPath = policy.sanitize(groupingPath);
298-
String safeUsersToAdd = policy.sanitize(usersToAdd);
299-
String uri = String.format(API_2_1_BASE + "/groupings/%s/exclude-members/%s", safeGroupingPath,
300-
safeUsersToAdd);
301-
return httpRequestService.makeApiRequest(principal.getName(), uri, HttpMethod.PUT);
299+
List<String> safeUsersToAdd = sanitizeList(usersToAdd);
300+
String uri = String.format(API_2_1_BASE + "/groupings/%s/exclude-members", safeGroupingPath);
301+
return httpRequestService.makeApiRequestWithBody(principal.getName(), uri, safeUsersToAdd, HttpMethod.PUT);
302302
}
303303

304304
/**
305305
* Remove a list of users from include group of grouping at path.
306306
*/
307-
@PostMapping(value = "/{groupingPath}/{usersToDelete}/removeMembersFromIncludeGroup")
307+
@PutMapping(value = "/{groupingPath}/removeMembersFromIncludeGroup")
308308
public ResponseEntity<String> removeMembersFromIncludeGroup(Principal principal,
309309
@PathVariable String groupingPath,
310-
@PathVariable String usersToDelete) {
310+
@RequestBody List<String> usersToDelete) {
311311
logger.info("Entered REST deleteMembersFromIncludeGroup...");
312312
String safeGroupingPath = policy.sanitize(groupingPath);
313-
String safeUserToDelete = policy.sanitize(usersToDelete);
313+
List<String> safeUsersToDelete = sanitizeList(usersToDelete);
314314
String uri =
315-
String.format(API_2_1_BASE + "/groupings/%s/include-members/%s", safeGroupingPath,
316-
safeUserToDelete);
317-
return httpRequestService.makeApiRequest(principal.getName(), uri, HttpMethod.DELETE);
315+
String.format(API_2_1_BASE + "/groupings/%s/include-members", safeGroupingPath);
316+
return httpRequestService.makeApiRequestWithBody(principal.getName(), uri, safeUsersToDelete, HttpMethod.DELETE);
318317
}
319318

320319
/**
321320
* Remove a list of users from exclude group of grouping at path.
322321
*/
323-
@PostMapping(value = "/{groupingPath}/{usersToDelete}/removeMembersFromExcludeGroup")
322+
@PutMapping(value = "/{groupingPath}/removeMembersFromExcludeGroup")
324323
public ResponseEntity<String> removeMembersFromExcludeGroup(Principal principal,
325324
@PathVariable String groupingPath,
326-
@PathVariable String usersToDelete) {
325+
@RequestBody List<String> usersToDelete) {
327326
logger.info("Entered REST deleteMembersFromExcludeGroup...");
328327
String safeGroupingPath = policy.sanitize(groupingPath);
329-
String safeUserToDelete = policy.sanitize(usersToDelete);
328+
List<String> safeUsersToDelete = sanitizeList(usersToDelete);
330329
String uri =
331-
String.format(API_2_1_BASE + "/groupings/%s/exclude-members/%s", safeGroupingPath,
332-
safeUserToDelete);
333-
return httpRequestService.makeApiRequest(principal.getName(), uri, HttpMethod.DELETE);
330+
String.format(API_2_1_BASE + "/groupings/%s/exclude-members", safeGroupingPath);
331+
return httpRequestService.makeApiRequestWithBody(principal.getName(), uri, safeUsersToDelete, HttpMethod.DELETE);
334332
}
335333

336334
/**
@@ -513,6 +511,21 @@ public ResponseEntity<String> allSyncDestinations(Principal principal, @PathVari
513511
// Helper Methods
514512
//////////////////////////////////////////////////////////////////////
515513

514+
public List<String> sanitizeList(List<String> data) {
515+
List<String> sanitizedList = new ArrayList<>();
516+
String sanitizedString;
517+
518+
for (int i = 0; i < data.size(); i++) {
519+
sanitizedString = policy.sanitize(data.get(i));
520+
521+
if (!(sanitizedString.isEmpty())) {
522+
sanitizedList.add(sanitizedString);
523+
}
524+
}
525+
526+
return sanitizedList;
527+
}
528+
516529
public Map<String, String> mapGroupingParameters(Integer page, Integer size, String sortString,
517530
Boolean isAscending) {
518531
Map<String, String> params = new HashMap<>();

src/main/java/edu/hawaii/its/api/service/HttpRequestService.java

+3
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.http.HttpMethod;
44
import org.springframework.http.ResponseEntity;
55

6+
import java.util.List;
67
import java.util.Map;
78

89
public interface HttpRequestService {
@@ -11,6 +12,8 @@ public interface HttpRequestService {
1112

1213
ResponseEntity<String> makeApiRequestWithBody(String currentUser, String uri, String data, HttpMethod method);
1314

15+
ResponseEntity<String> makeApiRequestWithBody(String currentUser, String uri, List<String> data, HttpMethod method);
16+
1417
ResponseEntity<String> makeApiRequestWithParameters(String currentUser, String urlTemplate, Map<String, String> params, HttpMethod method);
1518

1619
}

src/main/java/edu/hawaii/its/api/service/HttpRequestServiceImpl.java

+14
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.springframework.stereotype.Service;
1212
import org.springframework.web.client.RestTemplate;
1313

14+
import java.util.List;
1415
import java.util.Map;
1516

1617
@Service("httpRequestService")
@@ -52,6 +53,19 @@ public ResponseEntity<String> makeApiRequestWithBody(String currentUser, String
5253
return restTemplate.exchange(uri, method, httpEntity, String.class);
5354
}
5455

56+
@Override
57+
public ResponseEntity<String> makeApiRequestWithBody(String currentUser, String uri, List<String> data,
58+
HttpMethod method) {
59+
60+
HttpHeaders httpHeaders = new HttpHeaders();
61+
httpHeaders.set(CURRENT_USER, currentUser);
62+
HttpEntity<List<String>> httpEntity = new HttpEntity<>(data, httpHeaders);
63+
64+
RestTemplate restTemplate =
65+
new RestTemplateBuilder().errorHandler(new RestTemplateResponseErrorHandler()).build();
66+
return restTemplate.exchange(uri, method, httpEntity, String.class);
67+
}
68+
5569
@Override
5670
public ResponseEntity<String> makeApiRequestWithParameters(String currentUser, String urlTemplate, Map<String, String> params,
5771
HttpMethod method) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package edu.hawaii.its.groupings.util;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import org.apache.commons.logging.Log;
5+
import org.apache.commons.logging.LogFactory;
6+
7+
public class JsonUtil {
8+
private static final Log logger = LogFactory.getLog(JsonUtil.class);
9+
10+
// Private constructor to prevent instantiation.
11+
private JsonUtil() {
12+
// Empty.
13+
}
14+
15+
public static String asJson(final Object obj) {
16+
String result = null;
17+
try {
18+
result = new ObjectMapper().writeValueAsString(obj);
19+
} catch (Exception e) {
20+
logger.error("Error: " + e);
21+
// Maybe we should throw something?
22+
}
23+
return result;
24+
}
25+
26+
public static <T> T asObject(final String json, Class<T> type) {
27+
T result = null;
28+
try {
29+
result = new ObjectMapper().readValue(json, type);
30+
} catch (Exception e) {
31+
logger.error("Error: " + e);
32+
// Maybe we should throw something?
33+
}
34+
return result;
35+
}
36+
37+
public static void printJson(Object obj) {
38+
ObjectMapper objectMapper = new ObjectMapper();
39+
try {
40+
String json = objectMapper.writeValueAsString(obj);
41+
System.err.println(json);
42+
} catch (Exception e) {
43+
logger.error("Error: " + e);
44+
}
45+
}
46+
public static void prettyPrint(Object object) {
47+
try {
48+
String json = new ObjectMapper()
49+
.writerWithDefaultPrettyPrinter()
50+
.writeValueAsString(object);
51+
System.out.println(json);
52+
} catch (Exception e) {
53+
logger.error("Error: " + e);
54+
}
55+
}
56+
}

src/main/resources/static/javascript/mainApp/app.service.js

+21
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,27 @@
9797
});
9898
},
9999

100+
/**
101+
* PUT data to the server, if the response is OK then call the callBack function, if the response is an
102+
* error then call the callError function. If the response is not received in n seconds, launch a modal.
103+
* @param {string} url - Path to which data is being posted too.
104+
* @param {string} data - data to be updated
105+
* @param {function} modal - Launch a modal using a call back function.
106+
* @param {function} callback - Execute if response returns OK
107+
* @param {function} callError - Execute if response returns as an error.
108+
*/
109+
updateDataWithBodyAndTimeoutModal(url, data, callback, callError, modal) {
110+
let timeoutID = setTimeout(modal, timeLimit);
111+
$http.put(encodeURI(url), data)
112+
.then(function (response) {
113+
clearTimeout(timeoutID);
114+
callback(response.data);
115+
}, function (response) {
116+
clearTimeout(timeoutID);
117+
callError(response);
118+
});
119+
},
120+
100121
/**
101122
* Handle Java exceptions by performing a POST request.
102123
* @param {object} exceptionData - an object containing the exception (stored as a string)

src/main/resources/static/javascript/mainApp/general.controller.js

+18-25
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@
619619
} else {
620620
let numMembers = ($scope.manageMembers.split(" ").length - 1);
621621
if (numMembers > 0) {
622-
let users = $scope.manageMembers.split(/[ ,]+/).join(",");
622+
let users = $scope.parseAddRemoveInputStr($scope.manageMembers);
623623
$scope.manageMembers = [];
624624
if (numMembers > $scope.maxImport) {
625625
$scope.launchDynamicModal(
@@ -699,25 +699,20 @@
699699

700700
$scope.successfulAddHandler = function (res, list, listName) {
701701
let membersNotInList = [];
702-
let arrayOfMembers = list.split(",");
703702
$scope.waitingForImportResponse = false; /* Small spinner off. */
704703

705-
let data = res;
706-
for (let i = 0; i < res.length; i++) {
707-
data[parseInt(i, 10)] = res[parseInt(i, 10)];
708-
}
709-
for (let i = 0; i < data.length; i++) {
710-
let result = data[parseInt(i, 10)].result;
711-
let userWasAdded = data[parseInt(i, 10)].userWasAdded;
704+
for (let data of res) {
705+
let result = data.result;
706+
let userWasAdded = data.userWasAdded;
712707

713-
if ("FAILURE" === result || !userWasAdded) {
714-
membersNotInList.push(arrayOfMembers[i]);
708+
if (result === "FAILURE" || !userWasAdded) {
709+
membersNotInList.push(data.name);
715710
$scope.membersNotInList = membersNotInList.join(", ");
716711
} else {
717712
let person = {
718-
"uid": data[parseInt(i, 10)].uid,
719-
"uhUuid": data[parseInt(i, 10)].uhUuid,
720-
"name": data[parseInt(i, 10)].name
713+
"uid": data.uid,
714+
"uhUuid": data.uhUuid,
715+
"name": data.name
721716
};
722717
$scope.multiAddResults.push(person);
723718
$scope.multiAddResultsGeneric.push(person);
@@ -946,7 +941,8 @@
946941
$scope.updateAddMember = function (userToAdd, list) {
947942
// only initialize groupingPath if listName is not "admins"
948943
let groupingPath;
949-
const sanitizedUser = $scope.sanitizer([userToAdd]);
944+
const sanitizedUser = $scope.sanitizer([userToAdd]).split();
945+
950946
if ($scope.listName !== "admins") {
951947
groupingPath = $scope.selectedGrouping.path;
952948
}
@@ -1314,13 +1310,13 @@
13141310
};
13151311

13161312
/**
1317-
* Replace commas and spaces in str with commas.
1313+
* Divides a string into an array where commas and spaces are present.
13181314
*/
13191315
$scope.parseAddRemoveInputStr = function (str) {
13201316
if (!_.isString(str)) {
13211317
return "";
13221318
}
1323-
return str.split(/[ ,]+/).join(",");
1319+
return str.split(/[ ,]+/);
13241320
};
13251321

13261322
/**
@@ -1361,9 +1357,8 @@
13611357
default:
13621358
break;
13631359
}
1364-
let arrayOfMembers = members.split(",");
13651360
let membersNotInList = [];
1366-
for (let member of arrayOfMembers) {
1361+
for (let member of members) {
13671362
let currentMember = returnMemberObjectFromUserIdentifier(member, listToSearch);
13681363
if (_.isUndefined(currentMember)) {
13691364
membersNotInList.push(member);
@@ -1451,14 +1446,12 @@
14511446
$scope.listName = listName;
14521447
$scope.currentPage = currentPage;
14531448
let membersToRemove = $scope.parseAddRemoveInputStr($scope.membersToModify);
1454-
let numMembersToRemove = membersToRemove.split(",").length;
14551449
$scope.membersToModify = [];
1456-
if (numMembersToRemove > 1) {
1457-
membersToRemove = $scope.parseAddRemoveInputStr(membersToRemove);
1450+
if (membersToRemove.length > 1) {
14581451
removeMembers(membersToRemove, listName);
14591452
} else {
1460-
$scope.userInput = membersToRemove;
1461-
$scope.memberToRemove = returnMemberObjectFromUserIdentifier(membersToRemove, currentPage);
1453+
$scope.userInput = membersToRemove[0];
1454+
$scope.memberToRemove = returnMemberObjectFromUserIdentifier(membersToRemove[0], currentPage);
14621455
if (listName === "owners" && $scope.groupingOwners.length === 1) {
14631456
const userType = "owner";
14641457
$scope.createRemoveErrorModal(userType);
@@ -1626,7 +1619,7 @@
16261619
$scope.removeInputError = true;
16271620
} else {
16281621
const userToRemove = options.user.uhUuid;
1629-
const sanitizedUserToRemove = $scope.sanitizer([userToRemove]);
1622+
const sanitizedUserToRemove = $scope.sanitizer([userToRemove]).split();
16301623
$scope.userToRemove = options.user;
16311624
$scope.listName = options.listName;
16321625

0 commit comments

Comments
 (0)