|
|
|
|
@ -6,6 +6,7 @@ import static de.srsoftware.umbrella.core.Constants.*;
@@ -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 {
@@ -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 {
@@ -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,6 +119,48 @@ public class TimeModule extends BaseHandler implements TimeService {
@@ -129,6 +119,48 @@ public class TimeModule extends BaseHandler implements TimeService {
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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() |
|
|
|
|
@ -136,6 +168,18 @@ public class TimeModule extends BaseHandler implements TimeService {
@@ -136,6 +168,18 @@ public class TimeModule extends BaseHandler implements TimeService {
|
|
|
|
|
.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!"); |
|
|
|
|
|