Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -26,15 +26,14 @@
import de.doubleslash.keeptime.rest.integration.heimat.model.HeimatTask;
import de.doubleslash.keeptime.rest.integration.heimat.model.HeimatTime;
import de.doubleslash.keeptime.view.ProjectReport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class HeimatController {
Expand Down Expand Up @@ -210,36 +209,39 @@ public List<Mapping> getTableRows(final LocalDate currentReportDate, final List<
final HeimatTask heimatTask = optionalHeimatTask.get();
taskName = heimatTask.name() + "\n" + heimatTask.taskHolderName();
}

final Mapping mapping = new Mapping(id, true, false,
StyledMessage.of(new StyledMessage.TextSegment("Not mapped in KeepTime\n\n" + taskName)), "", times,

StyledMessage syncMessage = StyledMessage.of(
new StyledMessage.TextSegment("Not mapped in KeepTime\n\n"),
new StyledMessage.TextSegment(taskName, true));
final Mapping mapping = new Mapping(id, true, false,syncMessage, "", times,
new ArrayList<>(0), heimatNotes, "", heimatTimeSeconds, 0);
list.add(mapping);
});

taskIdToHeimatTimesMap.forEach((id, times) -> {
final Optional<ExternalProjectMapping> mapping = mappedProjects.stream()
final List<ExternalProjectMapping> mappings = mappedProjects.stream()
.filter(mp -> mp.getExternalTaskId() == id)
.findAny();
if (mapping.isEmpty())
.toList();
if (mappings.isEmpty())
return;
final ExternalProjectMapping externalProjectMapping = mapping.get();
final Optional<Project> optionalProject = workedProjectsSet.stream()

Optional<ExternalProjectMapping> anyMatch = mappings.stream().filter(externalProjectMapping ->{
final List<Project> optionalProject = workedProjectsSet.stream()
.filter(wp -> wp.getId()
== externalProjectMapping.getProject()
.getId())
.findAny();
if (optionalProject.isPresent()) {
.getId()).toList();
return !optionalProject.isEmpty();
}).findAny();

if (anyMatch.isPresent()) {
return;
}
String heimatNotes = addHeimatNotes(times);
long heimatTimeSeconds = addHeimatTimes(times);

StyledMessage syncMessage = StyledMessage.of(
new StyledMessage.TextSegment("Present in Heimat but not KeepTime\n\nSync to "),
new StyledMessage.TextSegment(externalProjectMapping.getExternalTaskName(), true),
new StyledMessage.TextSegment("\n(" + externalProjectMapping.getExternalProjectName() + ")"));
new StyledMessage.TextSegment(mappings.get(0).getExternalTaskName(), true),
new StyledMessage.TextSegment("\n(" + mappings.get(0).getExternalProjectName() + ")"));

final Mapping mapping2 = new Mapping(id, true, false, syncMessage, "", times, mappedProjects.stream()
.filter(
Expand Down Expand Up @@ -402,18 +404,20 @@ public ExistingAndInvalidMappings getExistingProjectMappings(List<HeimatTask> ex
== p.getId())
.findAny();
if (mapping.isEmpty()) {
return new ProjectMapping(p, null);
return new ProjectMapping(p, null, false);
}

final Optional<HeimatTask> any = externalProjects.stream()
.filter(ep -> ep.id() == mapping.get().getExternalTaskId())
.findAny();
if (any.isEmpty()) {
ExternalProjectMapping existingMapping = mapping.get();
LOG.warn("A mapping exists but task does not exist anymore in Heimat! '{}'->'{}'.",
mapping.get().getProject(), mapping.get().getExternalTaskId());
invalidExternalMappings.add(mapping.get());
return new ProjectMapping(p, null);
existingMapping.getProject(), existingMapping.getExternalTaskId());
invalidExternalMappings.add(existingMapping);
return new ProjectMapping(p, getHeimatTaskFromMapping(existingMapping),true);
}
return new ProjectMapping(p, any.get());
return new ProjectMapping(p, any.get(), false);
}).toList();

final List<String> invalidMappingsAsString = invalidExternalMappings.stream()
Expand All @@ -437,6 +441,19 @@ public ExistingAndInvalidMappings getExistingProjectMappings(List<HeimatTask> ex
return new ExistingAndInvalidMappings(validProjectMappings, invalidMappingsAsString);
}

private HeimatTask getHeimatTaskFromMapping(ExternalProjectMapping mapping) {
try {
String json = mapping.getExternalTaskMetadata();
if (json == null || json.isEmpty()) {
return null;
}
return objectMapper.readValue(json, HeimatTask.class);
} catch (Exception e) {
LOG.warn("Unable to deserialize HeimatTask from mapping metadata", e);
return null;
}
}

public record UserMapping(Mapping mapping, boolean shouldSync, String userNotes, int userMinutes) {}

public record Mapping(long heimatTaskId, boolean canBeSynced, boolean shouldBeSynced, StyledMessage syncMessage,
Expand All @@ -448,10 +465,12 @@ public record HeimatErrors(UserMapping mapping, String errorMessage) {}
public static class ProjectMapping {
private Project project;
private HeimatTask heimatTask;
private boolean pendingRemoval;

public ProjectMapping(final Project project, final HeimatTask heimatTask) {
public ProjectMapping(final Project project, final HeimatTask heimatTask, boolean pendingRemoval) {
this.project = project;
this.heimatTask = heimatTask;
this.pendingRemoval = pendingRemoval;
}

public Project getProject() {
Expand All @@ -469,5 +488,13 @@ public HeimatTask getHeimatTask() {
public void setHeimatTask(final HeimatTask heimatTask) {
this.heimatTask = heimatTask;
}

public boolean isPendingRemoval() {
return pendingRemoval;
}

public void setPendingRemoval(boolean pendingRemoval) {
this.pendingRemoval = pendingRemoval;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public record JWTTokenAttributes(
String header,
String payload,
LocalDateTime expiration
) {}
) { }


public static JWTTokenAttributes parse(String bearerToken) {
Expand All @@ -57,6 +57,10 @@ public static JWTTokenAttributes parse(String bearerToken) {
return new JWTTokenAttributes(header, payload, expiration);
}

public static boolean isExpired(JWTTokenAttributes token, LocalDateTime localDateTimeNow) {
return localDateTimeNow.isAfter(token.expiration);
}

private static String removeBearerPrefix(String token) {
return token.startsWith("Bearer ") ? token.substring(7) : token;
}
Expand Down
Loading