diff --git a/src/main/java/net/javahippie/fitpub/controller/KomootImportController.java b/src/main/java/net/javahippie/fitpub/controller/KomootImportController.java index eca692d..4ad57a0 100644 --- a/src/main/java/net/javahippie/fitpub/controller/KomootImportController.java +++ b/src/main/java/net/javahippie/fitpub/controller/KomootImportController.java @@ -37,9 +37,13 @@ public class KomootImportController { @Valid @RequestBody KomootImportRequest request, Authentication authentication ) { + UUID fitPubUserId = userRepository.findByUsername(authentication.getName()) + .orElseThrow(() -> new IllegalArgumentException("Authenticated user not found")) + .getId(); + log.info("User {} requested Komoot activity preview for Komoot ID {}", authentication.getName(), request.userId()); - KomootActivitiesResponse response = komootImportService.fetchCompletedActivities(request); + KomootActivitiesResponse response = komootImportService.fetchCompletedActivities(request, fitPubUserId); return ResponseEntity.ok(response); } diff --git a/src/main/java/net/javahippie/fitpub/model/dto/KomootActivitySummaryDTO.java b/src/main/java/net/javahippie/fitpub/model/dto/KomootActivitySummaryDTO.java index 830f838..d551b49 100644 --- a/src/main/java/net/javahippie/fitpub/model/dto/KomootActivitySummaryDTO.java +++ b/src/main/java/net/javahippie/fitpub/model/dto/KomootActivitySummaryDTO.java @@ -9,12 +9,14 @@ public record KomootActivitySummaryDTO( long id, String name, String sport, + String mappedActivityType, String status, String type, OffsetDateTime date, Double distanceMeters, Integer durationSeconds, Integer timeInMotionSeconds, - Double elevationUp + Double elevationUp, + boolean imported ) { } diff --git a/src/main/java/net/javahippie/fitpub/service/KomootImportService.java b/src/main/java/net/javahippie/fitpub/service/KomootImportService.java index d37ab78..47e06f3 100644 --- a/src/main/java/net/javahippie/fitpub/service/KomootImportService.java +++ b/src/main/java/net/javahippie/fitpub/service/KomootImportService.java @@ -61,8 +61,10 @@ public class KomootImportService { @Value("${fitpub.komoot.base-url:https://www.komoot.com}") private String komootBaseUrl; - public KomootActivitiesResponse fetchCompletedActivities(KomootImportRequest request) { + public KomootActivitiesResponse fetchCompletedActivities(KomootImportRequest request, UUID fitPubUserId) { List activities = new ArrayList<>(); + Set importedKomootActivityIds = new HashSet<>( + activityRepository.findImportedKomootActivityIdsByUserId(fitPubUserId)); URI nextUri = buildInitialUri(request); HttpEntity httpEntity = new HttpEntity<>(buildHeaders(request.email(), request.password())); @@ -76,7 +78,7 @@ public class KomootImportService { if (root == null) { throw new IllegalStateException("Komoot returned an empty response body."); } - extractActivities(root, activities); + extractActivities(root, activities, importedKomootActivityIds); nextUri = extractNextUri(root); } } catch (HttpClientErrorException.Unauthorized | HttpClientErrorException.Forbidden e) { @@ -223,24 +225,27 @@ public class KomootImportService { return "Basic " + encoded; } - private void extractActivities(JsonNode root, List activities) { + private void extractActivities(JsonNode root, List activities, Set importedKomootActivityIds) { JsonNode tours = root.path("_embedded").path("tours"); if (!tours.isArray()) { return; } for (JsonNode tour : tours) { + long activityId = tour.path("id").asLong(); activities.add(new KomootActivitySummaryDTO( - tour.path("id").asLong(), + activityId, nullableText(tour, "name"), nullableText(tour, "sport"), + mapKomootSportToActivityType(nullableText(tour, "sport")).name(), nullableText(tour, "status"), nullableText(tour, "type"), parseDate(tour.path("date").asText(null)), nullableDouble(tour, "distance"), nullableInteger(tour, "duration"), nullableInteger(tour, "time_in_motion"), - nullableDouble(tour, "elevation_up") + nullableDouble(tour, "elevation_up"), + importedKomootActivityIds.contains(activityId) )); } } @@ -312,7 +317,7 @@ public class KomootImportService { Set importedKomootActivityIds = new HashSet<>( activityRepository.findImportedKomootActivityIdsByUserId(fitPubUserId)); - List activities = new ArrayList<>(fetchCompletedActivities(request).activities()); + List activities = new ArrayList<>(fetchCompletedActivities(request, fitPubUserId).activities()); activities.sort(Comparator.comparing( KomootActivitySummaryDTO::date, Comparator.nullsLast(Comparator.reverseOrder()) diff --git a/src/main/resources/templates/activities/komoot.html b/src/main/resources/templates/activities/komoot.html index c99e6db..2bfdbfd 100644 --- a/src/main/resources/templates/activities/komoot.html +++ b/src/main/resources/templates/activities/komoot.html @@ -74,7 +74,7 @@