implemented joining of times

This commit is contained in:
2025-09-01 23:31:46 +02:00
parent 50dbe9a4e5
commit 45c2f3978f
6 changed files with 111 additions and 15 deletions

View File

@@ -7,7 +7,7 @@ public class Constants {
public static final String CHILDREN = "children";
public static final String CONFIG_DATABASE = "umbrella.modules.time.database";
public static final String JOIN = "join";
public static final String PROJECTS = "projects";
public static final String TABLE_TASK_TIMES = "task_times";
public static final String TABLE_TIMES = "times";

View File

@@ -6,6 +6,7 @@ import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Paths.*;
import static de.srsoftware.umbrella.core.Util.mapValues;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.core.model.Time.State.Open;
import static de.srsoftware.umbrella.core.model.Time.State.Started;
import static de.srsoftware.umbrella.time.Constants.*;
import static java.util.stream.Collectors.toSet;
@@ -76,18 +77,6 @@ public class TimeModule extends BaseHandler implements TimeService {
}
}
private boolean getStoppedTask(UmbrellaUser user, long timeId, HttpExchange ex) throws IOException {
long now;
try {
now = Long.parseLong(body(ex));
} catch (NumberFormatException e) {
throw unprocessable("request body does not contain a timestamp!");
}
var time = timeDb.load(timeId);
timeDb.save(time.stop(now));
return sendContent(ex,time);
}
@Override
public boolean doPatch(Path path, HttpExchange ex) throws IOException {
addCors(ex);
@@ -114,6 +103,7 @@ public class TimeModule extends BaseHandler implements TimeService {
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
case JOIN -> joinTimes(ex,user.get());
case LIST -> listTimes(ex,user.get());
case TRACK_TASK -> trackTask(user.get(),path,ex);
default -> {
@@ -129,13 +119,67 @@ public class TimeModule extends BaseHandler implements TimeService {
}
}
private Optional<Time> getStartedTime(UmbrellaUser user){
private boolean joinTimes(HttpExchange ex, UmbrellaUser user) throws IOException {
var parts = body(ex).split("\\+");
if (parts.length != 2) throw unprocessable("Expected two time ids as body");
long id1, id2;
try {
id1 = Long.parseLong(parts[0]);
id2 = Long.parseLong(parts[1]);
} catch (NumberFormatException e) {
throw unprocessable("Expected two time ids as body");
}
var time1 = timeDb.load(id1);
if (time1.userId() != user.id()) throw forbidden("You are not owner of time {0}",time1.id());
if (time1.state() != Open) throw forbidden("Time is not editable");
var time2 = timeDb.load(id2);
if (time2.userId() != user.id()) throw forbidden("You are not owner of time {0}",time2.id());
if (time2.state() != Open) throw forbidden("Time is not editable");
if (time1.start() > time2.start()) {
var dummy = time1;
time1 = time2;
time2 = dummy;
}
if (Math.abs(time1.end() - time2.start())>100L) throw unprocessable("Times are not adjacent");
var subject = time1.subject();
if (time2.subject().contains(subject)) {
subject = time2.subject();
} else if (!subject.contains(time2.subject())) subject += " / "+time2.subject();
var description = time1.description();
if (time2.description().contains(description)) {
description = time2.description();
} else if (!description.contains(time2.description())) description += "\n"+time2.description();
time1.end(time2.end());
time1.taskIds().addAll(time2.taskIds());
time1.subject(subject);
time1.description(description);
var result = timeDb.save(time1);
timeDb.delete(time2.id());
return sendContent(ex,result);
}
private Optional<Time> getStartedTime(UmbrellaUser user){
return timeDb.listUserTimes(user.id(), false).values()
.stream()
.filter(time -> time.state() == Started)
.max(Comparator.comparing(Time::start));
}
private boolean getStoppedTask(UmbrellaUser user, long timeId, HttpExchange ex) throws IOException {
long now;
try {
now = Long.parseLong(body(ex));
} catch (NumberFormatException e) {
throw unprocessable("request body does not contain a timestamp!");
}
var time = timeDb.load(timeId);
timeDb.save(time.stop(now));
return sendContent(ex,time);
}
private boolean patchTime(UmbrellaUser user, long timeId, HttpExchange ex) throws IOException {
var time = timeDb.load(timeId);
if (time.userId() != user.id()) throw forbidden("You are not allowed to alter this time!");