From 798d2a2584453fab4a910ea4281d0fb0ab9acf34 Mon Sep 17 00:00:00 2001 From: Nikesh kumar Date: Sat, 13 Apr 2024 12:19:25 +0530 Subject: [PATCH] fix(rest): Added a commit message while create a moderation request. Signed-off-by: Nikesh kumar --- .../project/ProjectController.java | 188 +++++++++++------- 1 file changed, 118 insertions(+), 70 deletions(-) diff --git a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java index daedfe462b..ca9d3dcdb0 100644 --- a/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java +++ b/rest/resource-server/src/main/java/org/eclipse/sw360/rest/resourceserver/project/ProjectController.java @@ -156,6 +156,7 @@ import static org.eclipse.sw360.datahandler.common.CommonUtils.wrapThriftOptionalReplacement; import static org.eclipse.sw360.datahandler.common.WrappedException.wrapTException; +import static org.eclipse.sw360.datahandler.permissions.PermissionUtils.makePermission; import static org.eclipse.sw360.rest.resourceserver.Sw360ResourceServer.REPORT_FILENAME_MAPPING; import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo; @@ -183,6 +184,8 @@ public class ProjectController implements RepresentationModelProcessor RESPONSE_BODY_FOR_MODERATION_REQUEST = ImmutableMap.builder() .put("message", "Moderation request is created").build(); + private static final ImmutableMap RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT = ImmutableMap.builder() + .put("message", "Unauthorized user or empty commit message passed.").build(); private static final List enumReleaseRelationshipValues = Stream.of(ReleaseRelationship.values()) .map(ReleaseRelationship::name) .collect(Collectors.toList()); @@ -659,7 +662,8 @@ public ResponseEntity linkToProjects( // TODO: Add example for MAP value } ) - @RequestBody List projectIdsInRequestBody + @RequestBody List projectIdsInRequestBody, + @RequestParam(value = "comment", required = false) String comment ) throws URISyntaxException, TException { User sw360User = restControllerHelper.getSw360UserFromAuthentication(); @@ -674,32 +678,39 @@ public ResponseEntity linkToProjects( try { - for(String projId: projectIdsInRequestBody) { - Project proj = projectService.getProjectForUserById(projId, sw360User); - Map linkedProject= proj.getLinkedProjects(); + for (String projId : projectIdsInRequestBody) { + Project proj = projectService.getProjectForUserById(projId, sw360User); + sw360User.setCommentMadeDuringModerationRequest(comment); + if (!isWriteActionAllowedOnProject(proj, sw360User) && comment == null) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT, HttpStatus.ACCEPTED); - if (proj.getLinkedProjects().keySet().contains(id)) { - alreadyLinkedIds.add(projId); - continue; - } + } else { + Map linkedProject = proj.getLinkedProjects(); - linkedProject.put(id, new ProjectProjectRelationship(ProjectRelationship.CONTAINED).setEnableSvm(sourceProj.isEnableSvm())); - proj.setLinkedProjects(linkedProject); - String cyclicLinkedProjectPath = projectService.getCyclicLinkedProjectPath(proj, sw360User); - if (!CommonUtils.isNullEmptyOrWhitespace(cyclicLinkedProjectPath)) { - idsWithCyclicPath.add(cyclicLinkedProjectPath); - continue; - } + if (proj.getLinkedProjects().keySet().contains(id)) { + alreadyLinkedIds.add(projId); + continue; + } - RequestStatus updatedstatus = projectService.updateProject(proj, sw360User); - if (updatedstatus == RequestStatus.SUCCESS) { - linkedProjectIds.add(projId); - } + linkedProject.put(id, new ProjectProjectRelationship(ProjectRelationship.CONTAINED) + .setEnableSvm(sourceProj.isEnableSvm())); + proj.setLinkedProjects(linkedProject); + String cyclicLinkedProjectPath = projectService.getCyclicLinkedProjectPath(proj, sw360User); + if (!CommonUtils.isNullEmptyOrWhitespace(cyclicLinkedProjectPath)) { + idsWithCyclicPath.add(cyclicLinkedProjectPath); + continue; + } - if (updatedstatus == RequestStatus.SENT_TO_MODERATOR) { - idsSentToModerator.add(projId); - } - } + RequestStatus updatedstatus = projectService.updateProject(proj, sw360User); + if (updatedstatus == RequestStatus.SUCCESS) { + linkedProjectIds.add(projId); + } + + if (updatedstatus == RequestStatus.SENT_TO_MODERATOR) { + idsSentToModerator.add(projId); + } + } + } if (!alreadyLinkedIds.isEmpty()) { responseMap.put("Message regarding already linked project(s)", "Project ids are: " + alreadyLinkedIds); @@ -735,6 +746,10 @@ public ResponseEntity linkToProjects( return new ResponseEntity<>(responseResource, status); } + private boolean isWriteActionAllowedOnProject(Project project, User user) { + return makePermission(project, user).isActionAllowed(RequestedAction.WRITE); + } + @PreAuthorize("hasAuthority('WRITE')") @Operation( summary = "Append new releases to existing releases in a project.", @@ -752,14 +767,22 @@ public ResponseEntity patchReleases( // TODO: Add example for MAP value } ) - @RequestBody Object releaseURIs - ) throws URISyntaxException, TException { - RequestStatus patchReleasesStatus = addOrPatchReleasesToProject(id, releaseURIs, true); - if (patchReleasesStatus == RequestStatus.SENT_TO_MODERATOR) { - return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); - } - return new ResponseEntity<>(HttpStatus.CREATED); - } + @RequestBody Object releaseURIs, + @RequestParam(value = "comment", required = false) String comment + ) throws URISyntaxException, TException { + final User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + Project project = projectService.getProjectForUserById(id, sw360User); + sw360User.setCommentMadeDuringModerationRequest(comment); + if (!isWriteActionAllowedOnProject(project, sw360User) && comment == null) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT, HttpStatus.ACCEPTED); + } else { + RequestStatus patchReleasesStatus = addOrPatchReleasesToProject(id, releaseURIs, true); + if (patchReleasesStatus == RequestStatus.SENT_TO_MODERATOR) { + return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); + } + return new ResponseEntity<>(HttpStatus.CREATED); + } + } @PreAuthorize("hasAuthority('WRITE')") @Operation( @@ -778,17 +801,25 @@ public ResponseEntity linkPackages( @Parameter(description = "Set of package IDs to be linked.", example = "[\"3765276512\",\"5578999\",\"3765276513\"]" ) - @RequestBody Set packagesInRequestBody - ) throws URISyntaxException, TException { - if(!packageService.validatePackageIds(packagesInRequestBody)){ - return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); - } - RequestStatus linkPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, true); - if (linkPackageStatus == RequestStatus.SENT_TO_MODERATOR) { - return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); - } - return new ResponseEntity<>(HttpStatus.CREATED); - } + @RequestBody Set packagesInRequestBody, + @RequestParam(value = "comment", required = false) String comment + ) throws URISyntaxException, TException { + if (!packageService.validatePackageIds(packagesInRequestBody)) { + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } + final User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + Project project = projectService.getProjectForUserById(id, sw360User); + sw360User.setCommentMadeDuringModerationRequest(comment); + if (!isWriteActionAllowedOnProject(project, sw360User) && comment == null) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT, HttpStatus.ACCEPTED); + } else { + RequestStatus linkPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, true); + if (linkPackageStatus == RequestStatus.SENT_TO_MODERATOR) { + return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); + } + return new ResponseEntity<>(HttpStatus.CREATED); + } + } @PreAuthorize("hasAuthority('WRITE')") @Operation( @@ -807,17 +838,25 @@ public ResponseEntity patchPackages( @Parameter(description = "Set of package IDs to be linked.", example = "[\"3765276512\",\"5578999\",\"3765276513\"]" ) - @RequestBody Set packagesInRequestBody - ) throws URISyntaxException, TException { - if(!packageService.validatePackageIds(packagesInRequestBody)){ - return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); - } - RequestStatus patchPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, false); - if (patchPackageStatus == RequestStatus.SENT_TO_MODERATOR) { - return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); - } - return new ResponseEntity<>(HttpStatus.CREATED); - } + @RequestBody Set packagesInRequestBody, + @RequestParam(value = "comment", required = false) String comment + ) throws URISyntaxException, TException { + if (!packageService.validatePackageIds(packagesInRequestBody)) { + return new ResponseEntity<>("Package ID invalid! ", HttpStatus.NOT_FOUND); + } + final User sw360User = restControllerHelper.getSw360UserFromAuthentication(); + Project project = projectService.getProjectForUserById(id, sw360User); + sw360User.setCommentMadeDuringModerationRequest(comment); + if (!isWriteActionAllowedOnProject(project, sw360User) && comment == null) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT, HttpStatus.ACCEPTED); + } else { + RequestStatus patchPackageStatus = linkOrUnlinkPackages(id, packagesInRequestBody, false); + if (patchPackageStatus == RequestStatus.SENT_TO_MODERATOR) { + return new ResponseEntity<>(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); + } + return new ResponseEntity<>(HttpStatus.CREATED); + } + } @Operation( description = "Get releases of a single project.", @@ -1409,23 +1448,32 @@ public ResponseEntity> patchProject( @PathVariable("id") String id, @Parameter(description = "Updated values", schema = @Schema(implementation = Project.class)) @RequestBody Map reqBodyMap - ) throws TException { - User user = restControllerHelper.getSw360UserFromAuthentication(); - Project sw360Project = projectService.getProjectForUserById(id, user); - Project updateProject = convertToProject(reqBodyMap); - updateProject.unsetReleaseRelationNetwork(); - sw360Project = this.restControllerHelper.updateProject(sw360Project, updateProject, reqBodyMap, mapOfProjectFieldsToRequestBody); - if (SW360Constants.ENABLE_FLEXIBLE_PROJECT_RELEASE_RELATIONSHIP && updateProject.getReleaseIdToUsage() != null) { - sw360Project.unsetReleaseRelationNetwork(); - projectService.syncReleaseRelationNetworkAndReleaseIdToUsage(sw360Project, user); - } - RequestStatus updateProjectStatus = projectService.updateProject(sw360Project, user); - HalResource userHalResource = createHalProject(sw360Project, user); - if (updateProjectStatus == RequestStatus.SENT_TO_MODERATOR) { - return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); - } - return new ResponseEntity<>(userHalResource, HttpStatus.OK); - } + ) throws TException { + User user = restControllerHelper.getSw360UserFromAuthentication(); + Project sw360Project = projectService.getProjectForUserById(id, user); + Project updateProject = convertToProject(reqBodyMap); + updateProject.unsetReleaseRelationNetwork(); + String comment = (String) reqBodyMap.get("comment"); + user.setCommentMadeDuringModerationRequest(comment); + + if (isWriteActionAllowedOnProject(updateProject, user) && comment == null) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST_WITH_COMMIT, HttpStatus.ACCEPTED); + } else { + sw360Project = this.restControllerHelper.updateProject(sw360Project, updateProject, reqBodyMap, + mapOfProjectFieldsToRequestBody); + if (SW360Constants.ENABLE_FLEXIBLE_PROJECT_RELEASE_RELATIONSHIP + && updateProject.getReleaseIdToUsage() != null) { + sw360Project.unsetReleaseRelationNetwork(); + projectService.syncReleaseRelationNetworkAndReleaseIdToUsage(sw360Project, user); + } + RequestStatus updateProjectStatus = projectService.updateProject(sw360Project, user); + HalResource userHalResource = createHalProject(sw360Project, user); + if (updateProjectStatus == RequestStatus.SENT_TO_MODERATOR) { + return new ResponseEntity(RESPONSE_BODY_FOR_MODERATION_REQUEST, HttpStatus.ACCEPTED); + } + return new ResponseEntity<>(userHalResource, HttpStatus.OK); + } + } @Operation( description = "Add attachments to a project.",