implemented task/:id/view

This commit is contained in:
2025-07-22 23:51:37 +02:00
parent b03b0683bc
commit c2eae076f4
11 changed files with 213 additions and 14 deletions

View File

@@ -7,17 +7,18 @@ import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.tools.jdbc.Query.select;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR;
import static de.srsoftware.umbrella.project.Constants.*;
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.Status;
import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.core.model.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class SqliteDb implements TaskDb {
@@ -28,6 +29,19 @@ public class SqliteDb implements TaskDb {
db = connection;
}
@Override
public Map<Long, Permission> getMembers(Task task) {
try {
var result = new HashMap<Long,Permission>();
var rs = select(ALL).from(TABLE_TASKS_USERS).where(TASK_ID,equal(task.id())).exec(db);
while (rs.next()) result.put(rs.getLong(USER_ID),Permission.of(rs.getInt(PERMISSIONS)));
rs.close();
return result;
} catch (SQLException e){
throw new UmbrellaException(HTTP_SERVER_ERROR,"Faailed to load task members");
}
}
public HashMap<Long, Task> listTasks(Collection<Long> projectIds) throws UmbrellaException {
try {
var tasks = new HashMap<Long,Task>();
@@ -83,4 +97,18 @@ public class SqliteDb implements TaskDb {
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load tasks for project id");
}
}
@Override
public Task load(long taskId) throws UmbrellaException {
try {
var rs = select(ALL).from(TABLE_TASKS).where(ID, equal(taskId)).exec(db);
Task result = null;
if (rs.next()) result = Task.of(rs);
rs.close();
if (result == null) throw UmbrellaException.notFound("No task found for id {0}",taskId);
return result;
} catch (SQLException e) {
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load task from database");
}
}
}

View File

@@ -2,7 +2,15 @@
package de.srsoftware.umbrella.task;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Permission;
import de.srsoftware.umbrella.core.model.Task;
import java.util.Map;
public interface TaskDb {
Task load(long taskId) throws UmbrellaException;
Map<Long, Permission> getMembers(Task task);
}

View File

@@ -62,7 +62,12 @@ public class TaskModule extends BaseHandler implements TaskService {
return switch (head) {
case PERMISSIONS -> getPermissionList(ex);
case STATES -> getStateList(ex);
default -> super.doGet(path,ex);
case null -> super.doGet(path,ex);
default -> {
var taskId = Long.parseLong(head);
head = path.pop();
yield head == null ? getTask(ex,taskId,user.get()) : super.doGet(path,ex);
}
};
} catch (UmbrellaException e){
return send(ex,e);
@@ -121,6 +126,12 @@ public class TaskModule extends BaseHandler implements TaskService {
return sendContent(ex,map);
}
private boolean getTask(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
var task = loadMembers(taskDb.load(taskId));
if (!task.hasMember(user)) throw forbidden("You are not a member of {0}",task.name());
return sendContent(ex,task);
}
@Override
public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException {
var projectList = projects.listCompanyProjects(companyId,false);
@@ -132,6 +143,20 @@ public class TaskModule extends BaseHandler implements TaskService {
return taskDb.listTasks(List.of(projectId));
}
@Override
public Collection<Task> loadMembers(Collection<Task> taskList) {
var userMap = new HashMap<Long,UmbrellaUser>();
for (var task : taskList){
for (var entry : taskDb.getMembers(task).entrySet()){
var userId = entry.getKey();
var permission = entry.getValue();
var user = userMap.computeIfAbsent(userId,k -> users.loadUser(userId));
task.members().put(userId,new Member(user,permission));
}
}
return taskList;
}
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){