intermediate
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -1,31 +1,22 @@
|
|||||||
/* © 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;
|
public static Status of(int code){
|
||||||
|
return switch (code){
|
||||||
Status(int code){
|
case 10 -> OPEN;
|
||||||
this.code = code;
|
case 20 -> STARTED;
|
||||||
}
|
case 40 -> PENDING;
|
||||||
|
case 60 -> COMPLETE;
|
||||||
public int code(){
|
case 100 -> CANCELLED;
|
||||||
return code;
|
default -> throw new IllegalArgumentException();
|
||||||
}
|
};
|
||||||
|
}
|
||||||
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();
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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);
|
||||||
|
|||||||
@@ -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){
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user