diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java index d8f1f3c..9297482 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -6,7 +6,6 @@ import static java.nio.charset.StandardCharsets.UTF_8; public class Constants { - private Constants(){} public static final String ADDRESS = "address"; @@ -140,6 +139,7 @@ public class Constants { public static final String RECEIVERS = "receivers"; public static final String REDIRECT = "redirect"; public static final String RENDERED = "rendered"; + public static final String REQUIRED_TASKS_IDS = "required_tasks_ids"; public static final String SENDER = "sender"; public static final String SETTINGS = "settings"; diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java index a1f0591..a299c8e 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Task.java @@ -20,6 +20,7 @@ public class Task implements Mappable { private final long id, projectId; private Long parentTaskId; private String description, name; + private Set requiredTasksIds; private int status; private Double estimatedTime; private LocalDate dueDate, start; @@ -41,6 +42,7 @@ public class Task implements Mappable { this.showClosed = showClosed; this.noIndex = noIndex; this.members = members; + this.requiredTasksIds = new HashSet<>(); } public Task clean() { @@ -131,8 +133,6 @@ public class Task implements Mappable { default -> throw invalidFieldException(json.get(DESCRIPTION).getClass().getSimpleName(),"String or JSON"); }; - - var status = Status.OPEN.code(); if (json.has(STATUS) && json.get(STATUS) instanceof JSONObject state){ if (state.get(CODE) instanceof Number code) status = code.intValue(); @@ -185,6 +185,10 @@ public class Task implements Mappable { return projectId; } + public Set requiredTasksIds(){ + return requiredTasksIds; + } + public boolean showClosed(){ return showClosed; } @@ -216,6 +220,7 @@ public class Task implements Mappable { map.put(SHOW_CLOSED,showClosed); map.put(NO_INDEX,noIndex); map.put(MEMBERS,memberMap); + map.put(REQUIRED_TASKS_IDS,requiredTasksIds); return map; } diff --git a/task/src/main/java/de/srsoftware/umbrella/task/Constants.java b/task/src/main/java/de/srsoftware/umbrella/task/Constants.java index 7797a1c..c6c94e1 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/Constants.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/Constants.java @@ -5,9 +5,12 @@ public class Constants { private Constants(){} + public static final String CONFIG_DATABASE = "umbrella.modules.task.database"; public static final String CHILDREN = "children"; public static final String ESTIMATED_TIMES = "estimated_times"; + public static final String REQUIRED_TASK_ID = "required_task_id"; + public static final String TABLE_TASK_DEPENDENCIES = "task_dependencies"; public static final String TABLE_TASKS = "tasks"; public static final String TABLE_TASKS_USERS = "tasks_users"; public static final String TASK = "task"; diff --git a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java index e9f0e9d..6ae152b 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java @@ -35,16 +35,31 @@ public class SqliteDb extends BaseDb implements TaskDb { int currentVersion = createSettingsTable(); switch (currentVersion){ case 0: - createTaskTables(); + createTaskTable(); createTasksUsersTable(); case 1: swapStates(TABLE_TASKS); + case 2: + createDependencyTable(); } - return setCurrentVersion(2); + return setCurrentVersion(3); } - private void createTaskTables() { + private void createDependencyTable() { + var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL, {2} INT NOT NULL, PRIMARY KEY({1}, {2}))"; + sql = format(sql,TABLE_TASK_DEPENDENCIES,TASK_ID,REQUIRED_TASK_ID); + try { + var stmt = db.prepareStatement(sql); + stmt.execute(); + stmt.close(); + } catch (SQLException e) { + LOG.log(ERROR, ERROR_FAILED_CREATE_TABLE, TABLE_TASK_DEPENDENCIES, e); + throw new RuntimeException(e); + } + } + + private void createTaskTable() { var createTable = """ CREATE TABLE IF NOT EXISTS "{0}" ( {1} INTEGER PRIMARY KEY,