|
17 | 17 | import java.util.Comparator; |
18 | 18 | import java.util.List; |
19 | 19 | import java.util.stream.Collectors; |
| 20 | +import java.util.Map; |
| 21 | +import java.time.format.DateTimeFormatter; |
20 | 22 |
|
21 | 23 | import io.swagger.v3.oas.annotations.media.Content; |
22 | 24 | import io.swagger.v3.oas.annotations.responses.ApiResponse; |
23 | 25 | import io.swagger.v3.oas.annotations.responses.ApiResponses; |
24 | 26 |
|
25 | 27 | import jakarta.servlet.http.HttpServletRequest; |
26 | 28 |
|
| 29 | +import com.fasterxml.jackson.databind.DeserializationFeature; |
| 30 | +import com.fasterxml.jackson.databind.ObjectMapper; |
27 | 31 | import io.swagger.v3.oas.annotations.Operation; |
28 | 32 | import io.swagger.v3.oas.annotations.Parameter; |
29 | 33 | import io.swagger.v3.oas.annotations.media.Schema; |
|
35 | 39 | import org.eclipse.sw360.datahandler.resourcelists.PaginationResult; |
36 | 40 | import org.eclipse.sw360.datahandler.thrift.ClearingRequestState; |
37 | 41 | import org.eclipse.sw360.datahandler.thrift.Comment; |
| 42 | +import org.eclipse.sw360.datahandler.common.CommonUtils; |
| 43 | +import org.eclipse.sw360.datahandler.common.SW360Utils; |
| 44 | +import org.eclipse.sw360.datahandler.permissions.PermissionUtils; |
| 45 | +import org.eclipse.sw360.datahandler.thrift.RequestStatus; |
38 | 46 | import org.eclipse.sw360.datahandler.thrift.projects.ClearingRequest; |
39 | 47 | import org.eclipse.sw360.datahandler.thrift.projects.Project; |
40 | 48 | import org.eclipse.sw360.datahandler.thrift.users.User; |
41 | 49 | import org.eclipse.sw360.rest.resourceserver.core.HalResource; |
42 | 50 | import org.eclipse.sw360.rest.resourceserver.core.RestControllerHelper; |
| 51 | +import org.eclipse.sw360.rest.resourceserver.moderationrequest.Sw360ModerationRequestService; |
43 | 52 | import org.eclipse.sw360.rest.resourceserver.project.Sw360ProjectService; |
44 | 53 | import org.springframework.beans.factory.annotation.Autowired; |
45 | 54 | import org.springframework.data.domain.Pageable; |
@@ -84,6 +93,8 @@ public class ClearingRequestController implements RepresentationModelProcessor<R |
84 | 93 | @NonNull |
85 | 94 | private final com.fasterxml.jackson.databind.Module sw360Module; |
86 | 95 |
|
| 96 | + @NonNull |
| 97 | + private final Sw360ModerationRequestService moderationRequestService; |
87 | 98 |
|
88 | 99 | @Operation( |
89 | 100 | summary = "Get clearing request by id.", |
@@ -297,4 +308,98 @@ public RepositoryLinksResource process(RepositoryLinksResource resource) { |
297 | 308 | resource.add(linkTo(ClearingRequestController.class).slash("api" + CLEARING_REQUEST_URL).withRel("clearingRequests")); |
298 | 309 | return resource; |
299 | 310 | } |
| 311 | + |
| 312 | + @PreAuthorize("hasAuthority('WRITE')") |
| 313 | + @Operation( |
| 314 | + summary = "Update clearing request", |
| 315 | + description = "Update a clearing request by id.", |
| 316 | + tags = {"ClearingRequest"} |
| 317 | + ) |
| 318 | + @RequestMapping(value = CLEARING_REQUEST_URL + "/{id}", method = RequestMethod.PATCH) |
| 319 | + public ResponseEntity<?> patchClearingRequest( |
| 320 | + @Parameter(description = "id of the clearing request") |
| 321 | + @PathVariable("id") String id, |
| 322 | + @Parameter(description = "The updated fields of clearing request.", |
| 323 | + schema = @Schema(implementation = ClearingRequest.class)) |
| 324 | + @RequestBody Map<String, Object> reqBodyMap, |
| 325 | + HttpServletRequest request |
| 326 | + ) throws TException { |
| 327 | + |
| 328 | + try{ |
| 329 | + User sw360User = restControllerHelper.getSw360UserFromAuthentication(); |
| 330 | + |
| 331 | + ClearingRequest clearingRequest = sw360ClearingRequestService.getClearingRequestById(id, sw360User); |
| 332 | + String projectId = clearingRequest.getProjectId(); |
| 333 | + |
| 334 | + ClearingRequest updatedClearingRequest = convertToClearingRequest(reqBodyMap); |
| 335 | + updatedClearingRequest.setId(clearingRequest.getId()); |
| 336 | + updatedClearingRequest.setProjectId(clearingRequest.getProjectId()); |
| 337 | + updatedClearingRequest.setTimestamp(clearingRequest.getTimestamp()); |
| 338 | + updatedClearingRequest.setProjectBU(clearingRequest.getProjectBU()); |
| 339 | + updatedClearingRequest.setComments(clearingRequest.getComments()); |
| 340 | + updatedClearingRequest.setModifiedOn(System.currentTimeMillis()); |
| 341 | + |
| 342 | + if(CommonUtils.isNotNullEmptyOrWhitespace(updatedClearingRequest.getRequestingUser()) && PermissionUtils.isAdmin(sw360User)){ |
| 343 | + User updatedRequestingUser = restControllerHelper.getUserByEmailOrNull(updatedClearingRequest.getRequestingUser()); |
| 344 | + if (updatedRequestingUser == null) { |
| 345 | + return new ResponseEntity<String>("Requesting user is not a valid", HttpStatus.BAD_REQUEST); |
| 346 | + }else{ |
| 347 | + updatedClearingRequest.setRequestingUser(updatedRequestingUser.getEmail()); |
| 348 | + } |
| 349 | + } |
| 350 | + |
| 351 | + if (CommonUtils.isNotNullEmptyOrWhitespace(updatedClearingRequest.getRequestedClearingDate())) { |
| 352 | + if (!clearingRequest.getRequestingUser().equals(sw360User.getEmail())) { |
| 353 | + return new ResponseEntity<String>("Requested Clearing Date can only be updated by the requesting user", HttpStatus.FORBIDDEN); |
| 354 | + } |
| 355 | + if (!SW360Utils.isValidDate(clearingRequest.getRequestedClearingDate(), updatedClearingRequest.getRequestedClearingDate(), DateTimeFormatter.ISO_LOCAL_DATE)) { |
| 356 | + return new ResponseEntity<String>("Invalid clearing date requested", HttpStatus.BAD_REQUEST); |
| 357 | + } |
| 358 | + } |
| 359 | + |
| 360 | + if ((updatedClearingRequest.getClearingType() != null || updatedClearingRequest.getPriority() != null ) && |
| 361 | + !(PermissionUtils.isClearingAdmin(sw360User) || PermissionUtils.isAdmin(sw360User))) { |
| 362 | + return new ResponseEntity<String>("Update not allowed for field ClearingType, Priority with user role", HttpStatus.FORBIDDEN); |
| 363 | + } |
| 364 | + |
| 365 | + if (updatedClearingRequest.getClearingTeam() != null) { |
| 366 | + User updatedClearingTeam = restControllerHelper.getUserByEmailOrNull(updatedClearingRequest.getClearingTeam()); |
| 367 | + if (updatedClearingTeam == null) { |
| 368 | + return new ResponseEntity<String>("ClearingTeam is not a valid user", HttpStatus.BAD_REQUEST); |
| 369 | + } |
| 370 | + } |
| 371 | + |
| 372 | + if (updatedClearingRequest.getAgreedClearingDate() != null) { |
| 373 | + if (PermissionUtils.isClearingAdmin(sw360User) || PermissionUtils.isAdmin(sw360User)) { |
| 374 | + String currentAgreedClearingDate = CommonUtils.isNotNullEmptyOrWhitespace(clearingRequest.getAgreedClearingDate()) ? clearingRequest.getAgreedClearingDate() : "1980-01-01"; |
| 375 | + if (!SW360Utils.isValidDate(currentAgreedClearingDate, updatedClearingRequest.getAgreedClearingDate(), DateTimeFormatter.ISO_LOCAL_DATE)) { |
| 376 | + return new ResponseEntity<String>("Invalid agreed clearing date requested", HttpStatus.BAD_REQUEST); |
| 377 | + } |
| 378 | + } else { |
| 379 | + return new ResponseEntity<String>("Update not allowed for field Agreed Clearing Date with user role", HttpStatus.FORBIDDEN); |
| 380 | + } |
| 381 | + } |
| 382 | + |
| 383 | + clearingRequest = this.restControllerHelper.updateClearingRequest(clearingRequest, updatedClearingRequest); |
| 384 | + |
| 385 | + String baseURL = restControllerHelper.getBaseUrl(request); |
| 386 | + RequestStatus updateCRStatus = sw360ClearingRequestService.updateClearingRequest(clearingRequest, sw360User, baseURL, projectId); |
| 387 | + HalResource<ClearingRequest> halClearingRequest = createHalClearingRequestWithAllDetails(clearingRequest, sw360User, true); |
| 388 | + |
| 389 | + if (updateCRStatus == RequestStatus.ACCESS_DENIED) { |
| 390 | + return new ResponseEntity<String>("Edit action is not allowed for this user role", HttpStatus.FORBIDDEN); |
| 391 | + } |
| 392 | + |
| 393 | + return new ResponseEntity<>(halClearingRequest, HttpStatus.OK); |
| 394 | + }catch (Exception e) { |
| 395 | + return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST); |
| 396 | + } |
| 397 | + } |
| 398 | + |
| 399 | + private ClearingRequest convertToClearingRequest(Map<String, Object> requestBody){ |
| 400 | + ObjectMapper mapper = new ObjectMapper(); |
| 401 | + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); |
| 402 | + mapper.registerModule(sw360Module); |
| 403 | + return mapper.convertValue(requestBody, ClearingRequest.class); |
| 404 | + } |
300 | 405 | } |
0 commit comments