From d7cd6fbe66f5b755dce61ee559cf1ba2990bfc3c Mon Sep 17 00:00:00 2001 From: chasegawa Date: Tue, 6 Dec 2022 11:04:12 -0700 Subject: [PATCH] SHIBUI-2393/2493 fixed issue when changing dynamic registration group --- .../ui/security/controller/GroupController.java | 5 +++++ .../DynamicRegistrationInfoRepository.java | 3 +++ .../ui/service/DynamicRegistrationService.java | 3 +++ .../JPADynamicRegistrationServiceImpl.java | 15 +++++++++++++++ 4 files changed, 26 insertions(+) diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/controller/GroupController.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/controller/GroupController.java index 6352e01ca..2b4b2e9c8 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/controller/GroupController.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/controller/GroupController.java @@ -6,6 +6,7 @@ import edu.internet2.tier.shibboleth.admin.ui.security.exception.InvalidGroupRegexException; import edu.internet2.tier.shibboleth.admin.ui.security.model.Group; import edu.internet2.tier.shibboleth.admin.ui.security.service.IGroupService; +import edu.internet2.tier.shibboleth.admin.ui.service.DynamicRegistrationService; import edu.internet2.tier.shibboleth.admin.ui.service.EntityDescriptorService; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tags; @@ -33,6 +34,9 @@ public class GroupController { @Autowired private EntityDescriptorService entityDescriptorService; + @Autowired + private DynamicRegistrationService dynamicRegistrationService; + @Secured("ROLE_ADMIN") @PostMapping @Transactional @@ -71,6 +75,7 @@ public ResponseEntity getOne(@PathVariable String resourceId) throws Persiste public ResponseEntity update(@RequestBody Group group) throws PersistentEntityNotFound, InvalidGroupRegexException { Group result = groupService.updateGroup(group); entityDescriptorService.checkApprovalStatusOfEntitiesForGroup(result); + dynamicRegistrationService.checkApprovalStatusOfEntitiesForGroup(result); return ResponseEntity.ok(result); } } \ No newline at end of file diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/repository/DynamicRegistrationInfoRepository.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/repository/DynamicRegistrationInfoRepository.java index 21f95be6c..8caa871d1 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/repository/DynamicRegistrationInfoRepository.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/security/repository/DynamicRegistrationInfoRepository.java @@ -11,6 +11,9 @@ public interface DynamicRegistrationInfoRepository extends JpaRepository { List findAllByIdOfOwner(String idOfOwner); + @Query(value="SELECT dri.resourceId FROM DynamicRegistrationInfo dri WHERE dri.idOfOwner = :groupId AND dri.enabled = false") + List findAllResourceIdsByIdOfOwnerAndNotEnabled(@Param("groupId") String groupId); + DynamicRegistrationInfo findByResourceId(String id); @Query(value = "SELECT dri FROM DynamicRegistrationInfo dri " + diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DynamicRegistrationService.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DynamicRegistrationService.java index 5fca6eda5..e9df64a85 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DynamicRegistrationService.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/DynamicRegistrationService.java @@ -6,6 +6,7 @@ import edu.internet2.tier.shibboleth.admin.ui.exception.ObjectIdExistsException; import edu.internet2.tier.shibboleth.admin.ui.exception.PersistentEntityNotFound; import edu.internet2.tier.shibboleth.admin.ui.exception.UnsupportedShibUiOperationException; +import edu.internet2.tier.shibboleth.admin.ui.security.model.Group; import org.springframework.http.HttpStatus; import java.util.List; @@ -14,6 +15,8 @@ public interface DynamicRegistrationService { DynamicRegistrationRepresentation approveDynamicRegistration(String resourceId, boolean status) throws PersistentEntityNotFound, ForbiddenException; + void checkApprovalStatusOfEntitiesForGroup(Group result); + DynamicRegistrationRepresentation createNew(DynamicRegistrationRepresentation dynRegRepresentation) throws ObjectIdExistsException, MissingRequiredFieldsException; diff --git a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPADynamicRegistrationServiceImpl.java b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPADynamicRegistrationServiceImpl.java index 7f47d8086..d0b7d2e47 100644 --- a/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPADynamicRegistrationServiceImpl.java +++ b/backend/src/main/java/edu/internet2/tier/shibboleth/admin/ui/service/JPADynamicRegistrationServiceImpl.java @@ -1,5 +1,6 @@ package edu.internet2.tier.shibboleth.admin.ui.service; +import edu.internet2.tier.shibboleth.admin.ui.domain.EntityDescriptor; import edu.internet2.tier.shibboleth.admin.ui.domain.frontend.DynamicRegistrationRepresentation; import edu.internet2.tier.shibboleth.admin.ui.domain.oidc.DynamicRegistrationInfo; import edu.internet2.tier.shibboleth.admin.ui.exception.ForbiddenException; @@ -237,4 +238,18 @@ public DynamicRegistrationRepresentation updateGroupForDynamicRegistration(Strin DynamicRegistrationInfo savedEntity = repository.save(existingDri); return new DynamicRegistrationRepresentation(savedEntity); } + + /** + * Update the approval status of entities that were in some approval state but the group approvers were added/removed. + */ + @Override + public void checkApprovalStatusOfEntitiesForGroup(Group group) { + repository.findAllResourceIdsByIdOfOwnerAndNotEnabled(group.getResourceId()).forEach(id -> { + DynamicRegistrationInfo dri = repository.findByResourceId(id); + int approvedCount = dri.approvedCount(); // total number of approvals so far + List theApprovers = groupService.find(dri.getIdOfOwner()).getApproversList(); + dri.setApproved(approvedCount >= theApprovers.size()); + dri = repository.save(dri); + }); + } } \ No newline at end of file