From b8b93fe9259a5729c22c0095235a2e3004373be0 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Thu, 31 Jul 2025 16:48:19 +0200 Subject: [PATCH] intermediate --- .../umbrella/core/model/Project.java | 12 ++--- .../umbrella/core/model/Status.java | 45 ++++++++----------- .../srsoftware/umbrella/core/model/Task.java | 19 ++++---- .../umbrella/project/ProjectModule.java | 6 ++- .../srsoftware/umbrella/project/SqliteDb.java | 4 +- .../de/srsoftware/umbrella/task/SqliteDb.java | 4 +- 6 files changed, 42 insertions(+), 48 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java index 783d3e4..b4c4c8a 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java @@ -15,13 +15,13 @@ public class Project implements Mappable { private final Map members; private boolean showClosed; private final Long companyId; - private Status status; + private int status; private String name; private final long id; private String description; private final Set dirtyFields = new HashSet<>(); - public Project(long id, String name, String description, Status status, Long companyId, boolean showClosed, Map members) { + public Project(long id, String name, String description, int status, Long companyId, boolean showClosed, Map members) { this.id = id; this.name = name; this.description = description; @@ -81,7 +81,7 @@ public class Project implements Mappable { public static Project of(ResultSet rs) throws SQLException { var companyId = rs.getLong(COMPANY_ID); - return new Project(rs.getLong(ID),rs.getString(NAME),rs.getString(DESCRIPTION),Status.of(rs.getInt(STATUS)),companyId == 0 ? null : companyId,rs.getBoolean(SHOW_CLOSED),new HashMap<>()); + return new Project(rs.getLong(ID),rs.getString(NAME),rs.getString(DESCRIPTION),rs.getInt(STATUS),companyId == 0 ? null : companyId,rs.getBoolean(SHOW_CLOSED),new HashMap<>()); } public Project patch(JSONObject json) { @@ -90,7 +90,7 @@ public class Project implements Mappable { case DESCRIPTION: description = json.getString(key); break; case NAME: name = json.getString(key); break; case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); break; - case STATUS: status = json.get(key) instanceof Number number ? Status.of(number.intValue()) : Status.valueOf(json.getString(key)); break; + case STATUS: status = json.getInt(key); break; default: key = null; } if (key != null) dirtyFields.add(key); @@ -102,7 +102,7 @@ public class Project implements Mappable { return showClosed; } - public Status status(){ + public int status(){ return status; } @@ -116,7 +116,7 @@ public class Project implements Mappable { map.put(ID,id); map.put(NAME,name); map.put(DESCRIPTION,mapMarkdown(description)); - map.put(STATUS,Map.of(STATUS_CODE,status.code(), NAME,status.name())); + map.put(STATUS,status); map.put(COMPANY_ID,companyId); map.put(SHOW_CLOSED,showClosed); map.put(MEMBERS,memberMap); diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Status.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Status.java index e084ef9..b4bd6d7 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Status.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Status.java @@ -1,31 +1,22 @@ /* © SRSoftware 2025 */ package de.srsoftware.umbrella.core.model; -public enum Status{ - OPEN(10), - STARTED(20), - PENDING(40), - COMPLETE(60), - CANCELLED(100); +public record Status(String name, int code){ + public static final Status OPEN = new Status("OPEN",10); + public static final Status STARTED = new Status("STARTED",20); + public static final Status PENDING = new Status("PENDING", 40); + public static final Status COMPLETE = new Status("COMPLETE",60); + public static final Status CANCELLED = new Status("CANCELLED", 100); + public static final Status[] PREDEFINED = {OPEN, STARTED, PENDING, COMPLETE, CANCELLED}; - private int code; - - Status(int code){ - this.code = code; - } - - public int code(){ - return code; - } - - public static Status of(int code){ - return switch (code){ - case 10 -> OPEN; - case 20 -> STARTED; - case 40 -> PENDING; - case 60 -> COMPLETE; - case 100 -> CANCELLED; - default -> throw new IllegalArgumentException(); - }; - } - } \ No newline at end of file + public static Status of(int code){ + return switch (code){ + case 10 -> OPEN; + case 20 -> STARTED; + case 40 -> PENDING; + case 60 -> COMPLETE; + case 100 -> CANCELLED; + default -> throw new IllegalArgumentException(); + }; + } +} \ No newline at end of file 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 50cff3d..a1f0591 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,7 +20,7 @@ public class Task implements Mappable { private final long id, projectId; private Long parentTaskId; private String description, name; - private Status status; + private int status; private Double estimatedTime; private LocalDate dueDate, start; private boolean noIndex, showClosed; @@ -28,7 +28,7 @@ public class Task implements Mappable { private final Set dirtyFields = new HashSet<>(); - public Task (long id, long projectId, Long parentTaskId, String name, String description, Status status, Double estimatedTime, LocalDate start, LocalDate dueDate, boolean showClosed, boolean noIndex, Map members){ + public Task (long id, long projectId, Long parentTaskId, String name, String description, int status, Double estimatedTime, LocalDate start, LocalDate dueDate, boolean showClosed, boolean noIndex, Map members){ this.id = id; this.projectId = projectId; this.parentTaskId = parentTaskId; @@ -109,7 +109,7 @@ public class Task implements Mappable { parentTaskId == 0d ? null : parentTaskId, rs.getString(NAME), rs.getString(DESCRIPTION), - Status.of(rs.getInt(STATUS)), + rs.getInt(STATUS), estTime == 0d ? null : estTime, startDate != null ? LocalDate.parse(startDate) : null, dueDate != null ? LocalDate.parse(dueDate) : null, @@ -131,10 +131,11 @@ public class Task implements Mappable { default -> throw invalidFieldException(json.get(DESCRIPTION).getClass().getSimpleName(),"String or JSON"); }; - var status = Status.OPEN; + + + var status = Status.OPEN.code(); if (json.has(STATUS) && json.get(STATUS) instanceof JSONObject state){ - if (state.get(CODE) instanceof Number code) status = Status.of(code.intValue()); - if (state.get(CODE) instanceof String code) status = Status.valueOf(code); + if (state.get(CODE) instanceof Number code) status = code.intValue(); } Double estimatedTime = null; if (json.has(ESTIMATED_TIME)) { @@ -165,7 +166,7 @@ public class Task implements Mappable { case PARENT_TASK_ID: parentTaskId = json.getLong(PARENT_TASK_ID); break; case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); break; case START_DATE: start = json.isNull(START_DATE) || json.getString(START_DATE).isBlank() ? null : LocalDate.parse(json.getString(START_DATE)); break; - case STATUS: status = json.get(key) instanceof Number number ? Status.of(number.intValue()) : Status.valueOf(json.getString(key)); break; + case STATUS: status = json.getInt(key); break; default: { LOG.log(WARNING,"Tried to patch field ''{0}'' of task, which is not implemented!",key); key = null; @@ -192,7 +193,7 @@ public class Task implements Mappable { return start; } - public Status status(){ + public int status(){ return status; } @@ -208,7 +209,7 @@ public class Task implements Mappable { map.put(PARENT_TASK_ID, parentTaskId); map.put(NAME, name); map.put(DESCRIPTION, mapMarkdown(description)); - map.put(STATUS, Map.of(NAME,status.name(),STATUS_CODE,status.code())); + map.put(STATUS, status); map.put(ESTIMATED_TIME, estimatedTime); map.put(START_DATE,start); map.put(DUE_DATE,dueDate); diff --git a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java index b835668..9c6ae3e 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -9,6 +9,7 @@ import static de.srsoftware.umbrella.core.Util.mapValues; import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.core.model.Permission.*; import static de.srsoftware.umbrella.core.model.Status.OPEN; +import static de.srsoftware.umbrella.core.model.Status.PREDEFINED; import static de.srsoftware.umbrella.project.Constants.CONFIG_DATABASE; import static java.lang.Boolean.TRUE; import static java.net.HttpURLConnection.HTTP_OK; @@ -139,7 +140,8 @@ public class ProjectModule extends BaseHandler implements ProjectService { private boolean getStateList(HttpExchange ex) throws IOException { var map = new HashMap(); - for (var status : Status.values()) map.put(status.code(),status.name()); + for (var status : PREDEFINED) map.put(status.code(),status.name()); + map.put(23,"evil"); return sendContent(ex,map); } @@ -247,7 +249,7 @@ public class ProjectModule extends BaseHandler implements ProjectService { showClosed = settingsJson.has(SHOW_CLOSED) && settingsJson.get(SHOW_CLOSED) == TRUE; } var owner = Map.of(user.id(),new Member(user,OWNER)); - var prj = new Project(0,name,description, OPEN,companyId,showClosed, owner); + var prj = new Project(0,name,description, OPEN.code(),companyId,showClosed, owner); prj = projects.save(prj); if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){ diff --git a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java index 662736b..5ad1fcd 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java @@ -200,7 +200,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) public Project save(Project prj) throws UmbrellaException { if (prj.id() == 0) { // new try { - var stmt = insertInto(TABLE_PROJECTS, NAME, DESCRIPTION, STATUS, COMPANY_ID, SHOW_CLOSED).values(prj.name(), prj.description(), prj.status().code(), prj.companyId().orElse(null), prj.showClosed()).execute(db); + var stmt = insertInto(TABLE_PROJECTS, NAME, DESCRIPTION, STATUS, COMPANY_ID, SHOW_CLOSED).values(prj.name(), prj.description(), prj.status(), prj.companyId().orElse(null), prj.showClosed()).execute(db); var rs = stmt.getGeneratedKeys(); var id = rs.next() ? rs.getLong(1) : null; rs.close(); @@ -225,7 +225,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) } if (prj.isDirty()){ update(TABLE_PROJECTS).set(NAME,DESCRIPTION,STATUS,COMPANY_ID,SHOW_CLOSED).where(ID,equal(prj.id())).prepare(db) - .apply(prj.name(),prj.description(),prj.status().code(),prj.companyId(),prj.showClosed()) + .apply(prj.name(),prj.description(),prj.status(),prj.companyId(),prj.showClosed()) .execute(); prj.clean(); } 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 3ea0417..cb57ff0 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java @@ -250,7 +250,7 @@ CREATE TABLE IF NOT EXISTS {0} ( 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()) + .values(task.projectId(),task.parentTaskId(),task.name(),task.description(),task.status(),task.estimatedTime(),task.start(),task.dueDate(),task.showClosed(),task.noIndex()) .execute(db) .getGeneratedKeys(); Long taskId = null; @@ -268,7 +268,7 @@ CREATE TABLE IF NOT EXISTS {0} ( if (task.isDirty()) { update(TABLE_TASKS).set(PROJECT_ID,PARENT_TASK_ID,NAME,DESCRIPTION,STATUS,EST_TIME,START_DATE,DUE_DATE,SHOW_CLOSED,NO_INDEX) .where(ID,equal(task.id())).prepare(db) - .apply(task.projectId(),task.parentTaskId(),task.name(),task.description(),task.status().code(),task.estimatedTime(),task.start(),task.dueDate(),task.showClosed(),task.noIndex()) + .apply(task.projectId(),task.parentTaskId(),task.name(),task.description(),task.status(),task.estimatedTime(),task.start(),task.dueDate(),task.showClosed(),task.noIndex()) .close(); task.clean(); }