diff --git a/.vscode/settings.json b/.vscode/settings.json index e0f15db..c6fe658 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "java.configuration.updateBuildConfiguration": "automatic" + "java.configuration.updateBuildConfiguration": "automatic", + "java.compile.nullAnalysis.mode": "disabled" } \ No newline at end of file diff --git a/backend/src/main/java/com/nttdata/calender/WebMvcConfig.java b/backend/src/main/java/com/nttdata/calender/WebMvcConfig.java index ab87283..3fce4e6 100644 --- a/backend/src/main/java/com/nttdata/calender/WebMvcConfig.java +++ b/backend/src/main/java/com/nttdata/calender/WebMvcConfig.java @@ -1,27 +1,33 @@ package com.nttdata.calender; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import com.nttdata.calender.api.RequestInterceptor; import com.nttdata.calender.api.rsso.RssoInterceptor; @Configuration public class WebMvcConfig implements WebMvcConfigurer { private final RssoInterceptor sessionInterceptor; + private final RequestInterceptor requestInterceptor; - public WebMvcConfig(RssoInterceptor sessionInterceptor) { + @Autowired + public WebMvcConfig(RssoInterceptor sessionInterceptor, RequestInterceptor requestInterceptor) { this.sessionInterceptor = sessionInterceptor; + this.requestInterceptor = requestInterceptor; } /** - * Adds the session interceptor to the interceptor registry. + * Adds the session interceptor and request interceptor to the interceptor registry. * * @param registry the interceptor registry. */ @Override public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(sessionInterceptor); + registry.addInterceptor(sessionInterceptor).addPathPatterns("/**"); + registry.addInterceptor(requestInterceptor).addPathPatterns("/**"); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/nttdata/calender/api/KalenderRestController.java b/backend/src/main/java/com/nttdata/calender/api/KalenderRestController.java index 7cb2f1d..37bf4d1 100644 --- a/backend/src/main/java/com/nttdata/calender/api/KalenderRestController.java +++ b/backend/src/main/java/com/nttdata/calender/api/KalenderRestController.java @@ -3,6 +3,8 @@ package com.nttdata.calender.api; import java.util.ArrayList; import java.util.List; +import javax.servlet.http.HttpServletRequest; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.checkerframework.common.util.report.qual.ReportCall; @@ -116,19 +118,27 @@ public class KalenderRestController { * @throws ARException * @throws JsonProcessingException if an exception occurs during JSON processing */ + @CrossOrigin("*") @GetMapping("/api/getUser") @ResponseBody - public String getUserId() throws ARException { - + public ResponseEntity getUserId() throws ARException { var query = new Query.QueryBuilder("CTM:People LookUp") .addFieldId("Name", 1000000017) .build(); - var name = this.javaAPI.queryFieldsById("\'4\'==\"" + javaAPI.getUser() + "\"", query.getFieldIds(), - query.getFormName(), null, 0, 0).get(0); + var results = this.javaAPI.queryFieldsById("'4'==\"" + javaAPI.getUser() + "\"", query.getFieldIds(), + query.getFormName(), null, 0, 0); + + if (results.isEmpty()) { + // Handle the case where no results are found + String errorMessage = "No user found with the given criteria."; + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("{\"error\": \"" + errorMessage + "\"}"); + } + + var name = results.get(0); String jsonString = "{\"userId\": \"" + name.get(query.getFieldId("Name")) + "\"}"; - return jsonString; + return ResponseEntity.ok(jsonString); } /** @@ -208,7 +218,7 @@ public class KalenderRestController { @ResponseBody public ArrayList getContracts() throws ARException, NotFoundError { Contract contract = new Contract(); - System.out.println(javaAPI.getUser()); + // System.out.println(javaAPI.getUser()); return contract.get(this.javaAPI); } @@ -270,9 +280,17 @@ public class KalenderRestController { @CrossOrigin("*") @PostMapping("/api/updateChange") @ResponseBody - public ChangeUpdateRequest updateChange(@RequestBody ChangeUpdateRequest request) + public ChangeUpdateRequest updateChange(@RequestBody ChangeUpdateRequest request, HttpServletRequest httpRequest) throws ARException, ValidationError { - change.modifyTimestamp(request); + httpRequest.setAttribute("requestBody", request); + + String formName = (request.getState() == 0) ? "ASF:WI_TAS_Paket" : "CHG:Infrastructure Change"; + httpRequest.setAttribute("formName", formName); + + var response = change.modifyTimestamp(request); + httpRequest.setAttribute("listOfFieldValues", change.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return request; } @@ -289,9 +307,16 @@ public class KalenderRestController { */ @CrossOrigin("*") @PostMapping("/api/updateState") - public ResponseEntity updateState(@RequestBody StateChangeRequest request) throws ARException { + public ResponseEntity updateState(@RequestBody StateChangeRequest request, HttpServletRequest httpRequest) + throws ARException { logRequest("/updateState", request.toString()); - var response = stateChange.createStateChange(request); + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_Interactions"); + + String response = stateChange.createStateChange(request); + httpRequest.setAttribute("listOfFieldValues", stateChange.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return ResponseEntity.ok(response); } @@ -306,8 +331,15 @@ public class KalenderRestController { */ @CrossOrigin("*") @PostMapping("api/updateImplementer") - public ResponseEntity updateImplementer(@RequestBody ImplementerUpdateRequest request) throws ARException { + public ResponseEntity updateImplementer(@RequestBody ImplementerUpdateRequest request, + HttpServletRequest httpRequest) throws ARException { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_Interactions"); + var response = implementer.update(request); + httpRequest.setAttribute("listOfFieldValues", implementer.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return ResponseEntity.ok(response); } @@ -323,8 +355,15 @@ public class KalenderRestController { @CrossOrigin("*") @PostMapping("api/updateApproval") @ResponseBody - public ResponseEntity updateApproval(@RequestBody ApprovalUpdateRequest request) throws ARException { + public ResponseEntity updateApproval(@RequestBody ApprovalUpdateRequest request, + HttpServletRequest httpRequest) throws ARException { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_Interactions"); + var response = approval.update(request); + httpRequest.setAttribute("listOfFieldValues", approval.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return ResponseEntity.ok(response); } @@ -346,20 +385,32 @@ public class KalenderRestController { @CrossOrigin("*") @PostMapping("/api/savePreset") @ResponseBody - public List savePreset(@RequestBody Preset request) + public List savePreset(@RequestBody Preset request, HttpServletRequest httpRequest) throws ARException, ValidationError, NotFoundError { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_FilterDefinitions"); + Presets presets = new Presets(javaAPI); - presets.savePreset(request); + var response = presets.savePreset(request); + httpRequest.setAttribute("listOfFieldValues", presets.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return presets.getAll(); } @CrossOrigin("*") @PostMapping("/api/selectPreset") @ResponseBody - public boolean selectPreset(@RequestBody SelectPresetRequest guid) throws ARException, - NotFoundError { + public boolean selectPreset(@RequestBody SelectPresetRequest guid, HttpServletRequest httpRequest) + throws ARException, NotFoundError { + httpRequest.setAttribute("requestBody", guid); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_UserPreferences"); + Presets presets = new Presets(javaAPI); - return presets.selectPreset(guid); + boolean result = presets.selectPreset(guid); + httpRequest.setAttribute("listOfFieldValues", presets.getListOfFieldValues()); + + return result; } @CrossOrigin("*") @@ -373,36 +424,62 @@ public class KalenderRestController { @CrossOrigin("*") @PostMapping("api/updatePreset") @ResponseBody - public List updatePreset(@RequestBody UpdatePresetRequest request) throws NotFoundError, ARException { + public List updatePreset(@RequestBody UpdatePresetRequest request, HttpServletRequest httpRequest) + throws NotFoundError, ARException { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_FilterDefinitions"); + Presets presets = new Presets(javaAPI); - presets.updatePreset(request); + var response = presets.updatePreset(request); + httpRequest.setAttribute("listOfFieldValues", presets.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return presets.getAll(); } @CrossOrigin("*") @PostMapping("api/deletePreset") @ResponseBody - public Object deletePreset(@RequestBody DeletePresetRequest request) throws ARException, NotFoundError { + public Object deletePreset(@RequestBody DeletePresetRequest request, HttpServletRequest httpRequest) + throws ARException, NotFoundError { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_FilterDefinitions"); + Presets presets = new Presets(javaAPI); - presets.deletePreset(request); + var response = presets.deletePreset(request); + httpRequest.setAttribute("listOfFieldValues", presets.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return presets.getAll(); } @CrossOrigin @PostMapping("api/renamePreset") @ResponseBody - public List renamePreset(@RequestBody RenamePresetRequest request) throws NotFoundError, ARException { + public List renamePreset(@RequestBody RenamePresetRequest request, HttpServletRequest httpRequest) + throws NotFoundError, ARException { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_FilterDefinitions"); + Presets presets = new Presets(javaAPI); - presets.renamePreset(request); + var response = presets.renamePreset(request); + httpRequest.setAttribute("listOfFieldValues", presets.getListOfFieldValues()); + httpRequest.setAttribute("entryId", response); + return presets.getAll(); } @CrossOrigin("*") @PostMapping("api/editUserPreferences") @ResponseBody - public void editUserPreferences(@RequestBody EditUserPreferencesRequest request) throws ARException, NotFoundError { + public void editUserPreferences(@RequestBody EditUserPreferencesRequest request, HttpServletRequest httpRequest) + throws ARException, NotFoundError { + httpRequest.setAttribute("requestBody", request); + httpRequest.setAttribute("formName", "ASF:CHG_CAL_UserPreferences"); + Presets presets = new Presets(javaAPI); - presets.editUserPreferences(request); + var response = presets.editUserPreferences(request); + httpRequest.setAttribute("entryId", response); } @CrossOrigin("*") diff --git a/backend/src/main/java/com/nttdata/calender/api/RemedyJavaAPI.java b/backend/src/main/java/com/nttdata/calender/api/RemedyJavaAPI.java index 7b532eb..cebe13d 100644 --- a/backend/src/main/java/com/nttdata/calender/api/RemedyJavaAPI.java +++ b/backend/src/main/java/com/nttdata/calender/api/RemedyJavaAPI.java @@ -134,7 +134,8 @@ public class RemedyJavaAPI { return lastStatus.toString(); } - return "Entry created successfully. ID: " + entryIdOut; + // return "Entry created successfully. ID: " + entryIdOut; + return entryIdOut; } public String deleteEntry(String formName, String entryId) throws ARException { @@ -163,7 +164,7 @@ public class RemedyJavaAPI { * @param updates the updates * @throws ARException when an ARException occurs */ - public void modifyEntry(String entryId, Query updates) throws ARException { + public String modifyEntry(String entryId, Query updates) throws ARException { var values = updates.getFieldValues(); var entry = server.getEntry(updates.getFormName(), entryId, updates.getFieldIds()); @@ -171,6 +172,7 @@ public class RemedyJavaAPI { entry.put(value.getFieldId(), value.getValue()); }); server.setEntry(updates.getFormName(), entryId, entry, null, 0); + return entryId; } /** diff --git a/backend/src/main/java/com/nttdata/calender/api/RequestInterceptor.java b/backend/src/main/java/com/nttdata/calender/api/RequestInterceptor.java new file mode 100644 index 0000000..6dd62e2 --- /dev/null +++ b/backend/src/main/java/com/nttdata/calender/api/RequestInterceptor.java @@ -0,0 +1,147 @@ +package com.nttdata.calender.api; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import com.nttdata.calender.approval.ApprovalUpdateRequest; +import com.nttdata.calender.changes.ChangeUpdateRequest; +import com.nttdata.calender.implementer.ImplementerUpdateRequest; +import com.nttdata.calender.presets.DeletePresetRequest; +import com.nttdata.calender.presets.EditUserPreferencesRequest; +import com.nttdata.calender.presets.Preset; +import com.nttdata.calender.presets.RenamePresetRequest; +import com.nttdata.calender.presets.SelectPresetRequest; +import com.nttdata.calender.presets.UpdatePresetRequest; +import com.nttdata.calender.states.StateChangeRequest; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import com.bmc.arsys.api.Value; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + +@Component +public class RequestInterceptor implements HandlerInterceptor { + private RemedyJavaAPI api; + private static final String FORM_NAME = "ASF:CHG_CAL_Transactions"; + private static final Logger logger = LogManager.getLogger("application"); + private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + api = new RemedyJavaAPI(); + String currentDateTime = LocalDateTime.now().format(dateTimeFormatter); + long transactionId = System.currentTimeMillis(); + String out = String.format("Transaction ID = %d %s - handling request: %s", transactionId, currentDateTime, request.getRequestURI()); + logger.info(out); + return true; + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + if (!"POST".equalsIgnoreCase(request.getMethod()) || !(handler instanceof HandlerMethod)) { + return; + } + + long transactionId = System.currentTimeMillis(); + Object requestBody = request.getAttribute("requestBody"); + String formName = getValidatedField((String) request.getAttribute("formName"), "‎"); + String entryId = getValidatedField((String) request.getAttribute("entryId"), "‎"); + int status = (ex == null) ? 3 : 2; + + List listOfFieldValues = getFieldValues(request); + String fieldValueJson = convertFieldValuesToJson(listOfFieldValues); + + Query entry = null; + + if (requestBody != null) { + if (requestBody instanceof ChangeUpdateRequest) { + ChangeUpdateRequest body = (ChangeUpdateRequest) requestBody; + entry = buildQueryEntry(transactionId, "Date change", formName, body.getChangeNr(), getAssignedTo(), status, body.getResourceId(), fieldValueJson); + } else if (requestBody instanceof StateChangeRequest) { + StateChangeRequest body = (StateChangeRequest) requestBody; + entry = buildQueryEntry(transactionId, "State transition", formName, body.getChangeNr(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof ImplementerUpdateRequest) { + ImplementerUpdateRequest body = (ImplementerUpdateRequest) requestBody; + entry = buildQueryEntry(transactionId, "Implementer Update", formName, body.getPkgId(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof ApprovalUpdateRequest) { + ApprovalUpdateRequest body = (ApprovalUpdateRequest) requestBody; + entry = buildQueryEntry(transactionId, "Approval Update", formName, body.getChangeNr(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof Preset) { + Preset body = (Preset) requestBody; + entry = buildQueryEntry(transactionId, "Save Preset", formName, body.getId(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof SelectPresetRequest) { + SelectPresetRequest body = (SelectPresetRequest) requestBody; + entry = buildQueryEntry(transactionId, "Select Preset", formName, body.getGuid(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof UpdatePresetRequest) { + UpdatePresetRequest body = (UpdatePresetRequest) requestBody; + entry = buildQueryEntry(transactionId, "Update Preset", formName, body.getId(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof DeletePresetRequest) { + DeletePresetRequest body = (DeletePresetRequest) requestBody; + entry = buildQueryEntry(transactionId, "Delete Preset", formName, body.getId(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof RenamePresetRequest) { + RenamePresetRequest body = (RenamePresetRequest) requestBody; + entry = buildQueryEntry(transactionId, "Rename Preset", formName, body.getId(), getAssignedTo(), status, entryId, fieldValueJson); + } else if (requestBody instanceof EditUserPreferencesRequest) { + entry = buildQueryEntry(transactionId, "Edit User Preferences", formName, "", getAssignedTo(), status, entryId, fieldValueJson); + } + + if (entry != null) { + api.createEntry(entry); + } + } + + if (ex != null) { + logger.error("Exception occurred during afterCompletion: ", ex); + } + } + + private List getFieldValues(HttpServletRequest request) { + return (List) request.getAttribute("listOfFieldValues"); + } + + private String convertFieldValuesToJson(List fieldValues) { + if (fieldValues == null || fieldValues.isEmpty()) { + return "{}"; + } + + StringBuilder fieldValueString = new StringBuilder("{\n"); + for (String field : fieldValues) { + fieldValueString.append("\t\"").append(field).append("\",\n"); + } + // Remove the last comma and newline + if (fieldValueString.length() >= 2) { + fieldValueString.setLength(fieldValueString.length() - 2); + } + + fieldValueString.append("\n}"); + return fieldValueString.toString(); + } + + + private Query buildQueryEntry(long transactionId, String actionType, String affectedForm, String changeNr, String assignedTo, int status, String requestId, String fieldValueJson) { + return new Query.QueryBuilder(FORM_NAME) + .addFieldValue("AssignedTo", 4, new Value(getValidatedField(assignedTo, "‎"))) + .addFieldValue("Status", 7, new Value(status)) + .addFieldValue("TransactionID", 666000000, new Value(transactionId)) + .addFieldValue("FieldValue", 666000001, new Value(getValidatedField(fieldValueJson, "‎"))) + .addFieldValue("FormIDs", 666000002, new Value(getValidatedField(requestId, "‎"))) + .addFieldValue("ActionType", 666000003, new Value(getValidatedField(actionType, "‎"))) + .addFieldValue("AffectedForm", 666000004, new Value(getValidatedField(affectedForm, "‎"))) + .addFieldValue("TicketID", 666000005, new Value(getValidatedField(changeNr, "‎"))) + .build(); + } + + private String getAssignedTo() { + return getValidatedField(api.getUser(), "‎"); + } + + private String getValidatedField(String field, String defaultValue) { + return (field == null || field.isEmpty()) ? defaultValue : field; + } +} diff --git a/backend/src/main/java/com/nttdata/calender/approval/Approval.java b/backend/src/main/java/com/nttdata/calender/approval/Approval.java index aba4e23..f843d82 100644 --- a/backend/src/main/java/com/nttdata/calender/approval/Approval.java +++ b/backend/src/main/java/com/nttdata/calender/approval/Approval.java @@ -1,5 +1,8 @@ package com.nttdata.calender.approval; +import java.util.ArrayList; +import java.util.List; + import org.springframework.stereotype.Service; import com.bmc.arsys.api.ARException; @@ -13,6 +16,8 @@ import com.nttdata.calender.api.RemedyJavaAPI; @Service public class Approval { private RemedyJavaAPI remedyJavaAPI; + private ArrayList listOfFieldValues; + /** * Constructor for the Approval class. @@ -21,6 +26,17 @@ public class Approval { */ public Approval(RemedyJavaAPI remedyJavaAPI) { this.remedyJavaAPI = remedyJavaAPI; + this.listOfFieldValues = new ArrayList<>(); + + } + + /** + * Returns the list of field values. + * + * @return listOfFieldValues + */ + public List getListOfFieldValues() { + return new ArrayList<>(listOfFieldValues); // Return a copy to ensure immutability } /** @@ -31,6 +47,9 @@ public class Approval { * @throws ARException If an error occurs during the update */ public String update(ApprovalUpdateRequest request) throws ARException { + // Clear the list before processing a new request + listOfFieldValues.clear(); + remedyJavaAPI.impersonateUser("WuiQualityKV"); String action = "APPROVAL"; @@ -40,46 +59,18 @@ public class Approval { .addFieldValue("ApprovalAction", 1000003264, request.getApprovalActionValue()) .build(); - /* - * String user = remedyJavaAPI.getUser(); - * var queryChanges = new Query.QueryBuilder("ASF:WI_TAS_Paket") - * .addFieldId("ChangeNr", 1000000182) - * .addFieldId("ActualStatus", 7) - * .build(); - * - * - * Entry change = remedyJavaAPI - * .queryFieldsById("\'Infrastructure Change ID\' = \"" + - * request.getChangeNrValue().toString() + "\"", - * queryChanges.getFieldIds(), queryChanges.getFormName(), null, 0, 0) - * .get(0); - * - * - * int approvalAction = - * queryUpdate.getFieldValue("ApprovalAction").getIntValue(); - * var actualStatus = change.get(queryChanges.getFieldId("ActualStatus")); - * - * - * if (approvalAction == 1 || approvalAction == 2) { - * if (inApprovalList(user, request.getChangeNr())) - * return this.remedyJavaAPI.createEntry(queryUpdate); - * else - * return "user (" + user + ") has no authorization for approval."; - * } else if (approvalAction == 3) { - * if (request.getChangeNr().contains("PKG") && actualStatus.getIntValue() == 1) - * return this.remedyJavaAPI.createEntry(queryUpdate); - * else - * return request.getChangeNr().contains("PKG") - * ? "actual status not set to 'request for authorization'." - * : "is not a package (PKG)"; - * } else { - * return "invalid approval status (must be 1, 2 or 3)"; - * } - */ + collectFieldValues(queryUpdate); // Collect field values return this.remedyJavaAPI.createEntry(queryUpdate); } + private void collectFieldValues(Query query) { + for (var entry : query.getFieldValues()) { + listOfFieldValues.add(entry.getFieldId() + "\": \"" + entry.getValue()); + } + } + + /** * Checks if a user is in the approval list for a specific change. * diff --git a/backend/src/main/java/com/nttdata/calender/changes/Change.java b/backend/src/main/java/com/nttdata/calender/changes/Change.java index 1500fc0..d87cd13 100644 --- a/backend/src/main/java/com/nttdata/calender/changes/Change.java +++ b/backend/src/main/java/com/nttdata/calender/changes/Change.java @@ -4,6 +4,7 @@ import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Optional; import java.util.TimeZone; @@ -32,6 +33,7 @@ public class Change { private Query queryChange; private RemedyJavaAPI api; private final static String formName = "ASF:WI_TAS_Paket"; + private ArrayList listOfFieldValues; /** * Constructor for the {@link Change} class which gets autowired with the @@ -72,6 +74,17 @@ public class Change { .addFieldId("CurrentStageNumber", 301541700) .addFieldId("Plantime", 666000001) .build(); + this.listOfFieldValues = new ArrayList<>(); + + } + + /** + * Returns the list of field values. + * + * @return listOfFieldValues + */ + public List getListOfFieldValues() { + return new ArrayList<>(listOfFieldValues); // Return a copy to ensure immutability } /** @@ -87,21 +100,16 @@ public class Change { * @throws ValidationError if there is an invalid filter or qualification */ public ChangeResponse get(ChangeRequest request) throws ARException, NotFoundError, ValidationError { - LoggerTemplates log = new LoggerTemplates(api); var peopleFullName = processPeopleInfo(request); var filter = request.getFilter(); - for (var v : filter.getFilterElement()) { - System.out.println(v.getFilter() + ", " + v.getColumn() +", " + v.getCriteria()); - } var qualifier = filter.constructQualifier(queryChange, api); SortInfo sort = request.constructSortInfo(queryChange); log.initLog("getChanges", api.getUser()); // Logging - System.out.println(qualifier); var entries = api.queryFieldsById(qualifier, this.queryChange.getFieldIds(), this.queryChange.getFormName(), sort, request.getSliceStart(), @@ -127,7 +135,7 @@ public class Change { + "\") AND (\'10000\' = \"" + getValueStringByID(entry, "ApprovalProcessName") + "\") AND (\'13207\' LIKE \"%" + api.getUser() + "%\")"; - + var queryApprovalProcessName = api.queryFieldsById(qual, queryApproval.getFieldIds(), queryApproval.getFormName(), sort, 0, 0); @@ -143,33 +151,33 @@ public class Change { change.setChangeNr(getValueStringByID(entry, "ChangeNr")); change.setSupportGroup(getValueStringByID(entry, "SupportGroup")); change.setStatusReason(getValueStringByID(entry, "StatusReason")); - if(Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue).orElse(-1)== 10 || Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue).orElse(-1)== 9){ - if(Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue).orElse(-1)== 10){ - if(change.getStatusReason().equals("9000")){ + if (Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue).orElse(-1) == 10 + || Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue) + .orElse(-1) == 9) { + if (Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue) + .orElse(-1) == 10) { + if (change.getStatusReason().equals("9000")) { change.setState(10); - }else{ + } else { change.setState(101); } } - if(Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue).orElse(-1)== 9){ - System.out.println("\n++++++++"+getValueStringByID(entry, "CurrentStageNumber")); - if(getValueStringByID(entry, "CurrentStageNumber").equals("1")){ + if (Optional.ofNullable(getValue(entry, "State")).map(Value::getIntValue) + .orElse(-1) == 9) { + if (getValueStringByID(entry, "CurrentStageNumber").equals("1")) { change.setState(9); - }else{ + } else { change.setState(91); } } - }else{ + } else { change.setState(Optional.ofNullable(getValue(entry, "State")) - .map(Value::getIntValue) - .orElse(-1)); + .map(Value::getIntValue) + .orElse(-1)); } - - System.out.println("\nStatus: "+change.getState()); change.setPackageInstanceId(getValueStringByID(entry, "PackageInstanceId")); - change.setResourceName(getValueStringByID(entry, "ResourceName")); change.setD1(timestampToDateById(entry, "D1")); change.setD2(timestampToDateById(entry, "D2")); @@ -198,8 +206,6 @@ public class Change { change.setPlanTime(convertPlanTime(ptHours, ptMinutes)); changes.add(change); } - - System.out.println(entries.size()); api.freeImpersonatedUser(); return new ChangeResponse(entriesSize, changes); @@ -214,7 +220,7 @@ public class Change { * @return the full name of the impersonated user * @throws ARException if an AR exception occurs * @throws NotFoundError if no user or support groups are found with the - * provided login ID + * provi1ded login ID */ private String processPeopleInfo(ChangeRequest request) throws ARException, NotFoundError { // Queries for SupportGroup of impersonated User @@ -222,6 +228,8 @@ public class Change { .addFieldId("FullName", 1000000017) .addFieldId("SupportGroupId", 1000000079) .build(); + + System.out.println(api.getUser()); var peopleInfos = api.queryFieldsById("\'Login ID\' = \"" + api.getUser() + "\"", queryPerson.getFieldIds(), queryPerson.getFormName(), null, 0, 0); @@ -255,7 +263,6 @@ public class Change { return totalHours; } - /** * Returns the {@link Value} of an entry based on the provided description. * @@ -310,28 +317,38 @@ public class Change { * @throws ARException if an error occurs during the modification process * @throws ValidationError */ - public void modifyTimestamp(ChangeUpdateRequest request) throws ARException, ValidationError { + public String modifyTimestamp(ChangeUpdateRequest request) throws ARException, ValidationError { + // Clear the list before processing a new request + listOfFieldValues.clear(); + String entryId = request.getResourceId(); String d2 = request.getD2(); var dateConverter = new DateConverter(); int state = request.getState(); String changeNr = request.getChangeNr(); - + var ts = dateConverter.convertTimestamp(d2); if (state == 0) { - Query query = new Query.QueryBuilder("ASF:WI_TAS_Paket") - .addFieldValue("d2", 1000000350, new Value(ts)).build(); - api.modifyEntry(entryId, query); + Query query = new Query.QueryBuilder("ASF:WI_TAS_Paket") + .addFieldValue("d2", 1000000350, new Value(ts)).build(); + collectFieldValues(query); // Collect field values + return api.modifyEntry(entryId, query); } else { - Query queryInfrastructureChange = new Query.QueryBuilder("CHG:Infrastructure Change") - .addFieldValue("d2", 1000000350, new Value(ts)).build(); - - var change = api.queryFieldsById("\'Infrastructure Change ID\' = \"" + changeNr + "\"", - queryInfrastructureChange.getFieldIds(), - queryInfrastructureChange.getFormName(), null, 0, 0); - - api.modifyEntry(change.get(0).getEntryId(), queryInfrastructureChange); + Query queryInfrastructureChange = new Query.QueryBuilder("CHG:Infrastructure Change") + .addFieldValue("d2", 1000000350, new Value(ts)).build(); + collectFieldValues(queryInfrastructureChange); // Collect field values + + var change = api.queryFieldsById("\'Infrastructure Change ID\' = \"" + changeNr + "\"", + queryInfrastructureChange.getFieldIds(), + queryInfrastructureChange.getFormName(), null, 0, 0); + + return api.modifyEntry(change.get(0).getEntryId(), queryInfrastructureChange); } - - } + } + + private void collectFieldValues(Query query) { + for (var entry : query.getFieldValues()) { + listOfFieldValues.add(entry.getFieldId() + "\": \"" + entry.getValue()); + } + } } \ No newline at end of file diff --git a/backend/src/main/java/com/nttdata/calender/changes/query/Filter.java b/backend/src/main/java/com/nttdata/calender/changes/query/Filter.java index 82a82db..dc71a94 100644 --- a/backend/src/main/java/com/nttdata/calender/changes/query/Filter.java +++ b/backend/src/main/java/com/nttdata/calender/changes/query/Filter.java @@ -103,8 +103,6 @@ public class Filter { var column = current_filter.getColumn(); var criterias = current_filter.getCriteria(); - System.out.println(current_filter + " | "); - if (column.isEmpty() || criterias.length <= 0) { throw new ValidationError("Fields inside filter empty"); } diff --git a/backend/src/main/java/com/nttdata/calender/contracts/Contract.java b/backend/src/main/java/com/nttdata/calender/contracts/Contract.java index cf14993..d7eadce 100644 --- a/backend/src/main/java/com/nttdata/calender/contracts/Contract.java +++ b/backend/src/main/java/com/nttdata/calender/contracts/Contract.java @@ -24,7 +24,6 @@ public class Contract { this.contracts = new ArrayList(); } - /** * Queries the Remedy AR Server using the provided `api` object to retrieve * Contract IDs @@ -33,22 +32,20 @@ public class Contract { * ones in the `contracts` list. * * @param api the RemedyJavaAPI object used to connect to the Remedy AR Server - * @return + * @return * @throws ARException if an error occurs during the querying process * @throws NotFoundError if no contracts are found in the given context */ public ArrayList queryContracts(RemedyJavaAPI api) throws ARException, NotFoundError { ArrayList allContracts = new ArrayList(); - var queryContracts = new Query.QueryBuilder(formName_contracts) .addFieldId("Id", 179) .addFieldId("Name", 700008020).build(); - System.out.println("\n### USER: "+api.getUser()); - allContracts = api - .queryFieldsById("\'4\' = \""+api.getUser()+"\"", queryContracts.getFieldIds(), formName_contracts, null, + .queryFieldsById("\'4\' = \"" + api.getUser() + "\"", queryContracts.getFieldIds(), formName_contracts, + null, 0, 0) .stream() .map(entry -> new ContractGetResponse( @@ -57,22 +54,16 @@ public class Contract { .distinct() .collect(Collectors.toCollection(ArrayList::new)); - for (ContractGetResponse contractGetResponse : allContracts) { - System.out.println(contractGetResponse.name); - } - - - if (allContracts.isEmpty()) { - System.out.println("No contracts found in this context"); + System.out.println("No contracts found in this context"); } return allContracts; } /** * @return the list of contracts - * @throws ARException - * @throws NotFoundError + * @throws ARException + * @throws NotFoundError */ public ArrayList get(RemedyJavaAPI api) throws NotFoundError, ARException { return this.queryContracts(api); diff --git a/backend/src/main/java/com/nttdata/calender/implementer/Implementer.java b/backend/src/main/java/com/nttdata/calender/implementer/Implementer.java index d662657..93a4ef8 100644 --- a/backend/src/main/java/com/nttdata/calender/implementer/Implementer.java +++ b/backend/src/main/java/com/nttdata/calender/implementer/Implementer.java @@ -1,5 +1,8 @@ package com.nttdata.calender.implementer; +import java.util.ArrayList; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,6 +21,7 @@ import com.nttdata.calender.api.RemedyJavaAPI; public class Implementer { private RemedyJavaAPI remedyJavaAPI; private static final String formName = "ASF:WI_TAS_Paket"; + private ArrayList listOfFieldValues; /** * Initialization of the Implementer class with autowiring of RemedyJavaAPI. @@ -27,6 +31,16 @@ public class Implementer { @Autowired public Implementer(RemedyJavaAPI remedyJavaAPI) { this.remedyJavaAPI = remedyJavaAPI; + this.listOfFieldValues = new ArrayList<>(); + } + + /** + * Returns the list of field values. + * + * @return listOfFieldValues + */ + public List getListOfFieldValues() { + return new ArrayList<>(listOfFieldValues); // Return a copy to ensure immutability } /** @@ -37,15 +51,27 @@ public class Implementer { * @throws ARException if an ARException occurs */ public String update(ImplementerUpdateRequest request) throws ARException { + // Clear the list before processing a new request + listOfFieldValues.clear(); + var action = "SETCHGIMPLEMENTER"; var queryUpdate = new Query.QueryBuilder("ASF:CHG_CAL_Interactions") .addFieldValue("ChangeNr", 666000002, request.getPkgIdValue()) .addFieldValue("Action", 666000001, new Value(action)) .addFieldValue("LoginId", 666000005, request.getLoginIdValue()) .build(); + + collectFieldValues(queryUpdate); // Collect field values + return this.remedyJavaAPI.createEntry(queryUpdate); } + private void collectFieldValues(Query query) { + for (var entry : query.getFieldValues()) { + listOfFieldValues.add(entry.getFieldId() + "\": \"" + entry.getValue()); + } + } + /** * Retrieves all the implementers that are part of the support group of a * specific change. diff --git a/backend/src/main/java/com/nttdata/calender/presets/Presets.java b/backend/src/main/java/com/nttdata/calender/presets/Presets.java index e8a1bad..8dac690 100644 --- a/backend/src/main/java/com/nttdata/calender/presets/Presets.java +++ b/backend/src/main/java/com/nttdata/calender/presets/Presets.java @@ -21,6 +21,7 @@ public class Presets { private Query prefQuery; private RemedyJavaAPI api; private List presets; + private ArrayList listOfFieldValues; @Autowired public Presets(RemedyJavaAPI api) throws ARException, NotFoundError { @@ -55,9 +56,20 @@ public class Presets { .build(); this.presets = new ArrayList<>(); + this.listOfFieldValues = new ArrayList<>(); + api.impersonateUser("WuiQualityKV"); } + /** + * Returns the list of field values. + * + * @return listOfFieldValues + */ + public List getListOfFieldValues() { + return new ArrayList<>(listOfFieldValues); // Return a copy to ensure immutability + } + public Object initPresets() throws ARException, NotFoundError { PresetsGetResponse response = new PresetsGetResponse(); @@ -76,7 +88,6 @@ public class Presets { var guid = preference.get(0).get(prefQuery.getFieldId("GUID")); if (guid.toString() == null) { // IF GUID IS NULL PUT SYSTEM DEFAULT INSIDE - System.out.println("GEHT REIN"); var queryPreferenceNewValue = new Query.QueryBuilder(formUserPref) .addFieldValue("GUID", 364000001, new Value(sysdefGUID)).build(); var pref = api.queryFieldsById("\'2\'==\"" + api.getUser() + "\"", @@ -92,7 +103,7 @@ public class Presets { formUserPref, null, 0, 0); // INIT ALL PRESETS - + getAll(); response.setPresets(this.presets); response.setSelectedPreset(preference.get(0).get(prefQuery.getFieldId("GUID")).toString()); @@ -115,19 +126,24 @@ public class Presets { api.createEntry(savePreference); } - public void savePreset(Preset request) throws ARException, NotFoundError { + public String savePreset(Preset request) throws ARException, NotFoundError { + listOfFieldValues.clear(); var saveQuery = new Query.QueryBuilder(formDefault) .addFieldValue("FilterPresetName", 364000001, new Value(request.getName())) .addFieldValue("FilterPresetDefinition", 364000002, new Value(request.getDefinition())) .build(); - api.createEntry(saveQuery); + collectFieldValues(saveQuery); // Collect field values + return api.createEntry(saveQuery); } public boolean selectPreset(SelectPresetRequest guid) throws ARException { + listOfFieldValues.clear(); var queryP = new Query.QueryBuilder(formUserPref) .addFieldValue("GUID", 364000001, new Value(guid.getGuid())).build(); + collectFieldValues(queryP); // Collect field values + var pref = api.queryFieldsById("\'2\'==\"" + api.getUser() + "\"", queryP.getFieldIds(), formUserPref, null, 0, 0); @@ -139,41 +155,51 @@ public class Presets { return true; } - public void updatePreset(UpdatePresetRequest request) throws ARException { + public String updatePreset(UpdatePresetRequest request) throws ARException { + listOfFieldValues.clear(); var queryPresets = new Query.QueryBuilder(formDefault) .addFieldValue("Definition", 364000002, new Value(request.getDefinition())).build(); + + collectFieldValues(queryPresets); // Collect field values + var preset = api.queryFieldsById("\'179\'==\"" + request.getId() + "\"", queryPresets.getFieldIds(), formDefault, null, 0, 0).get(0); - api.modifyEntry(preset.getEntryId(), queryPresets); + return api.modifyEntry(preset.getEntryId(), queryPresets); } - public void renamePreset(RenamePresetRequest request) throws ARException { + public String renamePreset(RenamePresetRequest request) throws ARException { + listOfFieldValues.clear(); var queryPresets = new Query.QueryBuilder(formDefault) .addFieldValue("Name", 364000001, new Value(request.getNewName())).build(); var preset = api.queryFieldsById("\'179\'==\"" + request.getId() + "\"", queryPresets.getFieldIds(), formDefault, null, 0, 0).get(0); - api.modifyEntry(preset.getEntryId(), queryPresets); + collectFieldValues(queryPresets); + return api.modifyEntry(preset.getEntryId(), queryPresets); } - public void editUserPreferences(EditUserPreferencesRequest request) throws ARException { + public String editUserPreferences(EditUserPreferencesRequest request) throws ARException { + listOfFieldValues.clear(); var queryUserPreferences = new Query.QueryBuilder(formUserPref) .addFieldValue("Details", 364000002, new Value(request.getDetails())) .addFieldValue("View", 364000003, new Value(request.getView())) .addFieldValue("Language", 364000004, new Value(request.getLanguage())) .build(); + collectFieldValues(queryUserPreferences); + var preferences = api .queryFieldsById("\'2\'==\"" + api.getUser() + "\"", queryUserPreferences.getFieldIds(), formUserPref, null, 0, 0) .get(0); - api.modifyEntry(preferences.getEntryId(), queryUserPreferences); + return api.modifyEntry(preferences.getEntryId(), queryUserPreferences); } public void allPresets() throws ARException, NotFoundError { - var entries = api.queryFieldsById("\'2\'==\"" + api.getUser() + "\" OR \'364000004\'!=NULL OR \'364000003\'!=NULL", + var entries = api.queryFieldsById( + "\'2\'==\"" + api.getUser() + "\" OR \'364000004\'!=NULL OR \'364000003\'!=NULL", defQuery.getFieldIds(), formDefault, null, 0, @@ -192,10 +218,10 @@ public class Presets { } } - public void deletePreset(DeletePresetRequest request) throws ARException { + public String deletePreset(DeletePresetRequest request) throws ARException { var entries = api.queryFieldsById("\'179\'==\"" + request.getId() + "\"", null, formDefault, null, 0, 0) .get(0); - api.deleteEntry(formDefault, entries.getEntryId()); + var entryid = api.deleteEntry(formDefault, entries.getEntryId()); // SYSTEMDEFAULT var sysdef = api.queryFieldsById("\'364000001\'==\"Systemdefault\"", defQuery.getFieldIds(), @@ -206,6 +232,14 @@ public class Presets { SelectPresetRequest spr = new SelectPresetRequest(); spr.setGuid(sysdefGUID); selectPreset(spr); + + return entryid; + } + + private void collectFieldValues(Query query) { + for (var entry : query.getFieldValues()) { + listOfFieldValues.add(entry.getFieldId() + "\": \"" + entry.getValue()); + } } public List getAll() throws NotFoundError, ARException { diff --git a/backend/src/main/java/com/nttdata/calender/states/State.java b/backend/src/main/java/com/nttdata/calender/states/State.java index 5540a91..c959576 100644 --- a/backend/src/main/java/com/nttdata/calender/states/State.java +++ b/backend/src/main/java/com/nttdata/calender/states/State.java @@ -114,7 +114,7 @@ public class State { populateStateInfo(stateFields, stateStatusFields, configurationQuery, configurationStatusQuery); // Print state information - printStateInfo(); + // printStateInfo(); } private void populateStateInfo(List stateFields, List stateStatusFields, @@ -135,7 +135,7 @@ public class State { implementerFlag = stateField.get(configurationQuery.getFieldId("implementerFlag")).toString() .equals("SETIMPLEMENTER_YES"); } catch (Exception e) { - e.printStackTrace(); + // e.printStackTrace(); } String engName = stateField.get(configurationQuery.getFieldId("engName")).toString(); diff --git a/backend/src/main/java/com/nttdata/calender/states/StateChange.java b/backend/src/main/java/com/nttdata/calender/states/StateChange.java index 31a0634..cb6261f 100644 --- a/backend/src/main/java/com/nttdata/calender/states/StateChange.java +++ b/backend/src/main/java/com/nttdata/calender/states/StateChange.java @@ -1,5 +1,8 @@ package com.nttdata.calender.states; +import java.util.ArrayList; +import java.util.List; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,6 +20,7 @@ import com.nttdata.calender.api.RemedyJavaAPI; public class StateChange { static final String formName = "ASF:CHG_CAL_Interactions"; private RemedyJavaAPI remedyJavaAPI; + ArrayList listOfFieldValues; /** * Initializes the StateChange class with a RemedyJavaAPI instance. @@ -26,6 +30,7 @@ public class StateChange { @Autowired public StateChange(RemedyJavaAPI remedyJavaAPI) { this.remedyJavaAPI = remedyJavaAPI; + listOfFieldValues = new ArrayList<>(); } /** @@ -39,6 +44,7 @@ public class StateChange { * @throws ARException when there's an error creating the entry */ public String createStateChange(StateChangeRequest request) throws ARException { + listOfFieldValues.clear(); String ACTION = "STATUSCHANGE"; @@ -46,12 +52,22 @@ public class StateChange { ACTION = "RESTART"; var query = new Query.QueryBuilder(formName) + .addFieldValue("Action", 666000001, new Value(ACTION)) .addFieldValue("ChangeNr", 666000002, new Value(request.getChangeNr())) .addFieldValue("CurrentState", 666000003, new Value(request.getCurrentState())) .addFieldValue("NextState", 666000004, new Value(request.getNextState())) - .addFieldValue("Action", 666000001, new Value(ACTION)) .build(); + // Print out the field IDs and values + for (var entry : query.getFieldValues()) { + listOfFieldValues.add(entry.getFieldId() + "\": \"" + entry.getValue()); + } + return remedyJavaAPI.createEntry(query); } + + public List getListOfFieldValues() { + return new ArrayList<>(listOfFieldValues); // Return a copy to ensure immutability + } + }