Browse Source

intermediate

feature/entityId
Stephan Richter 3 months ago
parent
commit
b8b93fe925
  1. 12
      core/src/main/java/de/srsoftware/umbrella/core/model/Project.java
  2. 25
      core/src/main/java/de/srsoftware/umbrella/core/model/Status.java
  3. 19
      core/src/main/java/de/srsoftware/umbrella/core/model/Task.java
  4. 6
      project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java
  5. 4
      project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java
  6. 4
      task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java

12
core/src/main/java/de/srsoftware/umbrella/core/model/Project.java

@ -15,13 +15,13 @@ public class Project implements Mappable {
private final Map<Long,Member> members; private final Map<Long,Member> members;
private boolean showClosed; private boolean showClosed;
private final Long companyId; private final Long companyId;
private Status status; private int status;
private String name; private String name;
private final long id; private final long id;
private String description; private String description;
private final Set<String> dirtyFields = new HashSet<>(); private final Set<String> dirtyFields = new HashSet<>();
public Project(long id, String name, String description, Status status, Long companyId, boolean showClosed, Map<Long,Member> members) { public Project(long id, String name, String description, int status, Long companyId, boolean showClosed, Map<Long,Member> members) {
this.id = id; this.id = id;
this.name = name; this.name = name;
this.description = description; this.description = description;
@ -81,7 +81,7 @@ public class Project implements Mappable {
public static Project of(ResultSet rs) throws SQLException { public static Project of(ResultSet rs) throws SQLException {
var companyId = rs.getLong(COMPANY_ID); 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) { public Project patch(JSONObject json) {
@ -90,7 +90,7 @@ public class Project implements Mappable {
case DESCRIPTION: description = json.getString(key); break; case DESCRIPTION: description = json.getString(key); break;
case NAME: name = json.getString(key); break; case NAME: name = json.getString(key); break;
case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); 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; default: key = null;
} }
if (key != null) dirtyFields.add(key); if (key != null) dirtyFields.add(key);
@ -102,7 +102,7 @@ public class Project implements Mappable {
return showClosed; return showClosed;
} }
public Status status(){ public int status(){
return status; return status;
} }
@ -116,7 +116,7 @@ public class Project implements Mappable {
map.put(ID,id); map.put(ID,id);
map.put(NAME,name); map.put(NAME,name);
map.put(DESCRIPTION,mapMarkdown(description)); 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(COMPANY_ID,companyId);
map.put(SHOW_CLOSED,showClosed); map.put(SHOW_CLOSED,showClosed);
map.put(MEMBERS,memberMap); map.put(MEMBERS,memberMap);

25
core/src/main/java/de/srsoftware/umbrella/core/model/Status.java

@ -1,22 +1,13 @@
/* © SRSoftware 2025 */ /* © SRSoftware 2025 */
package de.srsoftware.umbrella.core.model; package de.srsoftware.umbrella.core.model;
public enum Status{ public record Status(String name, int code){
OPEN(10), public static final Status OPEN = new Status("OPEN",10);
STARTED(20), public static final Status STARTED = new Status("STARTED",20);
PENDING(40), public static final Status PENDING = new Status("PENDING", 40);
COMPLETE(60), public static final Status COMPLETE = new Status("COMPLETE",60);
CANCELLED(100); 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){ public static Status of(int code){
return switch (code){ return switch (code){
@ -28,4 +19,4 @@ public enum Status{
default -> throw new IllegalArgumentException(); default -> throw new IllegalArgumentException();
}; };
} }
} }

19
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 final long id, projectId;
private Long parentTaskId; private Long parentTaskId;
private String description, name; private String description, name;
private Status status; private int status;
private Double estimatedTime; private Double estimatedTime;
private LocalDate dueDate, start; private LocalDate dueDate, start;
private boolean noIndex, showClosed; private boolean noIndex, showClosed;
@ -28,7 +28,7 @@ public class Task implements Mappable {
private final Set<String> dirtyFields = new HashSet<>(); private final Set<String> 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<Long,Member> 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<Long,Member> members){
this.id = id; this.id = id;
this.projectId = projectId; this.projectId = projectId;
this.parentTaskId = parentTaskId; this.parentTaskId = parentTaskId;
@ -109,7 +109,7 @@ public class Task implements Mappable {
parentTaskId == 0d ? null : parentTaskId, parentTaskId == 0d ? null : parentTaskId,
rs.getString(NAME), rs.getString(NAME),
rs.getString(DESCRIPTION), rs.getString(DESCRIPTION),
Status.of(rs.getInt(STATUS)), rs.getInt(STATUS),
estTime == 0d ? null : estTime, estTime == 0d ? null : estTime,
startDate != null ? LocalDate.parse(startDate) : null, startDate != null ? LocalDate.parse(startDate) : null,
dueDate != null ? LocalDate.parse(dueDate) : 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"); 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 (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 Number code) status = code.intValue();
if (state.get(CODE) instanceof String code) status = Status.valueOf(code);
} }
Double estimatedTime = null; Double estimatedTime = null;
if (json.has(ESTIMATED_TIME)) { 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 PARENT_TASK_ID: parentTaskId = json.getLong(PARENT_TASK_ID); break;
case SHOW_CLOSED: showClosed = json.getBoolean(SHOW_CLOSED); 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 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: { default: {
LOG.log(WARNING,"Tried to patch field ''{0}'' of task, which is not implemented!",key); LOG.log(WARNING,"Tried to patch field ''{0}'' of task, which is not implemented!",key);
key = null; key = null;
@ -192,7 +193,7 @@ public class Task implements Mappable {
return start; return start;
} }
public Status status(){ public int status(){
return status; return status;
} }
@ -208,7 +209,7 @@ public class Task implements Mappable {
map.put(PARENT_TASK_ID, parentTaskId); map.put(PARENT_TASK_ID, parentTaskId);
map.put(NAME, name); map.put(NAME, name);
map.put(DESCRIPTION, mapMarkdown(description)); 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(ESTIMATED_TIME, estimatedTime);
map.put(START_DATE,start); map.put(START_DATE,start);
map.put(DUE_DATE,dueDate); map.put(DUE_DATE,dueDate);

6
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.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.core.model.Permission.*; 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.OPEN;
import static de.srsoftware.umbrella.core.model.Status.PREDEFINED;
import static de.srsoftware.umbrella.project.Constants.CONFIG_DATABASE; import static de.srsoftware.umbrella.project.Constants.CONFIG_DATABASE;
import static java.lang.Boolean.TRUE; import static java.lang.Boolean.TRUE;
import static java.net.HttpURLConnection.HTTP_OK; 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 { private boolean getStateList(HttpExchange ex) throws IOException {
var map = new HashMap<Integer,String>(); var map = new HashMap<Integer,String>();
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); 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; showClosed = settingsJson.has(SHOW_CLOSED) && settingsJson.get(SHOW_CLOSED) == TRUE;
} }
var owner = Map.of(user.id(),new Member(user,OWNER)); 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); prj = projects.save(prj);
if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){ if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){

4
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 { public Project save(Project prj) throws UmbrellaException {
if (prj.id() == 0) { // new if (prj.id() == 0) { // new
try { 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 rs = stmt.getGeneratedKeys();
var id = rs.next() ? rs.getLong(1) : null; var id = rs.next() ? rs.getLong(1) : null;
rs.close(); rs.close();
@ -225,7 +225,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
} }
if (prj.isDirty()){ if (prj.isDirty()){
update(TABLE_PROJECTS).set(NAME,DESCRIPTION,STATUS,COMPANY_ID,SHOW_CLOSED).where(ID,equal(prj.id())).prepare(db) 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(); .execute();
prj.clean(); prj.clean();
} }

4
task/src/main/java/de/srsoftware/umbrella/task/SqliteDb.java

@ -250,7 +250,7 @@ CREATE TABLE IF NOT EXISTS {0} (
try { try {
if (task.id() == 0){ // new task 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) 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) .execute(db)
.getGeneratedKeys(); .getGeneratedKeys();
Long taskId = null; Long taskId = null;
@ -268,7 +268,7 @@ CREATE TABLE IF NOT EXISTS {0} (
if (task.isDirty()) { 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) 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) .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(); .close();
task.clean(); task.clean();
} }

Loading…
Cancel
Save