implemented storing of tasks

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-07-23 23:28:05 +02:00
parent 9cbcfb3b7f
commit d2776bd3b0
7 changed files with 97 additions and 14 deletions

View File

@@ -3,14 +3,16 @@ package de.srsoftware.umbrella.task;
import static de.srsoftware.tools.jdbc.Condition.*;
import static de.srsoftware.tools.jdbc.Query.*;
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_NOT_IMPLEMENTED;
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.tools.jdbc.Query;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
import java.sql.Connection;
@@ -110,4 +112,33 @@ public class SqliteDb implements TaskDb {
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load task from database");
}
}
@Override
public Task save(Task task) {
try {
if (task.id() == 0){ // new task
var rs = insertInto(TABLE_TASKS,PROJECT_ID,PARENT_TASK_ID,NAME,DESCRIPTION,STATUS,EST_TIME,START_DATE,DUE_DATE,SHOW_CLOSED,NO_INDEX)
.values(task.projectId(),task.parentTaskId(),task.name(),task.description(),task.status().code(),task.estimatedTime(),task.start(),task.dueDate(),task.showClosed(),task.noIndex())
.execute(db)
.getGeneratedKeys();
Long taskId = null;
if (rs.next()) taskId=rs.getLong(1);
rs.close();
if (taskId == null) throw new UmbrellaException("Failed to save task {0}",task.name());
return new Task(taskId,task.projectId(),task.parentTaskId(),task.name(),task.description(),task.status(),task.estimatedTime(),task.start(),task.dueDate(),task.showClosed(),task.noIndex(),task.members());
}
throw new UmbrellaException(HTTP_NOT_IMPLEMENTED,"updating task in SqliteDb.save(task) not implemented");
} catch (SQLException e){
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to save task {0}",task.name());
}
}
@Override
public void setMember(long taskId, long userId, Permission permission) {
try {
replaceInto(TABLE_TASKS_USERS,TASK_ID,USER_ID,PERMISSIONS).values(taskId,userId,permission.code()).execute(db).close();
} catch (SQLException e) {
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to store permissions");
}
}
}

View File

@@ -12,4 +12,8 @@ public interface TaskDb {
Task load(long taskId) throws UmbrellaException;
Map<Long, Permission> getMembers(Task task);
Task save(Task task);
void setMember(long taskId, long userId, Permission permission);
}

View File

@@ -8,10 +8,10 @@ import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Paths.*;
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.core.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.project.Constants.PERMISSIONS;
import static de.srsoftware.umbrella.task.Constants.*;
import static java.net.HttpURLConnection.HTTP_BAD_REQUEST;
import com.sun.net.httpserver.HttpExchange;
import de.srsoftware.configuration.Configuration;
@@ -27,6 +27,8 @@ import de.srsoftware.umbrella.core.model.*;
import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import org.json.JSONObject;
import java.io.IOException;
import java.util.*;
@@ -174,12 +176,26 @@ public class TaskModule extends BaseHandler implements TaskService {
private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException {
var json = json(ex);
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);
if (!(json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberData)) throw missingFieldException(MEMBERS);
long projectId = pid.longValue();
var project = projects.load(projectId);
projects.loadMembers(List.of(project));
var member = project.members().get(user.id());
if (member == null || member.permission() == Permission.READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project");
Task task = Task.of(json);
return taskDb.save(task);
task = taskDb.save(task);
for (var key : memberData.keySet()){
long userId = Long.parseLong(key);
if (!(memberData.get(key) instanceof JSONObject nested)) throw invalidFieldException("members."+userId,"JSON");
if (!(nested.has(PERMISSION) && nested.get(PERMISSION) instanceof JSONObject permission)) throw invalidFieldException("members."+userId+".permission","JSON");
if (!(permission.has(CODE) && permission.get(CODE) instanceof Number code)) throw invalidFieldException("members."+userId+".permission.code","int");
if (!project.members().containsKey(userId)) {
String username = nested.has(USER) && nested.get(USER) instanceof JSONObject userData && userData.get(NAME) instanceof String n ? n : key;
throw new UmbrellaException(HTTP_BAD_REQUEST,"User {0} is no member of the leading project and cannot be assigned to this task",username);
}
taskDb.setMember(task.id(),userId,Permission.of(code.intValue()));
}
return sendContent(ex,task);
}
private boolean postTaskList(UmbrellaUser user, HttpExchange ex) throws IOException {