diff --git a/rest/src/main/java/pro/taskana/rest/RestApplication.java b/rest/src/main/java/pro/taskana/rest/RestApplication.java index 14b795682..3f96b4bd2 100644 --- a/rest/src/main/java/pro/taskana/rest/RestApplication.java +++ b/rest/src/main/java/pro/taskana/rest/RestApplication.java @@ -4,7 +4,6 @@ import java.sql.SQLException; import javax.annotation.PostConstruct; -import org.modelmapper.ModelMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.config.ConfigurableBeanFactory; @@ -22,11 +21,10 @@ import pro.taskana.ClassificationService; import pro.taskana.TaskMonitorService; import pro.taskana.TaskService; import pro.taskana.TaskanaEngine; -import pro.taskana.Workbasket; import pro.taskana.WorkbasketService; import pro.taskana.configuration.TaskanaEngineConfiguration; import pro.taskana.rest.resource.mapper.WorkbasketDefinitionMapper; -import pro.taskana.rest.serialization.WorkbasketMixIn; +import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper; import pro.taskana.sampledata.SampleDataGenerator; @SpringBootApplication @@ -58,6 +56,16 @@ public class RestApplication { return getTaskanaEngine().getWorkbasketService(); } + @Bean + public WorkbasketSummaryMapper getWorkbasketSummaryMapper() { + return new WorkbasketSummaryMapper(); + } + + @Bean + public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() { + return new WorkbasketDefinitionMapper(); + } + @Bean @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) public TaskanaEngine getTaskanaEngine() throws SQLException { @@ -71,15 +79,6 @@ public class RestApplication { return taskanaEngineConfiguration; } - @PostConstruct - public void createSampleData() { - try { - new SampleDataGenerator(getTaskanaEngineConfiguration().createDefaultDataSource()).generateSampleData(); - } catch (SQLException e) { - logger.error("Could not create sample data.", e); - } - } - /** * Needed to override JSON De-/Serializer in Jackson. * @@ -89,7 +88,7 @@ public class RestApplication { @Bean public Jackson2ObjectMapperBuilder jacksonBuilder(HandlerInstantiator handlerInstantiator) { Jackson2ObjectMapperBuilder b = new Jackson2ObjectMapperBuilder(); - b.indentOutput(true).mixIn(Workbasket.class, WorkbasketMixIn.class); + b.indentOutput(true); b.handlerInstantiator(handlerInstantiator); return b; } @@ -105,13 +104,13 @@ public class RestApplication { return new SpringHandlerInstantiator(context.getAutowireCapableBeanFactory()); } - @Bean - public ModelMapper modelMapper() { - return new ModelMapper(); + @PostConstruct + public void createSampleData() { + try { + new SampleDataGenerator(getTaskanaEngineConfiguration().createDefaultDataSource()).generateSampleData(); + } catch (SQLException e) { + logger.error("Could not create sample data.", e); + } } - @Bean - public WorkbasketDefinitionMapper getWorkbasketDefinitionMapper() { - return new WorkbasketDefinitionMapper(); - } } diff --git a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java index 20fb64dcc..ab471f030 100644 --- a/rest/src/main/java/pro/taskana/rest/WorkbasketController.java +++ b/rest/src/main/java/pro/taskana/rest/WorkbasketController.java @@ -1,13 +1,10 @@ package pro.taskana.rest; -import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.Link; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -31,9 +28,8 @@ import pro.taskana.exceptions.NotAuthorizedException; import pro.taskana.exceptions.WorkbasketNotFoundException; import pro.taskana.impl.WorkbasketAuthorization; import pro.taskana.impl.WorkbasketType; -import pro.taskana.rest.dto.WorkbasketSummaryDto; -import pro.taskana.rest.mapper.WorkbasketSummaryMapper; -import pro.taskana.security.CurrentUserContext; +import pro.taskana.rest.resource.WorkbasketSummaryResource; +import pro.taskana.rest.resource.mapper.WorkbasketSummaryMapper; @RestController @RequestMapping(path = "/v1/workbaskets", produces = {MediaType.APPLICATION_JSON_VALUE}) @@ -49,47 +45,45 @@ public class WorkbasketController { @Autowired private WorkbasketService workbasketService; + @Autowired private WorkbasketSummaryMapper workbasketSummaryMapper; @RequestMapping(method = RequestMethod.GET) - public ResponseEntity> GetWorkbaskets( + public ResponseEntity> getWorkbaskets( @RequestParam(value = "sortBy", defaultValue = "name", required = false) String sortBy, @RequestParam(value = "order", defaultValue = "asc", required = false) String order, - @RequestParam(value = "name", defaultValue = "", required = false) String name, - @RequestParam(value = "nameLike", defaultValue = "", required = false) String nameLike, - @RequestParam(value = "descLike", defaultValue = "", required = false) String descLike, - @RequestParam(value = "owner", defaultValue = "", required = false) String owner, - @RequestParam(value = "ownerLike", defaultValue = "", required = false) String ownerLike, - @RequestParam(value = "type", defaultValue = "", required = false) String type, - @RequestParam(value = "requiredPermission", defaultValue = "", required = false) String requiredPermission) { + @RequestParam(value = "name", required = false) String name, + @RequestParam(value = "nameLike", required = false) String nameLike, + @RequestParam(value = "descLike", required = false) String descLike, + @RequestParam(value = "owner", required = false) String owner, + @RequestParam(value = "ownerLike", required = false) String ownerLike, + @RequestParam(value = "type", required = false) String type, + @RequestParam(value = "requiredPermission", required = false) String requiredPermission) { List workbasketsSummary; WorkbasketQuery query = workbasketService.createWorkbasketQuery(); try { - AddSortByQuery(query, sortBy, order); - AddFilterQuery(query, name, nameLike, descLike, owner, ownerLike, type); - AddAuthorization(query, requiredPermission); + addSortingToQuery(query, sortBy, order); + addAttributeFilter(query, name, nameLike, descLike, owner, ownerLike, type); + addAuthorizationFilter(query, requiredPermission); workbasketsSummary = query.list(); } catch (InvalidArgumentException e) { return new ResponseEntity<>(HttpStatus.CONFLICT); } catch (InvalidRequestException e) { return new ResponseEntity<>(HttpStatus.CONFLICT); - } catch (NotAuthorizedException e) { - return new ResponseEntity<>(HttpStatus.UNAUTHORIZED); } return new ResponseEntity<>(workbasketsSummary.stream() - .map(workbasket -> workbasketSummaryMapper.convertToDto(workbasket)) - .map(WorkbasketController::WorkbasketSummaryLink) + .map(workbasket -> workbasketSummaryMapper.toResource(workbasket)) .collect(Collectors.toList()), HttpStatus.OK); } @RequestMapping(value = "/{workbasketid}") - public ResponseEntity getWorkbasketById(@PathVariable(value = "workbasketid") String workbasketId) { + public ResponseEntity getWorkbasket(@PathVariable(value = "workbasketid") String workbasketId) { try { Workbasket workbasket = workbasketService.getWorkbasket(workbasketId); return new ResponseEntity<>(workbasket, HttpStatus.OK); @@ -149,68 +143,68 @@ public class WorkbasketController { return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); } - private void AddAuthorization(WorkbasketQuery query, String requiredPermission) throws InvalidArgumentException { - if (requiredPermission.isEmpty()) { + private void addAuthorizationFilter(WorkbasketQuery query, String requiredPermission) + throws InvalidArgumentException { + if (requiredPermission == null) { return; } - String[] accessIds = GetCurrentUserAccessIds(); for (String authorization : Arrays.asList(requiredPermission.split(","))) { try { switch (authorization.trim()) { case "READ": - query.accessIdsHavePermission(WorkbasketAuthorization.READ, accessIds); + query.callerHasPermission(WorkbasketAuthorization.READ); break; case "OPEN": - query.accessIdsHavePermission(WorkbasketAuthorization.OPEN, accessIds); + query.callerHasPermission(WorkbasketAuthorization.OPEN); break; case "APPEND": - query.accessIdsHavePermission(WorkbasketAuthorization.APPEND, accessIds); + query.callerHasPermission(WorkbasketAuthorization.APPEND); break; case "TRANSFER": - query.accessIdsHavePermission(WorkbasketAuthorization.TRANSFER, accessIds); + query.callerHasPermission(WorkbasketAuthorization.TRANSFER); break; case "DISTRIBUTE": - query.accessIdsHavePermission(WorkbasketAuthorization.DISTRIBUTE, accessIds); + query.callerHasPermission(WorkbasketAuthorization.DISTRIBUTE); break; case "DELETE": - query.accessIdsHavePermission(WorkbasketAuthorization.DELETE, accessIds); + query.callerHasPermission(WorkbasketAuthorization.DELETE); break; case "CUSTOM_1": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_1, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_1); break; case "CUSTOM_2": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_2, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_2); break; case "CUSTOM_3": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_3, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_3); break; case "CUSTOM_4": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_4, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_4); break; case "CUSTOM_5": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_5, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_5); break; case "CUSTOM_6": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_6, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_6); break; case "CUSTOM_7": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_7, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_7); break; case "CUSTOM_8": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_8, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_8); break; case "CUSTOM_9": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_9, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_9); break; case "CUSTOM_10": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_10, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_10); break; case "CUSTOM_11": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_11, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_11); break; case "CUSTOM_12": - query.accessIdsHavePermission(WorkbasketAuthorization.CUSTOM_12, accessIds); + query.callerHasPermission(WorkbasketAuthorization.CUSTOM_12); break; } } catch (InvalidArgumentException e) { @@ -219,12 +213,12 @@ public class WorkbasketController { } } - private void AddSortByQuery(WorkbasketQuery query, String sortBy, String order) + private void addSortingToQuery(WorkbasketQuery query, String sortBy, String order) throws InvalidRequestException, InvalidArgumentException { - BaseQuery.SortDirection sortDirection = GetSortDirecction(order); + BaseQuery.SortDirection sortDirection = getSortDirection(order); if (sortBy.equals(NAME)) { - query.orderByKey(sortDirection); + query.orderByName(sortDirection); } else if (sortBy.equals(KEY)) { query.orderByKey(sortDirection); } else if (sortBy.equals(DESCRIPTION)) { @@ -236,56 +230,39 @@ public class WorkbasketController { } } - private BaseQuery.SortDirection GetSortDirecction(String order) throws InvalidRequestException { + private BaseQuery.SortDirection getSortDirection(String order) throws InvalidRequestException { if (order.equals(DESC)) { return BaseQuery.SortDirection.DESCENDING; } return BaseQuery.SortDirection.ASCENDING; } - private void AddFilterQuery(WorkbasketQuery query, + private void addAttributeFilter(WorkbasketQuery query, String name, String nameLike, String descLike, String owner, - String ownerLike, String type) throws NotAuthorizedException, InvalidArgumentException { - if (!name.isEmpty()) + String ownerLike, String type) throws InvalidArgumentException { + if (name != null) query.nameIn(name); - if (!nameLike.isEmpty()) + if (nameLike != null) query.nameLike(LIKE + nameLike + LIKE); - if (!owner.isEmpty()) + if (owner != null) query.ownerIn(owner); - if (!ownerLike.isEmpty()) + if (ownerLike != null) query.ownerLike(LIKE + ownerLike + LIKE); - if (!descLike.isEmpty()) + if (descLike != null) query.descriptionLike(LIKE + descLike + LIKE); - switch (type) { - case "PERSONAL": - query.typeIn(WorkbasketType.PERSONAL); - case "GROUP": - query.typeIn(WorkbasketType.GROUP); - case "CLEARANCE": - query.typeIn(WorkbasketType.CLEARANCE); - case "TOPIC": - query.typeIn(WorkbasketType.TOPIC); + if (type != null) { + switch (type) { + case "PERSONAL": + query.typeIn(WorkbasketType.PERSONAL); + case "GROUP": + query.typeIn(WorkbasketType.GROUP); + case "CLEARANCE": + query.typeIn(WorkbasketType.CLEARANCE); + case "TOPIC": + query.typeIn(WorkbasketType.TOPIC); + } } } - private String[] GetCurrentUserAccessIds() throws InvalidArgumentException { - String[] accessIds; - List ucAccessIds = CurrentUserContext.getAccessIds(); - if (ucAccessIds != null && !ucAccessIds.isEmpty()) { - accessIds = new String[ucAccessIds.size()]; - accessIds = ucAccessIds.toArray(accessIds); - } else { - throw new InvalidArgumentException("CurrentUserContext need to have at least one accessId."); - } - return accessIds; - } - - private static WorkbasketSummaryDto WorkbasketSummaryLink(WorkbasketSummaryDto workbasketSummaryDto) { - - Link selfLink = linkTo(WorkbasketController.class).slash(workbasketSummaryDto.getWorkbasketId()).withSelfRel(); - workbasketSummaryDto.add(selfLink); - return workbasketSummaryDto; - } - } diff --git a/rest/src/main/java/pro/taskana/rest/dto/WorkbasketSummaryDto.java b/rest/src/main/java/pro/taskana/rest/dto/WorkbasketSummaryDto.java deleted file mode 100644 index 22a059bcc..000000000 --- a/rest/src/main/java/pro/taskana/rest/dto/WorkbasketSummaryDto.java +++ /dev/null @@ -1,108 +0,0 @@ -package pro.taskana.rest.dto; - -import org.springframework.hateoas.ResourceSupport; - -import pro.taskana.impl.WorkbasketType; - -public class WorkbasketSummaryDto extends ResourceSupport { - - private String workbasketId; - private String key; - private String name; - private String description; - private String owner; - private String domain; - private WorkbasketType type; - private String orgLevel1; - private String orgLevel2; - private String orgLevel3; - private String orgLevel4; - - public String getWorkbasketId() { - return workbasketId; - } - - public void setWorkbasketId(String workbasketId) { - this.workbasketId = workbasketId; - } - - public String getKey() { - return key; - } - - public void setKey(String key) { - this.key = key; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public String getOwner() { - return owner; - } - - public void setOwner(String owner) { - this.owner = owner; - } - - public String getDomain() { - return domain; - } - - public void setDomain(String domain) { - this.domain = domain; - } - - public WorkbasketType getType() { - return type; - } - - public void setType(WorkbasketType type) { - this.type = type; - } - - public String getOrgLevel1() { - return orgLevel1; - } - - public void setOrgLevel1(String orgLevel1) { - this.orgLevel1 = orgLevel1; - } - - public String getOrgLevel2() { - return orgLevel2; - } - - public void setOrgLevel2(String orgLevel2) { - this.orgLevel2 = orgLevel2; - } - - public String getOrgLevel3() { - return orgLevel3; - } - - public void setOrgLevel3(String orgLevel3) { - this.orgLevel3 = orgLevel3; - } - - public String getOrgLevel4() { - return orgLevel4; - } - - public void setOrgLevel4(String orgLevel4) { - this.orgLevel4 = orgLevel4; - } -} diff --git a/rest/src/main/java/pro/taskana/rest/mapper/WorkbasketSummaryMapper.java b/rest/src/main/java/pro/taskana/rest/mapper/WorkbasketSummaryMapper.java deleted file mode 100644 index c57a8ad6c..000000000 --- a/rest/src/main/java/pro/taskana/rest/mapper/WorkbasketSummaryMapper.java +++ /dev/null @@ -1,21 +0,0 @@ -package pro.taskana.rest.mapper; - -import org.modelmapper.ModelMapper; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.hateoas.ResourceSupport; -import org.springframework.stereotype.Component; -import pro.taskana.WorkbasketSummary; -import pro.taskana.rest.dto.WorkbasketSummaryDto; - -@Component -public class WorkbasketSummaryMapper extends ResourceSupport { - - @Autowired - private ModelMapper modelMapper; - - public WorkbasketSummaryDto convertToDto(WorkbasketSummary workbasketSummary){ - WorkbasketSummaryDto dto = modelMapper.map(workbasketSummary, WorkbasketSummaryDto.class); - dto.setWorkbasketId(workbasketSummary.getId()); - return dto; - } -} diff --git a/rest/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResource.java b/rest/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResource.java new file mode 100644 index 000000000..56347abde --- /dev/null +++ b/rest/src/main/java/pro/taskana/rest/resource/WorkbasketSummaryResource.java @@ -0,0 +1,48 @@ +package pro.taskana.rest.resource; + +import javax.validation.constraints.NotNull; + +import org.springframework.hateoas.ResourceSupport; + +import pro.taskana.impl.WorkbasketType; + +public class WorkbasketSummaryResource extends ResourceSupport { + + public String id; + + @NotNull + public String key; + + @NotNull + public String name; + + @NotNull + public String domain; + + @NotNull + public WorkbasketType type; + + public String description; + public String owner; + public String orgLevel1; + public String orgLevel2; + public String orgLevel3; + public String orgLevel4; + + public WorkbasketSummaryResource(String id, String key, String name, String description, String owner, + String domain, WorkbasketType type, String orgLevel1, String orgLevel2, String orgLevel3, String orgLevel4) { + super(); + this.id = id; + this.key = key; + this.name = name; + this.description = description; + this.owner = owner; + this.domain = domain; + this.type = type; + this.orgLevel1 = orgLevel1; + this.orgLevel2 = orgLevel2; + this.orgLevel3 = orgLevel3; + this.orgLevel4 = orgLevel4; + } + +} diff --git a/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java new file mode 100644 index 000000000..17f7300ba --- /dev/null +++ b/rest/src/main/java/pro/taskana/rest/resource/mapper/WorkbasketSummaryMapper.java @@ -0,0 +1,24 @@ +package pro.taskana.rest.resource.mapper; + +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo; +import static org.springframework.hateoas.mvc.ControllerLinkBuilder.methodOn; + +import pro.taskana.WorkbasketSummary; +import pro.taskana.rest.WorkbasketController; +import pro.taskana.rest.resource.WorkbasketSummaryResource; + +public class WorkbasketSummaryMapper { + + public WorkbasketSummaryResource toResource(WorkbasketSummary summary) { + WorkbasketSummaryResource resource = new WorkbasketSummaryResource( + summary.getId(), summary.getKey(), summary.getName(), summary.getDescription(), summary.getOwner(), + summary.getDomain(), summary.getType(), summary.getOrgLevel1(), summary.getOrgLevel2(), + summary.getOrgLevel3(), summary.getOrgLevel4()); + + // Add self reference + resource.add(linkTo(methodOn(WorkbasketController.class).getWorkbasket(summary.getId())).withSelfRel()); + + return resource; + } + +}