refactoring project module: better separation of loading of projects and loading of project members

This commit is contained in:
2025-07-21 09:46:18 +02:00
parent 680afd7700
commit af209e3dc5
13 changed files with 107 additions and 98 deletions

View File

@@ -16,8 +16,8 @@ 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.HashMap;
import java.util.List;
public class SqliteDb implements TaskDb {
@@ -28,7 +28,7 @@ public class SqliteDb implements TaskDb {
db = connection;
}
public HashMap<Long, Task> listTasks(List<Long> projectIds) throws UmbrellaException {
public HashMap<Long, Task> listTasks(Collection<Long> projectIds) throws UmbrellaException {
try {
var tasks = new HashMap<Long,Task>();
var rs = select(ALL).from(TABLE_TASKS).where(PROJECT_ID, in(projectIds.toArray())).exec(db);

View File

@@ -22,7 +22,6 @@ import de.srsoftware.umbrella.core.api.ProjectService;
import de.srsoftware.umbrella.core.api.TaskService;
import de.srsoftware.umbrella.core.api.UserService;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Project;
import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
@@ -73,17 +72,17 @@ public class TaskModule extends BaseHandler implements TaskService {
var companyId = cid.longValue();
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 map = taskDb.listTasks(projects.stream().map(Project::id).toList());
var tree = new HashMap<Long,Map<String,Object>>();
map.values().stream().filter(task -> !is0(task.estimatedTime())).forEach(task -> placeInTree(task,tree,map));
var projectMap = this.projects.listCompanyProjects(companyId,false);
var taskMap = taskDb.listTasks(projectMap.keySet());
var taskTree = new HashMap<Long,Map<String,Object>>();
taskMap.values().stream().filter(task -> !is0(task.estimatedTime())).forEach(task -> placeInTree(task,taskTree,taskMap));
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();
projectMap.values().forEach(project -> {
var mappedProject = new HashMap<>(project.toMap());
var children = taskTree.values().stream().filter(root -> project.id() == (Long)root.get(PROJECT_ID)).toList();
if (!children.isEmpty()) {
projectMap.put(TASKS, children);
result.add(projectMap);
mappedProject.put(TASKS, children);
result.add(mappedProject);
}
});
return sendContent(ex,result);
@@ -92,7 +91,7 @@ public class TaskModule extends BaseHandler implements TaskService {
@Override
public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException {
var projectList = projects.listCompanyProjects(companyId,false);
return taskDb.listTasks(projectList.stream().map(Project::id).toList());
return taskDb.listTasks(projectList.keySet());
}
@Override
@@ -100,18 +99,18 @@ public class TaskModule extends BaseHandler implements TaskService {
return taskDb.listTasks(List.of(projectId));
}
private Map<String,Object> placeInTree(Task task, HashMap<Long, Map<String,Object>> tree, Map<Long, Task> map) {
var taskMap = task.toMap();
private Map<String,Object> placeInTree(Task task, HashMap<Long, Map<String,Object>> taskTree, Map<Long, Task> taskMap) {
var mappedTask = task.toMap();
if (task.parentTaskId() != null){
Task parent = map.get(task.parentTaskId());
var trunk = placeInTree(parent,tree,map);
Task parent = taskMap.get(task.parentTaskId());
var trunk = placeInTree(parent,taskTree,taskMap);
@SuppressWarnings("unchecked")
ArrayList<Object> children = (ArrayList<Object>) trunk.computeIfAbsent(CHILDREN, k -> new ArrayList<Object>());
children.add(taskMap);
return taskMap;
ArrayList<Object> children = (ArrayList<Object>) trunk.computeIfAbsent(CHILDREN, k -> new ArrayList<>());
children.add(mappedTask);
return mappedTask;
}
tree.put(task.id(),taskMap);
return taskMap;
taskTree.put(task.id(),mappedTask);
return mappedTask;
}
private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException {