diff --git a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketAccessItemQuery.java b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketAccessItemQuery.java index a9df9fc89..bdf5b600c 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/WorkbasketAccessItemQuery.java +++ b/lib/taskana-core/src/main/java/pro/taskana/WorkbasketAccessItemQuery.java @@ -5,6 +5,15 @@ package pro.taskana; */ public interface WorkbasketAccessItemQuery extends BaseQuery { + /** + * Add your unique entry id to your query as filter. + * + * @param ids + * the unique entry IDs + * @return the query + */ + WorkbasketAccessItemQuery idIn(String... ids); + /** * Add your workbasket id to your query. * @@ -42,4 +51,14 @@ public interface WorkbasketAccessItemQuery extends BaseQuery getWorkbasketAuthorizations(String workbasketId); + /** + * Setting up the new WorkbasketAccessItems for a Workbasket. Already stored values will be completely replaced by + * the current ones. + * + * @param workbasketId + * ID of the access-target workbasket. + * @param wbAccessItems + * List of WorkbasketAccessItems which does replace all current stored ones. + * @throws InvalidArgumentException + * will be thrown when the parameter is NULL or member doesn´t match the preconditions + */ + void setWorkbasketAuthorizations(String workbasketId, List wbAccessItems) + throws InvalidArgumentException; + /** * This method returns the workbaskets for which the current user has all permissions specified in the permissions * list. @@ -321,5 +338,4 @@ public interface WorkbasketService { */ List getDistributionSources(String workbasketKey, String domain) throws NotAuthorizedException, WorkbasketNotFoundException; - } diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketAccessItemQueryImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketAccessItemQueryImpl.java index e2099be1c..0da10566d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketAccessItemQueryImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketAccessItemQueryImpl.java @@ -27,6 +27,7 @@ public class WorkbasketAccessItemQueryImpl implements WorkbasketAccessItemQuery private static final Logger LOGGER = LoggerFactory.getLogger(WorkbasketQueryImpl.class); private String[] accessIdIn; private String[] workbasketIdIn; + private String[] idIn; private TaskanaEngineImpl taskanaEngineImpl; private List orderBy; @@ -36,6 +37,12 @@ public class WorkbasketAccessItemQueryImpl implements WorkbasketAccessItemQuery orderBy = new ArrayList<>(); } + @Override + public WorkbasketAccessItemQuery idIn(String... ids) { + this.idIn = ids; + return this; + } + @Override public WorkbasketAccessItemQuery workbasketIdIn(String... id) { this.workbasketIdIn = id; @@ -49,6 +56,11 @@ public class WorkbasketAccessItemQueryImpl implements WorkbasketAccessItemQuery return this; } + @Override + public WorkbasketAccessItemQuery orderById(SortDirection sortDirection) { + return addOrderCriteria("ID", sortDirection); + } + @Override public WorkbasketAccessItemQuery orderByWorkbasketId(SortDirection sortDirection) { return addOrderCriteria("WORKBASKET_ID", sortDirection); @@ -145,6 +157,10 @@ public class WorkbasketAccessItemQueryImpl implements WorkbasketAccessItemQuery return this; } + public String[] getIdIn() { + return this.idIn; + } + public String[] getAccessIdIn() { return accessIdIn; } @@ -160,7 +176,9 @@ public class WorkbasketAccessItemQueryImpl implements WorkbasketAccessItemQuery @Override public String toString() { StringBuilder builder = new StringBuilder(); - builder.append("WorkbasketAccessItemQueryImpl [accessIdIn="); + builder.append("WorkbasketAccessItemQueryImpl [idIn="); + builder.append(Arrays.toString(idIn)); + builder.append(", accessIdIn="); builder.append(Arrays.toString(accessIdIn)); builder.append(", workbasketIdIn="); builder.append(Arrays.toString(workbasketIdIn)); diff --git a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketServiceImpl.java b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketServiceImpl.java index bb55cc80e..72abc83d0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketServiceImpl.java +++ b/lib/taskana-core/src/main/java/pro/taskana/impl/WorkbasketServiceImpl.java @@ -200,12 +200,19 @@ public class WorkbasketServiceImpl implements WorkbasketService { } @Override - public WorkbasketAccessItem createWorkbasketAuthorization(WorkbasketAccessItem workbasketAccessItem) { + public WorkbasketAccessItem createWorkbasketAuthorization(WorkbasketAccessItem workbasketAccessItem) + throws InvalidArgumentException { LOGGER.debug("entry to createWorkbasketAuthorization(workbasketAccessItem = {})", workbasketAccessItem); WorkbasketAccessItemImpl accessItem = (WorkbasketAccessItemImpl) workbasketAccessItem; try { taskanaEngine.openConnection(); accessItem.setId(IdGenerator.generateWithPrefix(ID_PREFIX_WORKBASKET_AUTHORIZATION)); + if (workbasketAccessItem.getId() == null || workbasketAccessItem.getAccessId() == null + || workbasketAccessItem.getWorkbasketId() == null) { + throw new InvalidArgumentException( + "Checking the preconditions of the current WorkbasketAccessItem failed. WorkbasketAccessItem=" + + workbasketAccessItem.toString()); + } workbasketAccessMapper.insert(accessItem); LOGGER.debug("Method createWorkbasketAuthorization() created workbaskteAccessItem {}", accessItem); @@ -218,12 +225,51 @@ public class WorkbasketServiceImpl implements WorkbasketService { } @Override - public void deleteWorkbasketAuthorization(String id) { - LOGGER.debug("entry to deleteWorkbasketAuthorization(id = {})", id); + public void setWorkbasketAuthorizations(String workbasketId, List wbAccessItems) + throws InvalidArgumentException { + List newItems = new ArrayList<>(); + try { + LOGGER.debug("entry to setWorkbasketAuthorizations(workbasketAccessItems = {})", wbAccessItems.toString()); + taskanaEngine.openConnection(); + // Check pre-conditions and set ID + if (!wbAccessItems.isEmpty()) { + for (WorkbasketAccessItem workbasketAccessItem : wbAccessItems) { + WorkbasketAccessItemImpl wbAccessItemImpl = (WorkbasketAccessItemImpl) workbasketAccessItem; + if (wbAccessItemImpl.getWorkbasketId() == null) { + throw new InvalidArgumentException( + "Checking the preconditions of the current WorkbasketAccessItem failed - WBID is NULL. WorkbasketAccessItem=" + + workbasketAccessItem.toString()); + } else if (!wbAccessItemImpl.getWorkbasketId().equals(workbasketId)) { + throw new InvalidArgumentException( + "Checking the preconditions of the current WorkbasketAccessItem failed - the WBID does not match. Target-WBID='" + + workbasketId + "' WorkbasketAccessItem=" + + workbasketAccessItem.toString()); + } + if (wbAccessItemImpl.getId() == null || wbAccessItemImpl.getId().isEmpty()) { + wbAccessItemImpl.setId(IdGenerator.generateWithPrefix(ID_PREFIX_WORKBASKET_AUTHORIZATION)); + } + newItems.add(wbAccessItemImpl); + } + + // delete all current ones + workbasketAccessMapper.deleteAllAccessItemsForWorkbasketId(workbasketId); + + // add all + newItems.stream().forEach(item -> workbasketAccessMapper.insert(item)); + } + } finally { + taskanaEngine.returnConnection(); + LOGGER.debug("exit from setWorkbasketAuthorizations(workbasketAccessItems = {})", wbAccessItems.toString()); + } + } + + @Override + public void deleteWorkbasketAuthorization(String accessItemId) { + LOGGER.debug("entry to deleteWorkbasketAuthorization(id = {})", accessItemId); try { taskanaEngine.openConnection(); - workbasketAccessMapper.delete(id); - LOGGER.debug("Method deleteWorkbasketAuthorization() deleted workbasketAccessItem wit Id {}", id); + workbasketAccessMapper.delete(accessItemId); + LOGGER.debug("Method deleteWorkbasketAuthorization() deleted workbasketAccessItem wit Id {}", accessItemId); } finally { taskanaEngine.returnConnection(); LOGGER.debug("exit from deleteWorkbasketAuthorization(id)."); @@ -613,7 +659,7 @@ public class WorkbasketServiceImpl implements WorkbasketService { // delete workbasket and sub-tables distributionTargetMapper.deleteAllDistributionTargetsBySourceId(wb.getId()); distributionTargetMapper.deleteAllDistributionTargetsByTargetId(wb.getId()); - workbasketAccessMapper.deleteAllForWorkbasketId(wb.getId()); + workbasketAccessMapper.deleteAllAccessItemsForWorkbasketId(wb.getId()); workbasketMapper.delete(workbasketId); } finally { taskanaEngine.returnConnection(); diff --git a/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java b/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java index 18ddd481d..871d965b0 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/mappings/QueryMapper.java @@ -273,6 +273,7 @@ public interface QueryMapper { + "PERM_CUSTOM_3, PERM_CUSTOM_4, PERM_CUSTOM_5, PERM_CUSTOM_6, PERM_CUSTOM_7, PERM_CUSTOM_8, PERM_CUSTOM_9, PERM_CUSTOM_10, PERM_CUSTOM_11, PERM_CUSTOM_12 " + "from WORKBASKET_ACCESS_LIST " + "" + + "AND ID IN(#{item}) " + "AND WORKBASKET_ID IN(#{item}) " + "AND ACCESS_ID IN(#{item}) " + "" diff --git a/lib/taskana-core/src/main/java/pro/taskana/mappings/WorkbasketAccessMapper.java b/lib/taskana-core/src/main/java/pro/taskana/mappings/WorkbasketAccessMapper.java index e02a94137..f73ea064d 100644 --- a/lib/taskana-core/src/main/java/pro/taskana/mappings/WorkbasketAccessMapper.java +++ b/lib/taskana-core/src/main/java/pro/taskana/mappings/WorkbasketAccessMapper.java @@ -77,11 +77,11 @@ public interface WorkbasketAccessMapper { + "WHERE id = #{workbasketAccessItem.id}") void update(@Param("workbasketAccessItem") WorkbasketAccessItemImpl workbasketAccessItem); - @Delete("DELETE FROM WORKBASKET_ACCESS_LIST where id = #{id}") + @Delete("DELETE FROM WORKBASKET_ACCESS_LIST WHERE ID = #{id}") void delete(@Param("id") String id); - @Delete("DELETE FROM WORKBASKET_ACCESS_LIST where WORKBASKET_ID = #{workbasketId}") - void deleteAllForWorkbasketId(@Param("workbasketId") String workbasketId); + @Delete("DELETE FROM WORKBASKET_ACCESS_LIST WHERE WORKBASKET_ID = #{workbasketId}") + void deleteAllAccessItemsForWorkbasketId(@Param("workbasketId") String workbasketId); @Select("