TSK-401 After creating a workbasket, the user is not able to delete it.

This commit is contained in:
BerndBreier 2018-03-21 15:11:32 +01:00 committed by Martin Rojas Miguel Angel
parent 02fc6b3cd3
commit 32449a4d52
6 changed files with 69 additions and 20 deletions

View File

@ -143,9 +143,12 @@ public class ClassificationServiceImpl implements ClassificationService {
List<TaskSummary> taskSumamries = taskanaEngine.getTaskService()
.createTaskQuery()
.classificationIdIn(oldClassification.getId())
// .classificationCategoryIn(oldClassification.getCategory())
.list();
if (!taskSumamries.isEmpty()) {
boolean categoryChanged = !(oldClassification.getCategory() == null
? classification.getCategory() == null
: oldClassification.getCategory().equals(classification.getCategory()));
if (!taskSumamries.isEmpty() && categoryChanged) {
List<String> taskIds = new ArrayList<>();
taskSumamries.stream().forEach(ts -> taskIds.add(ts.getTaskId()));
taskMapper.updateClassificationCategoryOnChange(taskIds, classificationImpl.getCategory());

View File

@ -9,7 +9,6 @@ import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pro.taskana.TaskSummary;
import pro.taskana.TaskanaEngine;
import pro.taskana.TaskanaRole;
import pro.taskana.Workbasket;
@ -29,6 +28,7 @@ import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.impl.util.IdGenerator;
import pro.taskana.impl.util.LoggerUtils;
import pro.taskana.mappings.DistributionTargetMapper;
import pro.taskana.mappings.TaskMapper;
import pro.taskana.mappings.WorkbasketAccessMapper;
import pro.taskana.mappings.WorkbasketMapper;
import pro.taskana.security.CurrentUserContext;
@ -691,11 +691,13 @@ public class WorkbasketServiceImpl implements WorkbasketService {
// check if the workbasket does exist and is empty (Task)
Workbasket wb = this.getWorkbasket(workbasketId);
List<TaskSummary> taskUsages = taskanaEngine.getTaskService()
.createTaskQuery()
.workbasketIdIn(wb.getId())
.list();
if (taskUsages == null || taskUsages.size() > 0) {
long numTasksInWorkbasket = taskanaEngine.getSqlSession()
.getMapper(TaskMapper.class)
.countTasksInWorkbasket(workbasketId)
.longValue();
if (numTasksInWorkbasket > 0) {
throw new WorkbasketInUseException(
"Workbasket is used on tasks and can´t be deleted. WorkbasketId=" + workbasketId);
}

View File

@ -285,4 +285,10 @@ public interface TaskMapper {
@Result(property = "taskId", column = "ID")})
List<String> filterTaskIdsForNotCompleted(@Param("taskIds") List<String> taskIds);
@Select("<script>SELECT COUNT(ID) FROM TASK WHERE "
+ "WORKBASKET_ID = #{workbasketId} "
+ "<if test=\"_databaseId == 'db2'\">with UR </if> "
+ "</script>")
Long countTasksInWorkbasket(@Param("workbasketId") String workbasketId);
}

View File

@ -5,6 +5,8 @@ import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.sql.SQLException;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -12,8 +14,11 @@ import org.junit.runner.RunWith;
import acceptance.AbstractAccTest;
import pro.taskana.Workbasket;
import pro.taskana.WorkbasketService;
import pro.taskana.WorkbasketType;
import pro.taskana.exceptions.InvalidArgumentException;
import pro.taskana.exceptions.InvalidWorkbasketException;
import pro.taskana.exceptions.NotAuthorizedException;
import pro.taskana.exceptions.WorkbasketAlreadyExistException;
import pro.taskana.exceptions.WorkbasketInUseException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.security.JAASRunner;
@ -126,4 +131,28 @@ public class DeleteWorkbasketAccTest extends AbstractAccTest {
workbasketService.deleteWorkbasket(wb.getId());
}
@WithAccessId(
userName = "user_1_2",
groupNames = {"businessadmin"})
@Test
public void testCreateAndDeleteWorkbasket()
throws SQLException, NotAuthorizedException, InvalidArgumentException, WorkbasketNotFoundException,
InvalidWorkbasketException, WorkbasketAlreadyExistException {
WorkbasketService workbasketService = taskanaEngine.getWorkbasketService();
int before = workbasketService.createWorkbasketQuery().domainIn("DOMAIN_A").list().size();
Workbasket workbasket = workbasketService.newWorkbasket("NT1234", "DOMAIN_A");
workbasket.setName("TheUltimate");
workbasket.setType(WorkbasketType.GROUP);
workbasket.setOrgLevel1("company");
workbasket = workbasketService.createWorkbasket(workbasket);
try {
workbasketService.deleteWorkbasket(workbasket.getId());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

View File

@ -17,6 +17,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@ -41,6 +42,7 @@ import pro.taskana.exceptions.WorkbasketAlreadyExistException;
import pro.taskana.exceptions.WorkbasketInUseException;
import pro.taskana.exceptions.WorkbasketNotFoundException;
import pro.taskana.mappings.DistributionTargetMapper;
import pro.taskana.mappings.TaskMapper;
import pro.taskana.mappings.WorkbasketAccessMapper;
import pro.taskana.mappings.WorkbasketMapper;
@ -59,6 +61,12 @@ public class WorkbasketServiceImplTest {
@Mock
private WorkbasketMapper workbasketMapperMock;
@Mock
private TaskMapper taskMapperMock;
@Mock
private SqlSession sqlSessionMock;
@Mock
private DistributionTargetMapper distributionTargetMapperMock;
@ -501,10 +509,10 @@ public class WorkbasketServiceImplTest {
Workbasket wb = createTestWorkbasket("WBI:0", "wb-key");
List<TaskSummary> usages = Arrays.asList(new TaskSummaryImpl(), new TaskSummaryImpl());
doReturn(wb).when(cutSpy).getWorkbasket(wb.getId());
doReturn(taskServiceMock).when(taskanaEngineImplMock).getTaskService();
doReturn(taskQueryMock).when(taskServiceMock).createTaskQuery();
doReturn(taskQueryMock).when(taskQueryMock).workbasketIdIn(wb.getId());
doReturn(usages).when(taskQueryMock).list();
doReturn(sqlSessionMock).when(taskanaEngineImplMock).getSqlSession();
doReturn(taskMapperMock).when(sqlSessionMock).getMapper(TaskMapper.class);
doReturn(new Long(1)).when(taskMapperMock).countTasksInWorkbasket(any());
try {
cutSpy.deleteWorkbasket(wb.getId());
@ -528,19 +536,18 @@ public class WorkbasketServiceImplTest {
throws NotAuthorizedException, WorkbasketInUseException, InvalidArgumentException, WorkbasketNotFoundException {
Workbasket wb = createTestWorkbasket("WBI:0", "wb-key");
doReturn(wb).when(cutSpy).getWorkbasket(wb.getId());
doReturn(taskServiceMock).when(taskanaEngineImplMock).getTaskService();
doReturn(taskQueryMock).when(taskServiceMock).createTaskQuery();
doReturn(taskQueryMock).when(taskQueryMock).workbasketIdIn(wb.getId());
doReturn(new ArrayList<>()).when(taskQueryMock).list();
doReturn(sqlSessionMock).when(taskanaEngineImplMock).getSqlSession();
doReturn(taskMapperMock).when(sqlSessionMock).getMapper(TaskMapper.class);
doReturn(new Long(0)).when(taskMapperMock).countTasksInWorkbasket(any());
cutSpy.deleteWorkbasket(wb.getId());
verify(taskanaEngineImplMock, times(1)).openConnection();
verify(cutSpy, times(1)).getWorkbasket(wb.getId());
verify(taskanaEngineImplMock, times(1)).getTaskService();
verify(taskServiceMock, times(1)).createTaskQuery();
verify(taskQueryMock, times(1)).workbasketIdIn(wb.getId());
verify(taskQueryMock, times(1)).list();
verify(taskanaEngineImplMock, times(1)).getSqlSession();
verify(sqlSessionMock, times(1)).getMapper(TaskMapper.class);
verify(taskMapperMock, times(1)).countTasksInWorkbasket(any());
verify(distributionTargetMapperMock, times(1)).deleteAllDistributionTargetsBySourceId(wb.getId());
verify(distributionTargetMapperMock, times(1)).deleteAllDistributionTargetsByTargetId(wb.getId());
verify(workbasketAccessMapperMock, times(1)).deleteAllAccessItemsForWorkbasketId(wb.getId());

View File

@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import pro.taskana.TaskanaEngine;
import pro.taskana.impl.BulkOperationResults;
@ -26,6 +27,7 @@ public class JobScheduler {
private TaskanaEngine taskanaEngine;
@Scheduled(fixedRate = 60000)
@Transactional(rollbackFor = Exception.class)
public void triggerJobs() {
JobRunner runner = new JobRunner(taskanaEngine);
LOGGER.info("Running Jobs");