Merge pull request #12 from eberhardmayer/master
Object Reference added to Task
This commit is contained in:
commit
9755ff98ca
|
@ -15,10 +15,12 @@ import org.taskana.exceptions.NotAuthorizedException;
|
||||||
import org.taskana.exceptions.TaskNotFoundException;
|
import org.taskana.exceptions.TaskNotFoundException;
|
||||||
import org.taskana.exceptions.WorkbasketNotFoundException;
|
import org.taskana.exceptions.WorkbasketNotFoundException;
|
||||||
import org.taskana.model.DueWorkbasketCounter;
|
import org.taskana.model.DueWorkbasketCounter;
|
||||||
|
import org.taskana.model.ObjectReference;
|
||||||
import org.taskana.model.Task;
|
import org.taskana.model.Task;
|
||||||
import org.taskana.model.TaskState;
|
import org.taskana.model.TaskState;
|
||||||
import org.taskana.model.TaskStateCounter;
|
import org.taskana.model.TaskStateCounter;
|
||||||
import org.taskana.model.WorkbasketAuthorization;
|
import org.taskana.model.WorkbasketAuthorization;
|
||||||
|
import org.taskana.model.mappings.ObjectReferenceMapper;
|
||||||
import org.taskana.model.mappings.TaskMapper;
|
import org.taskana.model.mappings.TaskMapper;
|
||||||
|
|
||||||
public class TaskServiceImpl implements TaskService {
|
public class TaskServiceImpl implements TaskService {
|
||||||
|
@ -27,11 +29,13 @@ public class TaskServiceImpl implements TaskService {
|
||||||
|
|
||||||
private TaskanaEngine taskanaEngine;
|
private TaskanaEngine taskanaEngine;
|
||||||
private TaskMapper taskMapper;
|
private TaskMapper taskMapper;
|
||||||
|
private ObjectReferenceMapper objectReferenceMapper;
|
||||||
|
|
||||||
public TaskServiceImpl(TaskanaEngine taskanaEngine, TaskMapper taskMapper) {
|
public TaskServiceImpl(TaskanaEngine taskanaEngine, TaskMapper taskMapper, ObjectReferenceMapper objectReferenceMapper) {
|
||||||
super();
|
super();
|
||||||
this.taskanaEngine = taskanaEngine;
|
this.taskanaEngine = taskanaEngine;
|
||||||
this.taskMapper = taskMapper;
|
this.taskMapper = taskMapper;
|
||||||
|
this.objectReferenceMapper = objectReferenceMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -76,7 +80,19 @@ public class TaskServiceImpl implements TaskService {
|
||||||
task.setModified(now);
|
task.setModified(now);
|
||||||
task.setRead(false);
|
task.setRead(false);
|
||||||
task.setTransferred(false);
|
task.setTransferred(false);
|
||||||
taskMapper.insert(task);
|
|
||||||
|
// insert ObjectReference if needed.
|
||||||
|
if (task.getPrimaryObjRef() != null) {
|
||||||
|
ObjectReference objectReference = this.objectReferenceMapper.findByObjectReference(task.getPrimaryObjRef());
|
||||||
|
if (objectReference == null) {
|
||||||
|
objectReference = task.getPrimaryObjRef();
|
||||||
|
objectReference.setId(UUID.randomUUID().toString());
|
||||||
|
this.objectReferenceMapper.insert(objectReference);
|
||||||
|
}
|
||||||
|
task.setPrimaryObjRef(objectReference);
|
||||||
|
}
|
||||||
|
this.taskMapper.insert(task);
|
||||||
|
|
||||||
logger.debug("Task '{}' created.", task.getId());
|
logger.debug("Task '{}' created.", task.getId());
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.taskana.WorkbasketService;
|
||||||
import org.taskana.configuration.TaskanaEngineConfiguration;
|
import org.taskana.configuration.TaskanaEngineConfiguration;
|
||||||
import org.taskana.model.mappings.ClassificationMapper;
|
import org.taskana.model.mappings.ClassificationMapper;
|
||||||
import org.taskana.model.mappings.DistributionTargetMapper;
|
import org.taskana.model.mappings.DistributionTargetMapper;
|
||||||
|
import org.taskana.model.mappings.ObjectReferenceMapper;
|
||||||
import org.taskana.model.mappings.TaskMapper;
|
import org.taskana.model.mappings.TaskMapper;
|
||||||
import org.taskana.model.mappings.WorkbasketAccessMapper;
|
import org.taskana.model.mappings.WorkbasketAccessMapper;
|
||||||
import org.taskana.model.mappings.WorkbasketMapper;
|
import org.taskana.model.mappings.WorkbasketMapper;
|
||||||
|
@ -32,6 +33,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
private DistributionTargetMapper distributionTargetMapper;
|
private DistributionTargetMapper distributionTargetMapper;
|
||||||
private ClassificationMapper classificationMapper;
|
private ClassificationMapper classificationMapper;
|
||||||
private WorkbasketAccessMapper workbasketAccessMapper;
|
private WorkbasketAccessMapper workbasketAccessMapper;
|
||||||
|
private ObjectReferenceMapper objectReferenceMapper;
|
||||||
|
|
||||||
private TaskServiceImpl taskServiceImpl;
|
private TaskServiceImpl taskServiceImpl;
|
||||||
private WorkbasketServiceImpl workbasketServiceImpl;
|
private WorkbasketServiceImpl workbasketServiceImpl;
|
||||||
|
@ -47,11 +49,12 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
this.distributionTargetMapper = session.getMapper(DistributionTargetMapper.class);
|
this.distributionTargetMapper = session.getMapper(DistributionTargetMapper.class);
|
||||||
this.classificationMapper = session.getMapper(ClassificationMapper.class);
|
this.classificationMapper = session.getMapper(ClassificationMapper.class);
|
||||||
this.workbasketAccessMapper = session.getMapper(WorkbasketAccessMapper.class);
|
this.workbasketAccessMapper = session.getMapper(WorkbasketAccessMapper.class);
|
||||||
|
this.objectReferenceMapper = session.getMapper(ObjectReferenceMapper.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public TaskService getTaskService() {
|
public TaskService getTaskService() {
|
||||||
this.taskServiceImpl = new TaskServiceImpl(this, this.taskMapper);
|
this.taskServiceImpl = new TaskServiceImpl(this, this.taskMapper, this.objectReferenceMapper);
|
||||||
return taskServiceImpl;
|
return taskServiceImpl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,13 +85,14 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This method creates the sqlSessionFactory of myBatis. It integrates all
|
* This method creates the sqlSessionFactory of myBatis. It integrates all the
|
||||||
* the SQL mappers
|
* SQL mappers
|
||||||
*
|
*
|
||||||
* @return a {@link SqlSessionFactory}
|
* @return a {@link SqlSessionFactory}
|
||||||
*/
|
*/
|
||||||
private SqlSessionFactory createSqlSessionFactory() {
|
private SqlSessionFactory createSqlSessionFactory() {
|
||||||
Environment environment = new Environment(DEFAULT, this.transactionFactory, taskanaEngineConfiguration.getDatasource());
|
Environment environment = new Environment(DEFAULT, this.transactionFactory,
|
||||||
|
taskanaEngineConfiguration.getDatasource());
|
||||||
Configuration configuration = new Configuration(environment);
|
Configuration configuration = new Configuration(environment);
|
||||||
// add mappers
|
// add mappers
|
||||||
configuration.addMapper(TaskMapper.class);
|
configuration.addMapper(TaskMapper.class);
|
||||||
|
@ -96,6 +100,7 @@ public class TaskanaEngineImpl implements TaskanaEngine {
|
||||||
configuration.addMapper(DistributionTargetMapper.class);
|
configuration.addMapper(DistributionTargetMapper.class);
|
||||||
configuration.addMapper(ClassificationMapper.class);
|
configuration.addMapper(ClassificationMapper.class);
|
||||||
configuration.addMapper(WorkbasketAccessMapper.class);
|
configuration.addMapper(WorkbasketAccessMapper.class);
|
||||||
|
configuration.addMapper(ObjectReferenceMapper.class);
|
||||||
return new SqlSessionFactoryBuilder().build(configuration);
|
return new SqlSessionFactoryBuilder().build(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
package org.taskana.model;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ObjectReference entity
|
||||||
|
*/
|
||||||
|
public class ObjectReference {
|
||||||
|
|
||||||
|
private String id;
|
||||||
|
private String tenantId;
|
||||||
|
private String company;
|
||||||
|
private String system;
|
||||||
|
private String systemInstance;
|
||||||
|
private String type;
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
public String getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(String id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTenantId() {
|
||||||
|
return tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTenantId(String tenantId) {
|
||||||
|
this.tenantId = tenantId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCompany() {
|
||||||
|
return company;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCompany(String company) {
|
||||||
|
this.company = company;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSystem() {
|
||||||
|
return system;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSystem(String system) {
|
||||||
|
this.system = system;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getSystemInstance() {
|
||||||
|
return systemInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSystemInstance(String systemInstance) {
|
||||||
|
this.systemInstance = systemInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getType() {
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(String type) {
|
||||||
|
this.type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getValue() {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setValue(String value) {
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
StringBuffer sb = new StringBuffer();
|
||||||
|
sb.append("ObjectReference(");
|
||||||
|
sb.append("id=" + id);
|
||||||
|
sb.append(", tenantId=" + tenantId);
|
||||||
|
sb.append(", company=" + company);
|
||||||
|
sb.append(", system=" + system);
|
||||||
|
sb.append(", systemInstance=" + systemInstance);
|
||||||
|
sb.append(", type=" + type);
|
||||||
|
sb.append(", value=" + value);
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,7 @@ public class Task {
|
||||||
private String type;
|
private String type;
|
||||||
private String workbasketId;
|
private String workbasketId;
|
||||||
private String owner;
|
private String owner;
|
||||||
|
private ObjectReference primaryObjRef;
|
||||||
private boolean isRead;
|
private boolean isRead;
|
||||||
private boolean isTransferred;
|
private boolean isTransferred;
|
||||||
|
|
||||||
|
@ -144,7 +145,15 @@ public class Task {
|
||||||
public void setOwner(String owner) {
|
public void setOwner(String owner) {
|
||||||
this.owner = owner;
|
this.owner = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ObjectReference getPrimaryObjRef() {
|
||||||
|
return primaryObjRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPrimaryObjRef(ObjectReference primaryObjRef) {
|
||||||
|
this.primaryObjRef = primaryObjRef;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isRead() {
|
public boolean isRead() {
|
||||||
return isRead;
|
return isRead;
|
||||||
}
|
}
|
||||||
|
@ -164,25 +173,25 @@ public class Task {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
StringBuffer sb = new StringBuffer();
|
StringBuffer sb = new StringBuffer();
|
||||||
sb.append("TASK(");
|
sb.append("TASK(");
|
||||||
sb.append("id="+id);
|
sb.append("id=" + id);
|
||||||
sb.append(", tenantId="+tenantId);
|
sb.append(", tenantId=" + tenantId);
|
||||||
sb.append(", created="+created);
|
sb.append(", created=" + created);
|
||||||
sb.append(", claimed="+claimed);
|
sb.append(", claimed=" + claimed);
|
||||||
sb.append(", completed="+completed);
|
sb.append(", completed=" + completed);
|
||||||
sb.append(", modified="+modified);
|
sb.append(", modified=" + modified);
|
||||||
sb.append(", planned="+planned);
|
sb.append(", planned=" + planned);
|
||||||
sb.append(", due="+due);
|
sb.append(", due=" + due);
|
||||||
sb.append(", name="+name);
|
sb.append(", name=" + name);
|
||||||
sb.append(", description="+description);
|
sb.append(", description=" + description);
|
||||||
sb.append(", priority="+priority);
|
sb.append(", priority=" + priority);
|
||||||
sb.append(", state="+state);
|
sb.append(", state=" + state);
|
||||||
sb.append(", type="+type);
|
sb.append(", type=" + type);
|
||||||
sb.append(", workbasketId="+workbasketId);
|
sb.append(", workbasketId=" + workbasketId);
|
||||||
sb.append(", owner="+owner);
|
sb.append(", owner=" + owner);
|
||||||
sb.append(", isRead="+isRead);
|
sb.append(", primaryObjRef=" + primaryObjRef);
|
||||||
sb.append(", isTransferred="+isTransferred);
|
sb.append(", isRead=" + isRead);
|
||||||
|
sb.append(", isTransferred=" + isTransferred);
|
||||||
sb.append(")");
|
sb.append(")");
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
package org.taskana.model.mappings;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.ibatis.annotations.Delete;
|
||||||
|
import org.apache.ibatis.annotations.Insert;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
import org.apache.ibatis.annotations.Result;
|
||||||
|
import org.apache.ibatis.annotations.Results;
|
||||||
|
import org.apache.ibatis.annotations.Select;
|
||||||
|
import org.apache.ibatis.annotations.Update;
|
||||||
|
import org.taskana.model.ObjectReference;
|
||||||
|
|
||||||
|
public interface ObjectReferenceMapper {
|
||||||
|
|
||||||
|
@Select("SELECT ID, TENANT_ID, COMPANY, SYSTEM, SYSTEM_INSTANCE, TYPE, VALUE "
|
||||||
|
+ "FROM OBJECT_REFERENCE "
|
||||||
|
+ "ORDER BY ID")
|
||||||
|
@Results({
|
||||||
|
@Result(property="id", column="ID"),
|
||||||
|
@Result(property="tenantId", column="TENANT_ID"),
|
||||||
|
@Result(property="company", column="COMPANY"),
|
||||||
|
@Result(property="system", column="SYSTEM"),
|
||||||
|
@Result(property="systemInstance", column="SYSTEM_INSTANCE"),
|
||||||
|
@Result(property="type", column="TYPE"),
|
||||||
|
@Result(property="value", column="VALUE")
|
||||||
|
})
|
||||||
|
List<ObjectReference> findAll();
|
||||||
|
|
||||||
|
@Select("SELECT ID, TENANT_ID, COMPANY, SYSTEM, SYSTEM_INSTANCE, TYPE, VALUE "
|
||||||
|
+ "FROM OBJECT_REFERENCE "
|
||||||
|
+ "WHERE ID = #{id}")
|
||||||
|
@Results({
|
||||||
|
@Result(property="id", column="ID"),
|
||||||
|
@Result(property="tenantId", column="TENANT_ID"),
|
||||||
|
@Result(property="company", column="COMPANY"),
|
||||||
|
@Result(property="system", column="SYSTEM"),
|
||||||
|
@Result(property="systemInstance", column="SYSTEM_INSTANCE"),
|
||||||
|
@Result(property="type", column="TYPE"),
|
||||||
|
@Result(property="value", column="VALUE")
|
||||||
|
})
|
||||||
|
ObjectReference findById(@Param("id") String id);
|
||||||
|
|
||||||
|
@Select("SELECT ID, TENANT_ID, COMPANY, SYSTEM, SYSTEM_INSTANCE, TYPE, VALUE "
|
||||||
|
+ "FROM OBJECT_REFERENCE "
|
||||||
|
+ "WHERE TENANT_ID = #{objectReference.tenantId} "
|
||||||
|
+ "AND COMPANY = #{objectReference.company} "
|
||||||
|
+ "AND SYSTEM = #{objectReference.system} "
|
||||||
|
+ "AND SYSTEM_INSTANCE = #{objectReference.systemInstance} "
|
||||||
|
+ "AND TYPE = #{objectReference.type} "
|
||||||
|
+ "AND VALUE = #{objectReference.value}")
|
||||||
|
@Results({
|
||||||
|
@Result(property="id", column="ID"),
|
||||||
|
@Result(property="tenantId", column="TENANT_ID"),
|
||||||
|
@Result(property="company", column="COMPANY"),
|
||||||
|
@Result(property="system", column="SYSTEM"),
|
||||||
|
@Result(property="systemInstance", column="SYSTEM_INSTANCE"),
|
||||||
|
@Result(property="type", column="TYPE"),
|
||||||
|
@Result(property="value", column="VALUE")
|
||||||
|
})
|
||||||
|
ObjectReference findByObjectReference(@Param("objectReference") ObjectReference objectReference);
|
||||||
|
|
||||||
|
@Insert("INSERT INTO OBJECT_REFERENCE (ID, TENANT_ID, COMPANY, SYSTEM, SYSTEM_INSTANCE, TYPE, VALUE) VALUES (#{ref.id}, #{ref.tenantId}, #{ref.company}, #{ref.system}, #{ref.systemInstance}, #{ref.type}, #{ref.value})")
|
||||||
|
void insert(@Param("ref") ObjectReference ref);
|
||||||
|
|
||||||
|
@Update(value = "UPDATE OBJECT_REFERENCE SET TENANT_ID = #{ref.tenantId}, COMPANY = #{ref.company}, SYSTEM = #{ref.system}, SYSTEM_INSTANCE = #{ref.systemInstance}, TYPE = #{ref.type}, VALUE = #{ref.value} WHERE ID = #{ref.id}")
|
||||||
|
void update(@Param("ref") ObjectReference ref);
|
||||||
|
|
||||||
|
@Delete("DELETE FROM OBJECT_REFERENCE WHERE ID = #{id}")
|
||||||
|
void delete(String id);
|
||||||
|
}
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
|
|
||||||
import org.apache.ibatis.annotations.Delete;
|
import org.apache.ibatis.annotations.Delete;
|
||||||
import org.apache.ibatis.annotations.Insert;
|
import org.apache.ibatis.annotations.Insert;
|
||||||
|
import org.apache.ibatis.annotations.One;
|
||||||
import org.apache.ibatis.annotations.Options;
|
import org.apache.ibatis.annotations.Options;
|
||||||
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Param;
|
||||||
import org.apache.ibatis.annotations.Result;
|
import org.apache.ibatis.annotations.Result;
|
||||||
|
@ -12,14 +13,15 @@ import org.apache.ibatis.annotations.Results;
|
||||||
import org.apache.ibatis.annotations.Select;
|
import org.apache.ibatis.annotations.Select;
|
||||||
import org.apache.ibatis.annotations.Update;
|
import org.apache.ibatis.annotations.Update;
|
||||||
import org.taskana.model.DueWorkbasketCounter;
|
import org.taskana.model.DueWorkbasketCounter;
|
||||||
|
import org.taskana.model.ObjectReference;
|
||||||
import org.taskana.model.Task;
|
import org.taskana.model.Task;
|
||||||
import org.taskana.model.TaskStateCounter;
|
|
||||||
import org.taskana.model.TaskState;
|
import org.taskana.model.TaskState;
|
||||||
|
import org.taskana.model.TaskStateCounter;
|
||||||
|
|
||||||
public interface TaskMapper {
|
public interface TaskMapper {
|
||||||
|
|
||||||
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, IS_READ, IS_TRANSFERRED "
|
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
|
||||||
+ "FROM task "
|
+ "FROM TASK "
|
||||||
+ "WHERE ID = #{id}")
|
+ "WHERE ID = #{id}")
|
||||||
@Results(value = {
|
@Results(value = {
|
||||||
@Result(property = "id", column = "ID"),
|
@Result(property = "id", column = "ID"),
|
||||||
|
@ -37,12 +39,13 @@ public interface TaskMapper {
|
||||||
@Result(property = "type", column = "TYPE"),
|
@Result(property = "type", column = "TYPE"),
|
||||||
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
||||||
@Result(property = "owner", column = "OWNER"),
|
@Result(property = "owner", column = "OWNER"),
|
||||||
|
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select="org.taskana.model.mappings.ObjectReferenceMapper.findById")),
|
||||||
@Result(property = "isRead", column = "IS_READ"),
|
@Result(property = "isRead", column = "IS_READ"),
|
||||||
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
||||||
Task findById(String id);
|
Task findById(@Param("id") String id);
|
||||||
|
|
||||||
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, IS_READ, IS_TRANSFERRED "
|
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
|
||||||
+ "FROM task "
|
+ "FROM TASK "
|
||||||
+ "WHERE WORKBASKETID = #{workbasketId} "
|
+ "WHERE WORKBASKETID = #{workbasketId} "
|
||||||
+ "ORDER BY ID")
|
+ "ORDER BY ID")
|
||||||
@Results(value = {
|
@Results(value = {
|
||||||
|
@ -61,13 +64,14 @@ public interface TaskMapper {
|
||||||
@Result(property = "type", column = "TYPE"),
|
@Result(property = "type", column = "TYPE"),
|
||||||
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
||||||
@Result(property = "owner", column = "OWNER"),
|
@Result(property = "owner", column = "OWNER"),
|
||||||
|
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select="org.taskana.model.mappings.ObjectReferenceMapper.findById")),
|
||||||
@Result(property = "isRead", column = "IS_READ"),
|
@Result(property = "isRead", column = "IS_READ"),
|
||||||
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
||||||
List<Task> findByWorkBasketId(String workbasketId);
|
List<Task> findByWorkBasketId(@Param("workbasketId") String workbasketId);
|
||||||
|
|
||||||
@Select("<script>"
|
@Select("<script>"
|
||||||
+ "SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, IS_READ, IS_TRANSFERRED "
|
+ "SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
|
||||||
+ "FROM task "
|
+ "FROM TASK "
|
||||||
+ "WHERE WORKBASKETID IN (<foreach item='item' collection='workbasketIds' separator=','>#{item}</foreach>) "
|
+ "WHERE WORKBASKETID IN (<foreach item='item' collection='workbasketIds' separator=','>#{item}</foreach>) "
|
||||||
+ "AND STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) "
|
+ "AND STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) "
|
||||||
+ "ORDER BY ID"
|
+ "ORDER BY ID"
|
||||||
|
@ -88,13 +92,14 @@ public interface TaskMapper {
|
||||||
@Result(property = "type", column = "TYPE"),
|
@Result(property = "type", column = "TYPE"),
|
||||||
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
||||||
@Result(property = "owner", column = "OWNER"),
|
@Result(property = "owner", column = "OWNER"),
|
||||||
|
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select="org.taskana.model.mappings.ObjectReferenceMapper.findById")),
|
||||||
@Result(property = "isRead", column = "IS_READ"),
|
@Result(property = "isRead", column = "IS_READ"),
|
||||||
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
||||||
List<Task> findByWorkbasketIdsAndStates(@Param("workbasketIds") List<String> workbasketIds, @Param("states") List<TaskState> states);
|
List<Task> findByWorkbasketIdsAndStates(@Param("workbasketIds") List<String> workbasketIds, @Param("states") List<TaskState> states);
|
||||||
|
|
||||||
@Select("<script>"
|
@Select("<script>"
|
||||||
+ "SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, IS_READ, IS_TRANSFERRED "
|
+ "SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
|
||||||
+ "FROM task "
|
+ "FROM TASK "
|
||||||
+ "WHERE STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) "
|
+ "WHERE STATE IN (<foreach item='item' collection='states' separator=',' >#{item}</foreach>) "
|
||||||
+ "ORDER BY ID"
|
+ "ORDER BY ID"
|
||||||
+ "</script>")
|
+ "</script>")
|
||||||
|
@ -114,17 +119,38 @@ public interface TaskMapper {
|
||||||
@Result(property = "type", column = "TYPE"),
|
@Result(property = "type", column = "TYPE"),
|
||||||
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
||||||
@Result(property = "owner", column = "OWNER"),
|
@Result(property = "owner", column = "OWNER"),
|
||||||
|
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select="org.taskana.model.mappings.ObjectReferenceMapper.findById")),
|
||||||
@Result(property = "isRead", column = "IS_READ"),
|
@Result(property = "isRead", column = "IS_READ"),
|
||||||
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
||||||
List<Task> findByStates(@Param("states") List<TaskState> states);
|
List<Task> findByStates(@Param("states") List<TaskState> states);
|
||||||
|
|
||||||
@Select("SELECT * FROM TASK")
|
@Select("SELECT ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED "
|
||||||
|
+ "FROM TASK ")
|
||||||
|
@Results(value = {
|
||||||
|
@Result(property = "id", column = "ID"),
|
||||||
|
@Result(property = "tenantId", column = "TENANT_ID"),
|
||||||
|
@Result(property = "created", column = "CREATED"),
|
||||||
|
@Result(property = "claimed", column = "CLAIMED"),
|
||||||
|
@Result(property = "completed", column = "COMPLETED"),
|
||||||
|
@Result(property = "modified", column = "MODIFIED"),
|
||||||
|
@Result(property = "planned", column = "PLANNED"),
|
||||||
|
@Result(property = "due", column = "DUE"),
|
||||||
|
@Result(property = "name", column = "NAME"),
|
||||||
|
@Result(property = "description", column = "DESCRIPTION"),
|
||||||
|
@Result(property = "priority", column = "PRIORITY"),
|
||||||
|
@Result(property = "state", column = "STATE"),
|
||||||
|
@Result(property = "type", column = "TYPE"),
|
||||||
|
@Result(property = "workbasketId", column = "WORKBASKETID"),
|
||||||
|
@Result(property = "owner", column = "OWNER"),
|
||||||
|
@Result(property = "primaryObjRef", column = "PRIMARY_OBJ_REF_ID", javaType = ObjectReference.class, one = @One(select="org.taskana.model.mappings.ObjectReferenceMapper.findById")),
|
||||||
|
@Result(property = "isRead", column = "IS_READ"),
|
||||||
|
@Result(property = "isTransferred", column = "IS_TRANSFERRED")})
|
||||||
List<Task> findAll();
|
List<Task> findAll();
|
||||||
|
|
||||||
@Select("<script>"
|
@Select("<script>"
|
||||||
+ "SELECT STATE, COUNT (STATE) as counter "
|
+ "SELECT STATE, COUNT (STATE) as counter "
|
||||||
+ "FROM TASK "
|
+ "FROM TASK "
|
||||||
+ "WHERE STATE IN (<foreach collection='status' item='state' separator=','>#{item}</foreach>) "
|
+ "WHERE STATE IN (<foreach collection='status' item='state' separator=','>#{state}</foreach>) "
|
||||||
+ "GROUP BY STATE"
|
+ "GROUP BY STATE"
|
||||||
+ "</script>")
|
+ "</script>")
|
||||||
@Results({
|
@Results({
|
||||||
|
@ -156,11 +182,12 @@ public interface TaskMapper {
|
||||||
})
|
})
|
||||||
List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate, @Param("status") List<TaskState> states);
|
List<DueWorkbasketCounter> getTaskCountByWorkbasketIdAndDaysInPastAndState(@Param("fromDate") Date fromDate, @Param("status") List<TaskState> states);
|
||||||
|
|
||||||
@Insert("INSERT INTO TASK(ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, IS_READ, IS_TRANSFERRED) VALUES(#{id}, #{tenantId}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{type}, #{workbasketId}, #{owner}, #{isRead}, #{isTransferred})")
|
@Insert("INSERT INTO TASK(ID, TENANT_ID, CREATED, CLAIMED, COMPLETED, MODIFIED, PLANNED, DUE, NAME, DESCRIPTION, PRIORITY, STATE, TYPE, WORKBASKETID, OWNER, PRIMARY_OBJ_REF_ID, IS_READ, IS_TRANSFERRED) "
|
||||||
|
+ "VALUES(#{id}, #{tenantId}, #{created}, #{claimed}, #{completed}, #{modified}, #{planned}, #{due}, #{name}, #{description}, #{priority}, #{state}, #{type}, #{workbasketId}, #{owner}, #{primaryObjRef.id}, #{isRead}, #{isTransferred})")
|
||||||
@Options(keyProperty = "id", keyColumn="ID")
|
@Options(keyProperty = "id", keyColumn="ID")
|
||||||
void insert(Task task);
|
void insert(Task task);
|
||||||
|
|
||||||
@Update("UPDATE TASK SET TENANT_ID = #{tenantId}, CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, TYPE = #{type}, WORKBASKETID = #{workbasketId}, OWNER = #{owner}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred} WHERE ID = #{id}")
|
@Update("UPDATE TASK SET TENANT_ID = #{tenantId}, CLAIMED = #{claimed}, COMPLETED = #{completed}, MODIFIED = #{modified}, PLANNED = #{planned}, DUE = #{due}, NAME = #{name}, DESCRIPTION = #{description}, PRIORITY = #{priority}, STATE = #{state}, TYPE = #{type}, WORKBASKETID = #{workbasketId}, OWNER = #{owner}, PRIMARY_OBJ_REF_ID = #{primaryObjRef.id}, IS_READ = #{isRead}, IS_TRANSFERRED = #{isTransferred} WHERE ID = #{id}")
|
||||||
void update(Task task);
|
void update(Task task);
|
||||||
|
|
||||||
@Delete("DELETE FROM TASK WHERE ID = #{id}")
|
@Delete("DELETE FROM TASK WHERE ID = #{id}")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
CREATE TABLE IF NOT EXISTS TASK(
|
CREATE TABLE IF NOT EXISTS TASK(
|
||||||
ID varchar(255) NOT NULL,
|
ID varchar(36) NOT NULL,
|
||||||
TENANT_ID varchar(255) NULL,
|
TENANT_ID varchar(36) NULL,
|
||||||
CREATED TIMESTAMP NULL,
|
CREATED TIMESTAMP NULL,
|
||||||
CLAIMED TIMESTAMP NULL,
|
CLAIMED TIMESTAMP NULL,
|
||||||
COMPLETED TIMESTAMP NULL,
|
COMPLETED TIMESTAMP NULL,
|
||||||
|
@ -12,16 +12,17 @@ CREATE TABLE IF NOT EXISTS TASK(
|
||||||
PRIORITY INT NULL,
|
PRIORITY INT NULL,
|
||||||
STATE varchar(20) NULL,
|
STATE varchar(20) NULL,
|
||||||
TYPE varchar(255) NULL,
|
TYPE varchar(255) NULL,
|
||||||
WORKBASKETID varchar(255) NULL,
|
WORKBASKETID varchar(36) NULL,
|
||||||
OWNER varchar(255) NULL,
|
OWNER varchar(255) NULL,
|
||||||
|
PRIMARY_OBJ_REF_ID varchar(36) NULL,
|
||||||
IS_READ bit NOT NULL,
|
IS_READ bit NOT NULL,
|
||||||
IS_TRANSFERRED bit NOT NULL,
|
IS_TRANSFERRED bit NOT NULL,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS WORKBASKET(
|
CREATE TABLE IF NOT EXISTS WORKBASKET(
|
||||||
ID varchar(255) NOT NULL,
|
ID varchar(36) NOT NULL,
|
||||||
TENANT_ID varchar(255) NULL,
|
TENANT_ID varchar(36) NULL,
|
||||||
CREATED TIMESTAMP NULL,
|
CREATED TIMESTAMP NULL,
|
||||||
MODIFIED TIMESTAMP NULL,
|
MODIFIED TIMESTAMP NULL,
|
||||||
NAME varchar(255) NULL,
|
NAME varchar(255) NULL,
|
||||||
|
@ -32,17 +33,17 @@ CREATE TABLE IF NOT EXISTS WORKBASKET(
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS DISTRIBUTION_TARGETS(
|
CREATE TABLE IF NOT EXISTS DISTRIBUTION_TARGETS(
|
||||||
SOURCE_ID varchar(255) NOT NULL,
|
SOURCE_ID varchar(36) NOT NULL,
|
||||||
TARGET_ID varchar(255) NOT NULL,
|
TARGET_ID varchar(36) NOT NULL,
|
||||||
PRIMARY KEY (SOURCE_ID, TARGET_ID)
|
PRIMARY KEY (SOURCE_ID, TARGET_ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS CLASSIFICATION(
|
CREATE TABLE IF NOT EXISTS CLASSIFICATION(
|
||||||
ID varchar(255) NOT NULL,
|
ID varchar(36) NOT NULL,
|
||||||
TENANT_ID varchar(255) NULL,
|
TENANT_ID varchar(36) NULL,
|
||||||
PARENT_CLASSIFICATION_ID varchar(255),
|
PARENT_CLASSIFICATION_ID varchar(255),
|
||||||
CATEGORY varchar(255),
|
CATEGORY varchar(255),
|
||||||
TYPE varchar(255),
|
TYPE varchar(255),
|
||||||
CREATED DATE NULL,
|
CREATED DATE NULL,
|
||||||
MODIFIED DATE NULL,
|
MODIFIED DATE NULL,
|
||||||
NAME varchar(255) NULL,
|
NAME varchar(255) NULL,
|
||||||
|
@ -53,8 +54,8 @@ CREATE TABLE IF NOT EXISTS CLASSIFICATION(
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS WORKBASKET_ACCESS_LIST(
|
CREATE TABLE IF NOT EXISTS WORKBASKET_ACCESS_LIST(
|
||||||
ID varchar(255) NOT NULL,
|
ID varchar(36) NOT NULL,
|
||||||
WORKBASKET_ID varchar(255) NOT NULL,
|
WORKBASKET_ID varchar(36) NOT NULL,
|
||||||
USER_ID varchar(255) NULL,
|
USER_ID varchar(255) NULL,
|
||||||
GROUP_ID varchar(255) NULL,
|
GROUP_ID varchar(255) NULL,
|
||||||
READ bit NOT NULL,
|
READ bit NOT NULL,
|
||||||
|
@ -64,3 +65,13 @@ CREATE TABLE IF NOT EXISTS WORKBASKET_ACCESS_LIST(
|
||||||
DISTRIBUTE bit NOT NULL,
|
DISTRIBUTE bit NOT NULL,
|
||||||
PRIMARY KEY (ID)
|
PRIMARY KEY (ID)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS OBJECT_REFERENCE(
|
||||||
|
ID varchar(36) NOT NULL,
|
||||||
|
TENANT_ID varchar(36) NULL,
|
||||||
|
COMPANY varchar(32) NOT NULL,
|
||||||
|
SYSTEM varchar(32) NOT NULL,
|
||||||
|
SYSTEM_INSTANCE varchar(32) NOT NULL,
|
||||||
|
TYPE varchar(32) NOT NULL,
|
||||||
|
VALUE varchar(128) NOT NULL
|
||||||
|
);
|
||||||
|
|
|
@ -19,9 +19,11 @@ import org.taskana.configuration.TaskanaEngineConfiguration;
|
||||||
import org.taskana.exceptions.NotAuthorizedException;
|
import org.taskana.exceptions.NotAuthorizedException;
|
||||||
import org.taskana.exceptions.TaskNotFoundException;
|
import org.taskana.exceptions.TaskNotFoundException;
|
||||||
import org.taskana.exceptions.WorkbasketNotFoundException;
|
import org.taskana.exceptions.WorkbasketNotFoundException;
|
||||||
|
import org.taskana.model.ObjectReference;
|
||||||
import org.taskana.model.Task;
|
import org.taskana.model.Task;
|
||||||
import org.taskana.model.TaskState;
|
import org.taskana.model.TaskState;
|
||||||
import org.taskana.model.Workbasket;
|
import org.taskana.model.Workbasket;
|
||||||
|
import org.taskana.model.mappings.ObjectReferenceMapper;
|
||||||
import org.taskana.model.mappings.TaskMapper;
|
import org.taskana.model.mappings.TaskMapper;
|
||||||
|
|
||||||
@RunWith(MockitoJUnitRunner.class)
|
@RunWith(MockitoJUnitRunner.class)
|
||||||
|
@ -37,6 +39,8 @@ public class TaskServiceImplTest {
|
||||||
WorkbasketServiceImpl workbasketServiceImpl;
|
WorkbasketServiceImpl workbasketServiceImpl;
|
||||||
@Mock
|
@Mock
|
||||||
TaskMapper taskMapper;
|
TaskMapper taskMapper;
|
||||||
|
@Mock
|
||||||
|
ObjectReferenceMapper objectReferenceMapper;
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCreateSimpleTask() throws NotAuthorizedException {
|
public void testCreateSimpleTask() throws NotAuthorizedException {
|
||||||
|
@ -99,13 +103,14 @@ public class TaskServiceImplTest {
|
||||||
tasks.add(createUnitTestTask("2", "Unit Test Task 2", "1"));
|
tasks.add(createUnitTestTask("2", "Unit Test Task 2", "1"));
|
||||||
tasks.add(createUnitTestTask("3", "Unit Test Task 3", "1"));
|
tasks.add(createUnitTestTask("3", "Unit Test Task 3", "1"));
|
||||||
Mockito.when(taskMapper.findByWorkBasketId("1")).thenReturn(tasks);
|
Mockito.when(taskMapper.findByWorkBasketId("1")).thenReturn(tasks);
|
||||||
|
|
||||||
List<Task> list = taskServiceImpl.getTasksForWorkbasket("1");
|
List<Task> list = taskServiceImpl.getTasksForWorkbasket("1");
|
||||||
Assert.assertEquals(list.size(), 3);
|
Assert.assertEquals(list.size(), 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTransferTaskZuDestinationWorkbasket() throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
public void testTransferTaskZuDestinationWorkbasket()
|
||||||
|
throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
||||||
registerBasicMocks(false);
|
registerBasicMocks(false);
|
||||||
Workbasket workbasket2 = createWorkbasket2();
|
Workbasket workbasket2 = createWorkbasket2();
|
||||||
Mockito.when(workbasketServiceImpl.getWorkbasket("2")).thenReturn(workbasket2);
|
Mockito.when(workbasketServiceImpl.getWorkbasket("2")).thenReturn(workbasket2);
|
||||||
|
@ -116,15 +121,17 @@ public class TaskServiceImplTest {
|
||||||
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "1");
|
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "1");
|
||||||
taskServiceImpl.transfer(task.getId(), "2");
|
taskServiceImpl.transfer(task.getId(), "2");
|
||||||
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "2");
|
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "2");
|
||||||
|
|
||||||
Assert.assertTrue(task.isTransferred());
|
Assert.assertTrue(task.isTransferred());
|
||||||
Assert.assertFalse(task.isRead());
|
Assert.assertFalse(task.isRead());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = WorkbasketNotFoundException.class)
|
@Test(expected = WorkbasketNotFoundException.class)
|
||||||
public void testTransferFailsIfDestinationWorkbasketDoesNotExist_withSecurityDisabled() throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
public void testTransferFailsIfDestinationWorkbasketDoesNotExist_withSecurityDisabled()
|
||||||
|
throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
||||||
registerBasicMocks(false);
|
registerBasicMocks(false);
|
||||||
Mockito.doThrow(WorkbasketNotFoundException.class).when(workbasketServiceImpl).checkAuthorization(eq("invalidWorkbasketId"), any());
|
Mockito.doThrow(WorkbasketNotFoundException.class).when(workbasketServiceImpl)
|
||||||
|
.checkAuthorization(eq("invalidWorkbasketId"), any());
|
||||||
|
|
||||||
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
||||||
|
|
||||||
|
@ -133,24 +140,65 @@ public class TaskServiceImplTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expected = WorkbasketNotFoundException.class)
|
@Test(expected = WorkbasketNotFoundException.class)
|
||||||
public void testTransferFailsIfDestinationWorkbasketDoesNotExist_withSecurityEnabled() throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
public void testTransferFailsIfDestinationWorkbasketDoesNotExist_withSecurityEnabled()
|
||||||
|
throws TaskNotFoundException, WorkbasketNotFoundException, NotAuthorizedException {
|
||||||
registerBasicMocks(true);
|
registerBasicMocks(true);
|
||||||
Mockito.doThrow(WorkbasketNotFoundException.class).when(workbasketServiceImpl).checkAuthorization(eq("invalidWorkbasketId"), any());
|
Mockito.doThrow(WorkbasketNotFoundException.class).when(workbasketServiceImpl)
|
||||||
|
.checkAuthorization(eq("invalidWorkbasketId"), any());
|
||||||
|
|
||||||
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
||||||
|
|
||||||
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "1");
|
Assert.assertEquals(taskServiceImpl.getTaskById(task.getId()).getWorkbasketId(), "1");
|
||||||
taskServiceImpl.transfer(task.getId(), "invalidWorkbasketId");
|
taskServiceImpl.transfer(task.getId(), "invalidWorkbasketId");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void should_setTheReadFlag_when_taskIsRead() throws TaskNotFoundException {
|
public void should_setTheReadFlag_when_taskIsRead() throws TaskNotFoundException {
|
||||||
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
||||||
|
|
||||||
Task readTask = taskServiceImpl.setTaskRead("1", true);
|
Task readTask = taskServiceImpl.setTaskRead("1", true);
|
||||||
Assert.assertTrue(readTask.isRead());
|
Assert.assertTrue(readTask.isRead());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_InsertObjectReference_when_TaskIsCreated() throws NotAuthorizedException {
|
||||||
|
Mockito.when(taskanaEngine.getWorkbasketService()).thenReturn(workbasketServiceImpl);
|
||||||
|
Mockito.doNothing().when(workbasketServiceImpl).checkAuthorization(any(), any());
|
||||||
|
Mockito.when(objectReferenceMapper.findByObjectReference(any())).thenReturn(null);
|
||||||
|
|
||||||
|
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
||||||
|
ObjectReference primaryObjRef = new ObjectReference();
|
||||||
|
primaryObjRef.setSystem("Sol");
|
||||||
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
|
Task createdTask = taskServiceImpl.create(task);
|
||||||
|
|
||||||
|
Assert.assertNotNull(createdTask.getPrimaryObjRef());
|
||||||
|
Assert.assertNotNull(createdTask.getPrimaryObjRef().getId());
|
||||||
|
Assert.assertEquals("Sol", createdTask.getPrimaryObjRef().getSystem());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void should_LinkObjectReference_when_TaskIsCreated() throws NotAuthorizedException {
|
||||||
|
Mockito.when(taskanaEngine.getWorkbasketService()).thenReturn(workbasketServiceImpl);
|
||||||
|
Mockito.doNothing().when(workbasketServiceImpl).checkAuthorization(any(), any());
|
||||||
|
|
||||||
|
Task task = createUnitTestTask("1", "Unit Test Task 1", "1");
|
||||||
|
ObjectReference primaryObjRef = new ObjectReference();
|
||||||
|
primaryObjRef.setSystem("Sol");
|
||||||
|
task.setPrimaryObjRef(primaryObjRef);
|
||||||
|
|
||||||
|
ObjectReference returnPrimaryObjRef = new ObjectReference();
|
||||||
|
returnPrimaryObjRef.setId("1");
|
||||||
|
returnPrimaryObjRef.setSystem("Sol");
|
||||||
|
|
||||||
|
Mockito.when(objectReferenceMapper.findByObjectReference(any())).thenReturn(returnPrimaryObjRef);
|
||||||
|
Task createdTask = taskServiceImpl.create(task);
|
||||||
|
|
||||||
|
Assert.assertNotNull(createdTask.getPrimaryObjRef());
|
||||||
|
Assert.assertEquals("1", createdTask.getPrimaryObjRef().getId());
|
||||||
|
Assert.assertEquals("Sol", createdTask.getPrimaryObjRef().getSystem());
|
||||||
|
}
|
||||||
|
|
||||||
private Task createUnitTestTask(String id, String name, String workbasketId) {
|
private Task createUnitTestTask(String id, String name, String workbasketId) {
|
||||||
Task task = new Task();
|
Task task = new Task();
|
||||||
task.setId(id);
|
task.setId(id);
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class TaskServiceImplTransactionTest {
|
||||||
public void testStartTransactionFail()
|
public void testStartTransactionFail()
|
||||||
throws FileNotFoundException, SQLException, TaskNotFoundException, NotAuthorizedException {
|
throws FileNotFoundException, SQLException, TaskNotFoundException, NotAuthorizedException {
|
||||||
JdbcDataSource ds = new JdbcDataSource();
|
JdbcDataSource ds = new JdbcDataSource();
|
||||||
ds.setURL("jdbc:h2:mem:test-db-taskservice-int2");
|
ds.setURL("jdbc:h2:~/data/test-db-taskservice-trans2");
|
||||||
ds.setPassword("sa");
|
ds.setPassword("sa");
|
||||||
ds.setUser("sa");
|
ds.setUser("sa");
|
||||||
TaskanaEngineConfiguration taskanaEngineConfiguration = new TaskanaEngineConfiguration(ds, false, false);
|
TaskanaEngineConfiguration taskanaEngineConfiguration = new TaskanaEngineConfiguration(ds, false, false);
|
||||||
|
|
|
@ -6,6 +6,8 @@ import java.util.List;
|
||||||
|
|
||||||
import javax.security.auth.login.LoginException;
|
import javax.security.auth.login.LoginException;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
|
@ -27,6 +29,8 @@ import org.taskana.model.TaskState;
|
||||||
@RequestMapping(path = "/v1/tasks", produces = { MediaType.APPLICATION_JSON_VALUE })
|
@RequestMapping(path = "/v1/tasks", produces = { MediaType.APPLICATION_JSON_VALUE })
|
||||||
public class TaskController {
|
public class TaskController {
|
||||||
|
|
||||||
|
private static final Logger logger = LoggerFactory.getLogger(TaskController.class);
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TaskService taskService;
|
private TaskService taskService;
|
||||||
|
|
||||||
|
@ -112,6 +116,7 @@ public class TaskController {
|
||||||
Task createdTask = taskService.create(task);
|
Task createdTask = taskService.create(task);
|
||||||
return ResponseEntity.status(HttpStatus.CREATED).body(createdTask);
|
return ResponseEntity.status(HttpStatus.CREATED).body(createdTask);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
logger.error("Something went wrong: ", e);
|
||||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -122,6 +127,7 @@ public class TaskController {
|
||||||
Task updatedTask = taskService.transfer(taskId, workbasketId);
|
Task updatedTask = taskService.transfer(taskId, workbasketId);
|
||||||
return ResponseEntity.status(HttpStatus.CREATED).body(updatedTask);
|
return ResponseEntity.status(HttpStatus.CREATED).body(updatedTask);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
logger.error("Something went wrong: ", e);
|
||||||
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ public class SampleDataGenerator {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(SampleDataGenerator.class);
|
private static final Logger logger = LoggerFactory.getLogger(SampleDataGenerator.class);
|
||||||
private ScriptRunner runner;
|
private ScriptRunner runner;
|
||||||
|
|
||||||
private static final String SQL = "/sql";
|
private static final String SQL = "/sql";
|
||||||
private static final String TEST_DATA = "/sample-data";
|
private static final String TEST_DATA = "/sample-data";
|
||||||
private static final String TASK = SQL + TEST_DATA + "/task.sql";
|
private static final String TASK = SQL + TEST_DATA + "/task.sql";
|
||||||
|
@ -22,17 +22,17 @@ public class SampleDataGenerator {
|
||||||
private static final String DISTRIBUTION_TARGETS = SQL + TEST_DATA + "/distribution-targets.sql";
|
private static final String DISTRIBUTION_TARGETS = SQL + TEST_DATA + "/distribution-targets.sql";
|
||||||
private static final String WORKBASKET_ACCESS_LIST = SQL + TEST_DATA + "/workbasket-access-list.sql";
|
private static final String WORKBASKET_ACCESS_LIST = SQL + TEST_DATA + "/workbasket-access-list.sql";
|
||||||
private static final String CATEGORY = SQL + TEST_DATA + "/classification.sql";
|
private static final String CATEGORY = SQL + TEST_DATA + "/classification.sql";
|
||||||
|
private static final String OBJECT_REFERENCE = SQL + TEST_DATA + "/object-reference.sql";
|
||||||
|
|
||||||
public SampleDataGenerator(DataSource dataSource) throws SQLException {
|
public SampleDataGenerator(DataSource dataSource) throws SQLException {
|
||||||
if (logger.isDebugEnabled()) {
|
if (logger.isDebugEnabled()) {
|
||||||
logger.debug(dataSource.getConnection().getMetaData().toString());
|
logger.debug(dataSource.getConnection().getMetaData().toString());
|
||||||
}
|
}
|
||||||
runner = new ScriptRunner(dataSource.getConnection());
|
runner = new ScriptRunner(dataSource.getConnection());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates sample data for manual testing purposes.
|
* Creates sample data for manual testing purposes.
|
||||||
*
|
*
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
|
@ -52,6 +52,7 @@ public class SampleDataGenerator {
|
||||||
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DISTRIBUTION_TARGETS)));
|
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(DISTRIBUTION_TARGETS)));
|
||||||
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(CATEGORY)));
|
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(CATEGORY)));
|
||||||
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(WORKBASKET_ACCESS_LIST)));
|
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(WORKBASKET_ACCESS_LIST)));
|
||||||
|
runner.runScript(new InputStreamReader(this.getClass().getResourceAsStream(OBJECT_REFERENCE)));
|
||||||
|
|
||||||
runner.closeConnection();
|
runner.closeConnection();
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
INSERT INTO DISTRIBUTION_TARGETS VALUES ('1','2');
|
INSERT INTO DISTRIBUTION_TARGETS VALUES ('1','2');
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
INSERT INTO OBJECT_REFERENCE VALUES ('1', 'Tenant1', 'Company1', 'System1', 'Instance1', 'Type1', 'Value1');
|
||||||
|
INSERT INTO OBJECT_REFERENCE VALUES ('2', 'Tenant2', 'Company2', 'System2', 'Instance2', 'Type2', 'Value2');
|
||||||
|
INSERT INTO OBJECT_REFERENCE VALUES ('3', 'Tenant3', 'Company3', 'System3', 'Instance3', 'Type3', 'Value3');
|
|
@ -1,17 +1,17 @@
|
||||||
|
|
||||||
INSERT INTO TASK VALUES('1', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '1', 'Stefan', false, false);
|
INSERT INTO TASK VALUES('1', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task1', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '1', 'Stefan', '1', false, false);
|
||||||
INSERT INTO TASK VALUES('2', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '1', 'Frank', false, false);
|
INSERT INTO TASK VALUES('2', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task2', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '1', 'Frank', '2', false, false);
|
||||||
INSERT INTO TASK VALUES('3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task3', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '1', 'Stefan', true, false);
|
INSERT INTO TASK VALUES('3', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task3', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '1', 'Stefan', '3', true, false);
|
||||||
INSERT INTO TASK VALUES('4', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task4', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '1', 'Frank', false, true);
|
INSERT INTO TASK VALUES('4', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task4', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '1', 'Frank', '1', false, true);
|
||||||
INSERT INTO TASK VALUES('5', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '1', 'Stefan', false, false);
|
INSERT INTO TASK VALUES('5', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task5', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '1', 'Stefan', '2', false, false);
|
||||||
INSERT INTO TASK VALUES('6', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '1', 'Frank', false, false);
|
INSERT INTO TASK VALUES('6', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '1', 'Frank', '3', false, false);
|
||||||
|
|
||||||
INSERT INTO TASK VALUES('7', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task7', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '2', 'Stefan', false, false);
|
INSERT INTO TASK VALUES('7', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task7', 'Lorem ipsum dolor sit amet.', 1, 'READY', 'Task', '2', 'Stefan', '1', false, false);
|
||||||
INSERT INTO TASK VALUES('8', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task8', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '2', 'Frank', false, false);
|
INSERT INTO TASK VALUES('8', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task8', 'Lorem ipsum dolor sit amet. ', 1, 'READY', 'Task', '2', 'Frank', '2', false, false);
|
||||||
INSERT INTO TASK VALUES('9', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '2', 'Stefan', true, false);
|
INSERT INTO TASK VALUES('9', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task9', 'Lorem ipsum dolor sit amet. ', 1, 'CLAIMED', 'Task', '2', 'Stefan', '3', true, false);
|
||||||
INSERT INTO TASK VALUES('10', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '2', 'Frank', false, false);
|
INSERT INTO TASK VALUES('10', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task10', 'Lorem ipsum dolor sit amet.', 1, 'CLAIMED', 'Task', '2', 'Frank', '1', false, false);
|
||||||
INSERT INTO TASK VALUES('11', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task11', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '2', 'Stefan', false, false);
|
INSERT INTO TASK VALUES('11', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task11', 'Lorem ipsum dolor sit amet. ', 1, 'COMPLETED', 'Task', '2', 'Stefan', '2', false, false);
|
||||||
INSERT INTO TASK VALUES('12', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '2', 'Frank', false, false);
|
INSERT INTO TASK VALUES('12', '1', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet.', 1, 'COMPLETED', 'Task', '2', 'Frank', '3', false, false);
|
||||||
|
|
||||||
INSERT INTO TASK VALUES('13', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit amet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', 'Task', '2', 'Frank', false, false);
|
INSERT INTO TASK VALUES('13', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task12', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus massa turpis, pellentesque ut libero sit amet, malesuada suscipit dolor. Sed volutpat euismod felis sit amet molestie. Fusce ornare purus dui. ', 1, 'READY', 'Task', '2', 'Frank', '1', false, false);
|
||||||
INSERT INTO TASK VALUES('14', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', 'Task', '1', 'Frank', false, false);
|
INSERT INTO TASK VALUES('14', '1', CURRENT_TIMESTAMP, null, null, CURRENT_TIMESTAMP, null, CURRENT_TIMESTAMP, 'Task6', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce sagittis vulputate nibh ut malesuada. Etiam ac dictum tellus, nec cursus nunc. Curabitur velit eros, feugiat volutpat laoreet vitae, cursus eu dui. Nulla ut purus sem. Vivamus aliquet odio vitae erat cursus, vitae mattis urna mollis. Nam quam tellus, auctor id volutpat congue, viverra vitae ante. Duis nisi dolor, elementum et mattis at, maximus id velit. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Duis eu condimentum risus. Praesent libero velit, facilisis sit amet maximus non, scelerisque ullamcorper leo. Ut sit amet iaculis eros. Mauris sagittis nibh lacus, at facilisis magna suscipit at. Aliquam finibus tempor odio id commodo. Vivamus aliquam, justo id porta imperdiet, mi.', 1, 'READY', 'Task', '1', 'Frank', '2', false, false);
|
||||||
|
|
Loading…
Reference in New Issue