diff --git a/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/ResponseRoleToGroupInMicroservicesDTO.java b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/ResponseRoleToGroupInMicroservicesDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..5f51fdb03444076cf053e168aece715a283e9154 --- /dev/null +++ b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/ResponseRoleToGroupInMicroservicesDTO.java @@ -0,0 +1,70 @@ +package cz.muni.ics.kypo.userandgroup.api.dto; + +import cz.muni.ics.kypo.userandgroup.api.dto.enums.AssignRoleToGroupStatusDTO; +import org.springframework.http.HttpStatus; + +import java.util.Objects; + +public class ResponseRoleToGroupInMicroservicesDTO { + private Long roleId; + private Long microserviceId; + private AssignRoleToGroupStatusDTO status; + private String responseMessage; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getMicroserviceId() { + return microserviceId; + } + + public void setMicroserviceId(Long microserviceId) { + this.microserviceId = microserviceId; + } + + public AssignRoleToGroupStatusDTO getStatus() { + return status; + } + + public void setStatus(AssignRoleToGroupStatusDTO status) { + this.status = status; + } + + public String getResponseMessage() { + return responseMessage; + } + + public void setResponseMessage(String responseMessage) { + this.responseMessage = responseMessage; + } + + @Override + public String toString() { + return "ResponseRoleToGroupInMicroservicesDTO{" + + "roleId=" + roleId + + ", microserviceId=" + microserviceId + + ", status=" + status + + ", responseMessage='" + responseMessage + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ResponseRoleToGroupInMicroservicesDTO that = (ResponseRoleToGroupInMicroservicesDTO) o; + return Objects.equals(roleId, that.roleId) && + Objects.equals(microserviceId, that.microserviceId) && + status == that.status; + } + + @Override + public int hashCode() { + return Objects.hash(roleId, microserviceId, status); + } +} diff --git a/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/RoleAndMicroserviceDTO.java b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/RoleAndMicroserviceDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..412de9dadedd63bf60fdde8f71d68b8fc2e25621 --- /dev/null +++ b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/RoleAndMicroserviceDTO.java @@ -0,0 +1,47 @@ +package cz.muni.ics.kypo.userandgroup.api.dto; + +import java.util.Objects; + +public class RoleAndMicroserviceDTO { + + private Long roleId; + private Long microserviceId; + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Long getMicroserviceId() { + return microserviceId; + } + + public void setMicroserviceId(Long microserviceId) { + this.microserviceId = microserviceId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + RoleAndMicroserviceDTO that = (RoleAndMicroserviceDTO) o; + return Objects.equals(roleId, that.roleId) && + Objects.equals(microserviceId, that.microserviceId); + } + + @Override + public int hashCode() { + return Objects.hash(roleId, microserviceId); + } + + @Override + public String toString() { + return "RolesAndMicroservicesDTO{" + + "roleId=" + roleId + + ", microserviceId=" + microserviceId + + '}'; + } +} diff --git a/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/enums/AssignRoleToGroupStatusDTO.java b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/enums/AssignRoleToGroupStatusDTO.java new file mode 100644 index 0000000000000000000000000000000000000000..e5bf7df9c7d93fca6c03346eb6e96e9ce269d5c0 --- /dev/null +++ b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/dto/enums/AssignRoleToGroupStatusDTO.java @@ -0,0 +1,5 @@ +package cz.muni.ics.kypo.userandgroup.api.dto.enums; + +public enum AssignRoleToGroupStatusDTO { + SUCCESS, NOT_FOUND, MICROSERVICE_ERROR, REST_CLIENT_ERROR, +} diff --git a/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/facade/IDMGroupFacade.java b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/facade/IDMGroupFacade.java index 3632681a44025f07c5242bf80be2cda036805ba9..9fe77ed62f70b8ea5495056b2b5f6a6215b6ddce 100644 --- a/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/facade/IDMGroupFacade.java +++ b/api/src/main/java/cz/muni/ics/kypo/userandgroup/api/facade/IDMGroupFacade.java @@ -1,6 +1,8 @@ package cz.muni.ics.kypo.userandgroup.api.facade; import cz.muni.ics.kypo.userandgroup.api.PageResultResource; +import cz.muni.ics.kypo.userandgroup.api.dto.ResponseRoleToGroupInMicroservicesDTO; +import cz.muni.ics.kypo.userandgroup.api.dto.RoleAndMicroserviceDTO; import cz.muni.ics.kypo.userandgroup.api.dto.group.*; import cz.muni.ics.kypo.userandgroup.api.dto.role.RoleDTO; import cz.muni.ics.kypo.userandgroup.api.exceptions.ExternalSourceException; @@ -129,4 +131,6 @@ public interface IDMGroupFacade { */ void removeRoleToGroupInMicroservice(Long groupId, Long roleId, Long microserviceId) throws UserAndGroupFacadeException, MicroserviceException, RoleCannotBeRemovedToGroupException; + + List<ResponseRoleToGroupInMicroservicesDTO> assignRolesInMicroservices(Long groupId, List<RoleAndMicroserviceDTO> rolesAndMicroservices); } diff --git a/rest/src/main/java/cz/muni/ics/kypo/userandgroup/rest/controllers/GroupsRestController.java b/rest/src/main/java/cz/muni/ics/kypo/userandgroup/rest/controllers/GroupsRestController.java index ba0379ba93abe489c61740330eddf0b0c1e43b50..1da8f3391486c1b655b0fd0919404722526aa80f 100644 --- a/rest/src/main/java/cz/muni/ics/kypo/userandgroup/rest/controllers/GroupsRestController.java +++ b/rest/src/main/java/cz/muni/ics/kypo/userandgroup/rest/controllers/GroupsRestController.java @@ -6,6 +6,8 @@ import com.github.bohnman.squiggly.util.SquigglyUtils; import com.google.common.base.Preconditions; import com.querydsl.core.types.Predicate; import cz.muni.ics.kypo.userandgroup.api.PageResultResource; +import cz.muni.ics.kypo.userandgroup.api.dto.ResponseRoleToGroupInMicroservicesDTO; +import cz.muni.ics.kypo.userandgroup.api.dto.RoleAndMicroserviceDTO; import cz.muni.ics.kypo.userandgroup.api.exceptions.ExternalSourceException; import cz.muni.ics.kypo.userandgroup.api.exceptions.MicroserviceException; import cz.muni.ics.kypo.userandgroup.api.exceptions.RoleCannotBeRemovedToGroupException; @@ -19,6 +21,7 @@ import cz.muni.ics.kypo.userandgroup.rest.utils.ApiPageableSwagger; import io.swagger.annotations.*; +import io.swagger.models.Response; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -242,6 +245,22 @@ public class GroupsRestController { } } + @ApiOperation(httpMethod = "POST", + value = "Assign roles with given roles IDs to group with given ID in chosen microservices" + ) + @PostMapping("/{groupId}/roles-collection") + public ResponseEntity<List<ResponseRoleToGroupInMicroservicesDTO>> assignRolesInMicroservices( + @ApiParam(value = "groupId", required = true) @PathVariable("groupId") Long groupId, + @ApiParam(value = "rolesAndMicroservices", required = true) @RequestBody List<RoleAndMicroserviceDTO> rolesAndMicroservices) { +// try { + return new ResponseEntity<>(groupFacade.assignRolesInMicroservices(groupId, rolesAndMicroservices), HttpStatus.OK); +// } catch (UserAndGroupFacadeException e) { +// throw new ResourceNotFoundException("Group with id: " + groupId + " or microserviceservice with id " + ram.getMicroserviceId() + " could not be found."); +// } catch (MicroserviceException e) { +// throw new ServiceUnavailableException(e.getLocalizedMessage()); +// } + } + @ApiOperation(httpMethod = "DELETE", value = "Cancel role with given role ID to group with given ID in chosen microservice" ) diff --git a/service/src/main/java/cz/muni/ics/kypo/userandgroup/facade/IDMGroupFacadeImpl.java b/service/src/main/java/cz/muni/ics/kypo/userandgroup/facade/IDMGroupFacadeImpl.java index 911bc0e834d31fa311749ca2cfa55cd36710e11b..c35ff2050b4428603ebf9aad7f46895dc8febdc1 100644 --- a/service/src/main/java/cz/muni/ics/kypo/userandgroup/facade/IDMGroupFacadeImpl.java +++ b/service/src/main/java/cz/muni/ics/kypo/userandgroup/facade/IDMGroupFacadeImpl.java @@ -5,6 +5,9 @@ import com.google.gson.JsonParser; import com.querydsl.core.types.Predicate; import cz.muni.ics.kypo.userandgroup.api.PageResultResource; import cz.muni.ics.kypo.userandgroup.api.dto.MicroserviceForGroupDeletionDTO; +import cz.muni.ics.kypo.userandgroup.api.dto.ResponseRoleToGroupInMicroservicesDTO; +import cz.muni.ics.kypo.userandgroup.api.dto.RoleAndMicroserviceDTO; +import cz.muni.ics.kypo.userandgroup.api.dto.enums.AssignRoleToGroupStatusDTO; import cz.muni.ics.kypo.userandgroup.api.dto.enums.GroupDeletionStatusDTO; import cz.muni.ics.kypo.userandgroup.api.dto.group.*; import cz.muni.ics.kypo.userandgroup.api.dto.role.RoleDTO; @@ -301,6 +304,52 @@ public class IDMGroupFacadeImpl implements IDMGroupFacade { throw new UserAndGroupFacadeException(e); } } + @Override + public List<ResponseRoleToGroupInMicroservicesDTO> assignRolesInMicroservices(Long groupId, List<RoleAndMicroserviceDTO> rolesAndMicroservices) { + Assert.notNull(groupId, "Input groupId must not be null"); + Assert.notNull(rolesAndMicroservices, "Input roles and microservices must not be null"); + List<ResponseRoleToGroupInMicroservicesDTO> responses = new ArrayList<>(); + for (RoleAndMicroserviceDTO ram : rolesAndMicroservices) { + ResponseRoleToGroupInMicroservicesDTO resp = new ResponseRoleToGroupInMicroservicesDTO(); + resp.setRoleId(ram.getRoleId()); + resp.setMicroserviceId(ram.getMicroserviceId()); + try { + Microservice microservice = microserviceService.get(ram.getMicroserviceId()); + groupService.get(groupId); + if (microservice.getName().equals(NAME_OF_USER_AND_GROUP_SERVICE)) { + groupService.assignRole(groupId, roleService.getById(ram.getRoleId()).getRoleType()); + resp.setStatus(AssignRoleToGroupStatusDTO.SUCCESS); + } else { + final String url = microservice.getEndpoint() + "/groups/{groupId}/roles/{roleId}"; + OAuth2AuthenticationDetails auth = (OAuth2AuthenticationDetails) SecurityContextHolder.getContext().getAuthentication().getDetails(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Authorization", auth.getTokenType() + " " + auth.getTokenValue()); + HttpEntity<String> entity = new HttpEntity<>(null, headers); + try { + ResponseEntity<Void> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, Void.class, groupId, ram.getRoleId()); + if (!responseEntity.getStatusCode().is2xxSuccessful()) { + resp.setStatus(AssignRoleToGroupStatusDTO.MICROSERVICE_ERROR); + resp.setResponseMessage("Status code: " + responseEntity.getStatusCode().toString() + " Body: " + responseEntity.getBody()); + } + resp.setStatus(AssignRoleToGroupStatusDTO.SUCCESS); + } catch (HttpClientErrorException e) { + resp.setStatus(AssignRoleToGroupStatusDTO.MICROSERVICE_ERROR); + resp.setResponseMessage("Cannot assign role to group in given microservice. It is return status code: " + e.getStatusCode() + "."); + } catch (RestClientException e) { + resp.setStatus(AssignRoleToGroupStatusDTO.REST_CLIENT_ERROR); + resp.setResponseMessage(e.getCause().getMessage()); + } + } + } catch (UserAndGroupServiceException e) { + resp.setStatus(AssignRoleToGroupStatusDTO.NOT_FOUND); + resp.setResponseMessage(e.getMessage()); + } + responses.add(resp); + + } + return responses; + } + @Override public boolean isGroupInternal(Long id) throws UserAndGroupFacadeException {