diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/api/API.java b/src/main/java/ch/ethz/seb/sebserver/gbl/api/API.java index a7fb9565..5921303c 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/api/API.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/api/API.java @@ -48,6 +48,8 @@ public final class API { public static final String INACTIVE_PATH_SEGMENT = "/inactive"; + public static final String DEPENDENCY_PATH_SEGMENT = "/dependency"; + public static final String PATH_VAR_ACTIVE = MODEL_ID_VAR_PATH_SEGMENT + ACTIVE_PATH_SEGMENT; public static final String PATH_VAR_INACTIVE = MODEL_ID_VAR_PATH_SEGMENT + INACTIVE_PATH_SEGMENT; diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/bulkaction/BulkAction.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/bulkaction/BulkAction.java index 57d4420f..97e758ff 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/bulkaction/BulkAction.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/bulkaction/BulkAction.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.Set; import java.util.stream.Collectors; @@ -52,7 +53,7 @@ public final class BulkAction { this.type = type; this.sourceType = sourceType; this.sources = Utils.immutableSetOf(sources); - this.dependencies = new HashSet<>(); + this.dependencies = new LinkedHashSet<>(); this.result = new HashSet<>(); check(); @@ -66,14 +67,8 @@ public final class BulkAction { this(type, sourceType, (sources != null) ? Arrays.asList(sources) : Collections.emptyList()); } - private void check() { - for (final EntityKey source : this.sources) { - if (source.entityType != this.sourceType) { - throw new IllegalArgumentException( - "At least one EntityType in sources list has not the expected EntityType"); - } - } - + public Set getDependencies() { + return Collections.unmodifiableSet(this.dependencies); } public Set extractKeys(final EntityType type) { @@ -96,4 +91,14 @@ public final class BulkAction { return "BulkAction [type=" + this.type + ", sourceType=" + this.sourceType + ", sources=" + this.sources + "]"; } + private void check() { + for (final EntityKey source : this.sources) { + if (source.entityType != this.sourceType) { + throw new IllegalArgumentException( + "At least one EntityType in sources list has not the expected EntityType"); + } + } + + } + } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/EntityController.java b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/EntityController.java index d3add2bc..7ae2ee31 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/EntityController.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/weblayer/api/EntityController.java @@ -139,12 +139,38 @@ public abstract class EntityController getDependencies( + @PathVariable final String modelId, + @RequestParam final BulkAction.Type type) { + + this.entityDAO + .byModelId(modelId) + .flatMap(this.authorization::checkReadonly); + + final BulkAction bulkAction = new BulkAction( + type, + this.entityDAO.entityType(), + Arrays.asList(new EntityKey(modelId, this.entityDAO.entityType()))); + + this.bulkActionService.collectDependencies(bulkAction); + return bulkAction.getDependencies(); + } + // ****************** // * GET (single) // ****************** @RequestMapping( - path = "/{modelId}", + path = API.MODEL_ID_VAR_PATH_SEGMENT, method = RequestMethod.GET, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/InstitutionAPITest.java b/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/InstitutionAPITest.java index 1bd3f12e..dfd60ee5 100644 --- a/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/InstitutionAPITest.java +++ b/src/test/java/ch/ethz/seb/sebserver/webservice/integration/api/admin/InstitutionAPITest.java @@ -25,10 +25,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import ch.ethz.seb.sebserver.gbl.api.API; import ch.ethz.seb.sebserver.gbl.api.APIMessage; +import ch.ethz.seb.sebserver.gbl.model.EntityKey; import ch.ethz.seb.sebserver.gbl.model.EntityName; import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport; +import ch.ethz.seb.sebserver.gbl.model.EntityType; import ch.ethz.seb.sebserver.gbl.model.Page; import ch.ethz.seb.sebserver.gbl.model.institution.Institution; +import ch.ethz.seb.sebserver.webservice.servicelayer.bulkaction.BulkAction; @Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" }) public class InstitutionAPITest extends AdministrationAPIIntegrationTester { @@ -401,6 +404,25 @@ public class InstitutionAPITest extends AdministrationAPIIntegrationTester { assertEquals("[]", getOrderedUUIDs(institutions.content)); } + @Test + public void testDependency() throws Exception { + final Collection dependencies = new RestAPITestHelper() + .withAccessToken(getSebAdminAccess()) + .withPath(API.INSTITUTION_ENDPOINT) + .withPath("1") + .withPath(API.DEPENDENCY_PATH_SEGMENT) + .withAttribute("type", BulkAction.Type.DEACTIVATE.name()) + .withExpectedStatus(HttpStatus.OK) + .getAsObject(new TypeReference>() { + }); + + assertNotNull(dependencies); + assertTrue(dependencies.size() == 3); + assertTrue(dependencies.contains(new EntityKey("1", EntityType.USER))); + assertTrue(dependencies.contains(new EntityKey("2", EntityType.USER))); + assertTrue(dependencies.contains(new EntityKey("5", EntityType.USER))); + } + static void assertContainsInstitution(final String name, final Collection institutions) { assert institutions != null; assert institutions.stream()