Skip to content

Commit 2748b4d

Browse files
ruksana2808Karthikeyan R
authored andcommitted
KB-13226| Q11 | Ad-Hoc | Enhance backend service and provide admin API to update AccessSettings in Course & Training Plan (#243)
* KB-12452| DEV | BE | Notification while retirement * KB-13086| Q11 | Ad-Hoc | CA and APAR Enhancements | Adding CA flag in APAR Courses * KB-13086| Q11 | Ad-Hoc | CA and APAR Enhancements | Adding CA flag in APAR Courses * KB-13086| Q11 | Ad-Hoc | CA and APAR Enhancements | Adding CA flag in APAR Courses * KB-13226| Q11 | Ad-Hoc | Enhance backend service and provide admin API to update AccessSettings in Course & Training Plan
1 parent 009af43 commit 2748b4d

File tree

3 files changed

+119
-0
lines changed

3 files changed

+119
-0
lines changed

src/main/java/com/igot/cb/controller/AccessSettingsController.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,12 @@ public ResponseEntity<ApiResponse> migrateAccessSettingRules() {
5454
ApiResponse response = accessSettingMigrationService.migrateAccessSettingRules();
5555
return new ResponseEntity<>(response, response.getResponseCode());
5656
}
57+
58+
//create and update API for admin (merges userGroups with identical criteria)
59+
@PutMapping("/admin/v1/upsert")
60+
public ResponseEntity<ApiResponse> upsertAdmin(@RequestBody Map<String, Object> userGroupDetails,
61+
@RequestHeader(Constants.X_AUTH_TOKEN) String authToken) {
62+
ApiResponse response = accessSettingsService.adminUpsert(userGroupDetails, authToken);
63+
return new ResponseEntity<>(response, response.getResponseCode());
64+
}
5765
}

src/main/java/com/igot/cb/service/AccessSettingsServiceImpl.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import java.util.Map;
77
import java.util.UUID;
88

9+
import com.igot.cb.util.UserGroupUtils;
910
import org.apache.commons.lang.StringUtils;
1011
import org.springframework.http.HttpStatus;
1112
import org.springframework.stereotype.Service;
@@ -187,4 +188,55 @@ public Map<String, Object> createUserGroupIds(Map<String, Object> payload) {
187188
}
188189
return payload;
189190
}
191+
192+
// Admin upsert: merges userGroups with identical criteria before assigning UUIDs
193+
public ApiResponse adminUpsert(Map<String, Object> userGroupDetails, String authToken) {
194+
log.info("AccessSettingsService::upsertAdmin:inside");
195+
ApiResponse response = ApiResponse.createDefaultResponse(Constants.ACCESS_SETTINGS_CREATE_API);
196+
if (userGroupDetails == null || userGroupDetails.isEmpty()) {
197+
log.error("User group details are null or empty");
198+
setFailedResponse(response, "User group details cannot be null or empty");
199+
return response;
200+
}
201+
try {
202+
// Validate userGroups: no criteria key or value should be empty
203+
Object accessControlObj = userGroupDetails.get(Constants.ACCESS_CONTROL);
204+
if (accessControlObj instanceof Map) {
205+
Map<String, Object> accessControl = (Map<String, Object>) accessControlObj;
206+
Object userGroupsObj = accessControl.get(Constants.USER_GROUPS);
207+
if (userGroupsObj instanceof List) {
208+
List<Map<String, Object>> userGroups = (List<Map<String, Object>>) userGroupsObj;
209+
String validationError = UserGroupUtils.validateUserGroupsNoEmptyCriteria(userGroups);
210+
if (validationError != null) {
211+
setFailedResponse(response, validationError);
212+
return response;
213+
}
214+
}
215+
}
216+
Map<String, Object> createPayloadWithUuid = createUserGroupIds(userGroupDetails);
217+
Map<String, Object> accessRuleData = new HashMap<>();
218+
accessRuleData.put(Constants.CONTEXT_ID, userGroupDetails.get(Constants.CONTENT_ID));
219+
accessRuleData.put(Constants.CONTEXT_DATA, objectMapper.writeValueAsString(createPayloadWithUuid));
220+
accessRuleData.put(Constants.IS_ARCHIVED, false);
221+
if (accessSettingMigrationService.processAccessSettingRule(accessRuleData)) {
222+
cassandraOperation.insertRecord(Constants.KEYSPACE_SUNBIRD_COURSE,
223+
Constants.ACCESS_SETTINGS_RULES_TABLE_V2, accessRuleData);
224+
response.getResult().put(Constants.MSG, Constants.CREATED_RULES);
225+
Map<String, Object> payload = new HashMap<>();
226+
payload.put(Constants.ACCESS_CONTROL, createPayloadWithUuid.get(Constants.ACCESS_CONTROL));
227+
response.getResult().putAll(payload);
228+
return response;
229+
} else {
230+
log.error("Failed to process access setting rule");
231+
setFailedResponse(response, "Failed to process access setting rule to id-map",
232+
HttpStatus.INTERNAL_SERVER_ERROR);
233+
return response;
234+
}
235+
} catch (Exception e) {
236+
log.error("Error while upserting access settings", e);
237+
setFailedResponse(response, "Failed to create access settings: " + e.getMessage(),
238+
HttpStatus.INTERNAL_SERVER_ERROR);
239+
return response;
240+
}
241+
}
190242
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.igot.cb.util;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashSet;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.Set;
8+
9+
/**
10+
* Utility class for user group operations.
11+
*/
12+
public class UserGroupUtils {
13+
14+
/**
15+
* Validates that no criteria key or value is empty in the userGroups list.
16+
* If criteriaValue is a list, ensures no element is null, empty, or blank.
17+
* Returns null if valid, or an error message if invalid.
18+
* Handles String and Boolean types for value. Boolean must be true or false (not null).
19+
*/
20+
@SuppressWarnings("unchecked")
21+
public static String validateUserGroupsNoEmptyCriteria(List<Map<String, Object>> userGroups) {
22+
for (Map<String, Object> userGroup : userGroups) {
23+
Object criteriaListObj = userGroup.get(Constants.USER_GROUP_CRITERIA_LIST);
24+
if (criteriaListObj instanceof List) {
25+
List<Map<String, Object>> criteriaList = (List<Map<String, Object>>) criteriaListObj;
26+
for (Map<String, Object> criteria : criteriaList) {
27+
Object key = criteria.get(Constants.CRITERIA_KEY);
28+
Object value = criteria.get(Constants.CRITERIA_VALUE);
29+
if (key == null || key.toString().trim().isEmpty() || value == null) {
30+
return "Criteria key and value must not be empty";
31+
}
32+
if (value instanceof String) {
33+
if (((String) value).trim().isEmpty()) {
34+
return "Criteria key and value must not be empty";
35+
}
36+
} else if (value instanceof List) {
37+
List<?> valueList = (List<?>) value;
38+
if (valueList.isEmpty()) {
39+
return "Criteria value list must not be empty";
40+
}
41+
for (Object eachValue : valueList) {
42+
if (eachValue == null) {
43+
return "Criteria value list must not contain null values";
44+
}
45+
if (eachValue instanceof String && ((String) eachValue).trim().isEmpty()) {
46+
return "Criteria value list must not contain empty or blank values";
47+
}
48+
// Boolean true/false are both valid, only null is invalid (already checked)
49+
}
50+
} else if (!(value instanceof Boolean)) {
51+
// Only String, List, or Boolean are allowed
52+
return "Criteria value must be a String, Boolean, or List";
53+
}
54+
}
55+
}
56+
}
57+
return null;
58+
}
59+
}

0 commit comments

Comments
 (0)