working on project list: introducing task list
This commit is contained in:
@@ -8,5 +8,7 @@ public class Constants {
|
||||
public static final String CHILDREN = "children";
|
||||
public static final String ESTIMATED_TIMES = "estimated_times";
|
||||
public static final String TABLE_TASKS = "tasks";
|
||||
public static final String FIELD_TASKS = "tasks";
|
||||
public static final String TABLE_TASKS_USERS = "tasks_users";
|
||||
public static final String TASKS = "tasks";
|
||||
public static final String TASK_ID = "task_id";
|
||||
}
|
||||
|
||||
@@ -2,38 +2,63 @@
|
||||
package de.srsoftware.umbrella.task;
|
||||
|
||||
|
||||
import static de.srsoftware.tools.jdbc.Condition.in;
|
||||
import static de.srsoftware.tools.jdbc.Condition.*;
|
||||
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||
import static de.srsoftware.tools.jdbc.Query.select;
|
||||
import static de.srsoftware.umbrella.core.Constants.PROJECT_ID;
|
||||
import static de.srsoftware.umbrella.core.Constants.*;
|
||||
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR;
|
||||
import static de.srsoftware.umbrella.task.Constants.TABLE_TASKS;
|
||||
import static de.srsoftware.umbrella.task.Constants.*;
|
||||
import static java.lang.System.Logger.Level.WARNING;
|
||||
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.core.model.Task;
|
||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||
import java.sql.Connection;
|
||||
import java.sql.SQLException;
|
||||
import java.util.Collection;
|
||||
import java.util.HashSet;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
|
||||
public class SqliteDb implements TaskDb {
|
||||
|
||||
private static final System.Logger LOG = System.getLogger("TaskDb");
|
||||
private final Connection db;
|
||||
|
||||
public SqliteDb(Connection connection) {
|
||||
db = connection;
|
||||
}
|
||||
|
||||
public Collection<Task> listTasks(List<Long> projectIds) throws UmbrellaException {
|
||||
public HashMap<Long, Task> listTasks(List<Long> projectIds) throws UmbrellaException {
|
||||
try {
|
||||
var rs = select("*").from(TABLE_TASKS).where(PROJECT_ID, in(projectIds.toArray())).exec(db);
|
||||
var list = new HashSet<Task>();
|
||||
while (rs.next()) list.add(Task.of(rs));
|
||||
var tasks = new HashMap<Long,Task>();
|
||||
var rs = select(ALL).from(TABLE_TASKS).where(PROJECT_ID, in(projectIds.toArray())).exec(db);
|
||||
while (rs.next()){
|
||||
var task = Task.of(rs);
|
||||
tasks.put(task.id(),task);
|
||||
}
|
||||
rs.close();
|
||||
return list;
|
||||
return tasks;
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load tasks for project ids");
|
||||
}
|
||||
}
|
||||
|
||||
public HashMap<Long, Task> listRootTasks(UmbrellaUser user, Long projectId) {
|
||||
try {
|
||||
var tasks = new HashMap<Long,Task>();
|
||||
var rs = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID)
|
||||
.where(PROJECT_ID,equal(projectId))
|
||||
.where(USER_ID,equal(user.id()))
|
||||
.where(PARENT_TASK_ID,isNull())
|
||||
.exec(db);
|
||||
while (rs.next()){
|
||||
var task = Task.of(rs);
|
||||
tasks.put(task.id(),task);
|
||||
}
|
||||
rs.close();
|
||||
return tasks;
|
||||
} catch (SQLException e){
|
||||
LOG.log(WARNING,"Failed to load tasks for project (pid: {0}, user_id: {1}",projectId,user.id(),e);
|
||||
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load tasks for project id");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,16 @@
|
||||
package de.srsoftware.umbrella.task;
|
||||
|
||||
import static de.srsoftware.tools.Optionals.is0;
|
||||
import static de.srsoftware.tools.Optionals.isSet;
|
||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||
import static de.srsoftware.umbrella.core.Constants.COMPANY_ID;
|
||||
import static de.srsoftware.umbrella.core.Constants.PROJECT_ID;
|
||||
import static de.srsoftware.umbrella.core.Paths.LIST;
|
||||
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_NOT_IMPLEMENTED;
|
||||
import static de.srsoftware.umbrella.core.Util.mapValues;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.forbidden;
|
||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException;
|
||||
import static de.srsoftware.umbrella.task.Constants.*;
|
||||
import static java.util.stream.Collectors.toMap;
|
||||
|
||||
import com.sun.net.httpserver.HttpExchange;
|
||||
import de.srsoftware.configuration.Configuration;
|
||||
@@ -57,6 +60,7 @@ public class TaskModule extends BaseHandler implements TaskService {
|
||||
var head = path.pop();
|
||||
return switch (head) {
|
||||
case ESTIMATED_TIMES -> estimatedTimes(user.get(),ex);
|
||||
case LIST -> postTaskList(user.get(),ex);
|
||||
default -> super.doGet(path,ex);
|
||||
};
|
||||
} catch (UmbrellaException e){
|
||||
@@ -71,16 +75,15 @@ public class TaskModule extends BaseHandler implements TaskService {
|
||||
var company = companies.get(companyId);
|
||||
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
|
||||
var projects = this.projects.listCompanyProjects(companyId,false);
|
||||
var taskList = taskDb.listTasks(projects.stream().map(Project::id).toList());
|
||||
var map = taskList.stream().collect(toMap(Task::id, t -> t));
|
||||
var map = taskDb.listTasks(projects.stream().map(Project::id).toList());
|
||||
var tree = new HashMap<Long,Map<String,Object>>();
|
||||
taskList.stream().filter(task -> !is0(task.estimatedTime())).forEach(task -> placeInTree(task,tree,map));
|
||||
map.values().stream().filter(task -> !is0(task.estimatedTime())).forEach(task -> placeInTree(task,tree,map));
|
||||
var result = new ArrayList<Map<String,Object>>();
|
||||
projects.forEach(project -> {
|
||||
var projectMap = new HashMap<>(project.toMap());
|
||||
var children = tree.values().stream().filter(root -> project.id() == (Long)root.get(PROJECT_ID)).toList();
|
||||
if (!children.isEmpty()) {
|
||||
projectMap.put(FIELD_TASKS, children);
|
||||
projectMap.put(TASKS, children);
|
||||
result.add(projectMap);
|
||||
}
|
||||
});
|
||||
@@ -88,13 +91,13 @@ public class TaskModule extends BaseHandler implements TaskService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Task> listCompanyTasks(long companyId) throws UmbrellaException {
|
||||
public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException {
|
||||
var projectList = projects.listCompanyProjects(companyId,false);
|
||||
return taskDb.listTasks(projectList.stream().map(Project::id).toList());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<Task> listProjectTasks(long projectId) throws UmbrellaException {
|
||||
public HashMap<Long, Task> listProjectTasks(long projectId) throws UmbrellaException {
|
||||
return taskDb.listTasks(List.of(projectId));
|
||||
}
|
||||
|
||||
@@ -103,6 +106,7 @@ public class TaskModule extends BaseHandler implements TaskService {
|
||||
if (task.parentTaskId() != null){
|
||||
Task parent = map.get(task.parentTaskId());
|
||||
var trunk = placeInTree(parent,tree,map);
|
||||
@SuppressWarnings("unchecked")
|
||||
ArrayList<Object> children = (ArrayList<Object>) trunk.computeIfAbsent(CHILDREN, k -> new ArrayList<Object>());
|
||||
children.add(taskMap);
|
||||
return taskMap;
|
||||
@@ -111,6 +115,13 @@ public class TaskModule extends BaseHandler implements TaskService {
|
||||
return taskMap;
|
||||
}
|
||||
|
||||
private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException {
|
||||
var json = json(ex);
|
||||
var projectId = json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number number ? number.longValue() : null;
|
||||
if (isSet(projectId)) return sendContent(ex,mapValues(taskDb.listRootTasks(user,projectId)));
|
||||
return sendEmptyResponse(HTTP_NOT_IMPLEMENTED,ex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ProjectService projectService() {
|
||||
return projects;
|
||||
|
||||
Reference in New Issue
Block a user