dependency API

This commit is contained in:
anhefti 2019-02-15 22:05:49 +01:00
parent ad374677ee
commit aa3e5339db
4 changed files with 65 additions and 10 deletions

View file

@ -48,6 +48,8 @@ public final class API {
public static final String INACTIVE_PATH_SEGMENT = "/inactive"; 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_ACTIVE = MODEL_ID_VAR_PATH_SEGMENT + ACTIVE_PATH_SEGMENT;
public static final String PATH_VAR_INACTIVE = MODEL_ID_VAR_PATH_SEGMENT + INACTIVE_PATH_SEGMENT; public static final String PATH_VAR_INACTIVE = MODEL_ID_VAR_PATH_SEGMENT + INACTIVE_PATH_SEGMENT;

View file

@ -12,6 +12,7 @@ import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -52,7 +53,7 @@ public final class BulkAction {
this.type = type; this.type = type;
this.sourceType = sourceType; this.sourceType = sourceType;
this.sources = Utils.immutableSetOf(sources); this.sources = Utils.immutableSetOf(sources);
this.dependencies = new HashSet<>(); this.dependencies = new LinkedHashSet<>();
this.result = new HashSet<>(); this.result = new HashSet<>();
check(); check();
@ -66,14 +67,8 @@ public final class BulkAction {
this(type, sourceType, (sources != null) ? Arrays.asList(sources) : Collections.emptyList()); this(type, sourceType, (sources != null) ? Arrays.asList(sources) : Collections.emptyList());
} }
private void check() { public Set<EntityKey> getDependencies() {
for (final EntityKey source : this.sources) { return Collections.unmodifiableSet(this.dependencies);
if (source.entityType != this.sourceType) {
throw new IllegalArgumentException(
"At least one EntityType in sources list has not the expected EntityType");
}
}
} }
public Set<EntityKey> extractKeys(final EntityType type) { public Set<EntityKey> extractKeys(final EntityType type) {
@ -96,4 +91,14 @@ public final class BulkAction {
return "BulkAction [type=" + this.type + ", sourceType=" + this.sourceType + ", sources=" + this.sources + "]"; 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");
}
}
}
} }

View file

@ -139,12 +139,38 @@ public abstract class EntityController<T extends GrantEntity, M extends GrantEnt
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
// ******************
// * GET (dependency)
// ******************
@RequestMapping(
path = API.MODEL_ID_VAR_PATH_SEGMENT + API.DEPENDENCY_PATH_SEGMENT,
method = RequestMethod.GET,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE)
public Collection<EntityKey> 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) // * GET (single)
// ****************** // ******************
@RequestMapping( @RequestMapping(
path = "/{modelId}", path = API.MODEL_ID_VAR_PATH_SEGMENT,
method = RequestMethod.GET, method = RequestMethod.GET,
consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE) produces = MediaType.APPLICATION_JSON_VALUE)

View file

@ -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.API;
import ch.ethz.seb.sebserver.gbl.api.APIMessage; 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.EntityName;
import ch.ethz.seb.sebserver.gbl.model.EntityProcessingReport; 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.Page;
import ch.ethz.seb.sebserver.gbl.model.institution.Institution; 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" }) @Sql(scripts = { "classpath:schema-test.sql", "classpath:data-test.sql" })
public class InstitutionAPITest extends AdministrationAPIIntegrationTester { public class InstitutionAPITest extends AdministrationAPIIntegrationTester {
@ -401,6 +404,25 @@ public class InstitutionAPITest extends AdministrationAPIIntegrationTester {
assertEquals("[]", getOrderedUUIDs(institutions.content)); assertEquals("[]", getOrderedUUIDs(institutions.content));
} }
@Test
public void testDependency() throws Exception {
final Collection<EntityKey> 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<Collection<EntityKey>>() {
});
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<Institution> institutions) { static void assertContainsInstitution(final String name, final Collection<Institution> institutions) {
assert institutions != null; assert institutions != null;
assert institutions.stream() assert institutions.stream()