From 128a7ec34976bf73877eddf16ba252b8051786d2 Mon Sep 17 00:00:00 2001 From: Daniel Graf Date: Wed, 7 Jan 2026 20:37:48 +0100 Subject: [PATCH] 630 android timeline export never imports (#652) --- e2e/tests/timeband-locale.spec.js | 3 +-- .../reitti/repository/RawLocationPointJdbcService.java | 7 ++++++- .../reitti/service/VisitDetectionPreviewService.java | 2 +- .../reitti/service/importer/GeoJsonImporter.java | 1 + .../service/importer/GoogleAndroidTimelineImporter.java | 1 + .../reitti/service/importer/GoogleIOSTimelineImporter.java | 1 + .../reitti/service/importer/GoogleRecordsImporter.java | 3 ++- .../dedicatedcode/reitti/service/importer/GpxImporter.java | 1 + 8 files changed, 14 insertions(+), 5 deletions(-) diff --git a/e2e/tests/timeband-locale.spec.js b/e2e/tests/timeband-locale.spec.js index 3e951ba3..cc8ccedf 100644 --- a/e2e/tests/timeband-locale.spec.js +++ b/e2e/tests/timeband-locale.spec.js @@ -49,10 +49,9 @@ test.describe('Date Picker Tests', () => { test('should load correct date when in a different timezone at start of day', async ({page}) => { await page.clock.setFixedTime(new Date('2017-02-02T00:30:00')); - const responsePromise = page.waitForResponse('**/timeline/content/range?startDate=2017-12-20&endDate=2017-12-20&timezone=Europe%2FBerlin'); - await page.getByText('Wed20Dec').click() await expect(page.locator('div').filter({ hasText: 'Wed20Dec' }).nth(2)).toContainClass('selected'); + const responsePromise = page.waitForResponse('**/timeline/content/range?startDate=2017-12-20&endDate=2017-12-20&timezone=Europe%2FBerlin'); const response = await responsePromise; expect(response.status()).toBe(200); diff --git a/src/main/java/com/dedicatedcode/reitti/repository/RawLocationPointJdbcService.java b/src/main/java/com/dedicatedcode/reitti/repository/RawLocationPointJdbcService.java index 11476bc0..6434c897 100644 --- a/src/main/java/com/dedicatedcode/reitti/repository/RawLocationPointJdbcService.java +++ b/src/main/java/com/dedicatedcode/reitti/repository/RawLocationPointJdbcService.java @@ -189,7 +189,12 @@ public class RawLocationPointJdbcService { } public Optional findLatest(User user) { - return findLatest(user, Instant.EPOCH); + String sql = "SELECT rlp.id, rlp.accuracy_meters, rlp.elevation_meters, rlp.timestamp, rlp.user_id, ST_AsText(rlp.geom) as geom, rlp.processed, rlp.synthetic, rlp.ignored, rlp.invalid, rlp.version " + + "FROM raw_location_points rlp " + + "WHERE rlp.user_id = ? AND rlp.invalid = false " + + "ORDER BY rlp.timestamp DESC LIMIT 1"; + List results = jdbcTemplate.query(sql, rawLocationPointRowMapper, user.getId()); + return results.isEmpty() ? Optional.empty() : Optional.of(results.getFirst()); } public List findClusteredPointsInTimeRangeForUser( diff --git a/src/main/java/com/dedicatedcode/reitti/service/VisitDetectionPreviewService.java b/src/main/java/com/dedicatedcode/reitti/service/VisitDetectionPreviewService.java index 03291bd4..9e9f3912 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/VisitDetectionPreviewService.java +++ b/src/main/java/com/dedicatedcode/reitti/service/VisitDetectionPreviewService.java @@ -57,7 +57,7 @@ public class VisitDetectionPreviewService { Timestamp start = Timestamp.from(date.minus(config.getVisitMerging().getSearchDurationInHours() * 2, ChronoUnit.HOURS)); Timestamp end = Timestamp.from(date.plus(1, ChronoUnit.DAYS).plus(config.getVisitMerging().getSearchDurationInHours() * 2, ChronoUnit.HOURS)); this.jdbcTemplate.update("INSERT INTO preview_raw_location_points(accuracy_meters, timestamp, user_id, elevation_meters, geom, processed, version, ignored, synthetic, preview_id, preview_created_at) " + - "SELECT accuracy_meters, timestamp, user_id, elevation_meters, geom, false, version, ignored, synthetic, ?, ? FROM raw_location_points WHERE timestamp > ? AND timestamp <= ? AND user_id = ?", + "SELECT accuracy_meters, timestamp, user_id, elevation_meters, geom, false, version, ignored, synthetic, ?, ? FROM raw_location_points WHERE timestamp > ? AND timestamp <= ? AND user_id = ? AND invalid = false", previewId, Timestamp.valueOf(now), start, diff --git a/src/main/java/com/dedicatedcode/reitti/service/importer/GeoJsonImporter.java b/src/main/java/com/dedicatedcode/reitti/service/importer/GeoJsonImporter.java index 81e155d9..3266b310 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/importer/GeoJsonImporter.java +++ b/src/main/java/com/dedicatedcode/reitti/service/importer/GeoJsonImporter.java @@ -40,6 +40,7 @@ public class GeoJsonImporter { try { stateHolder.importStarted(); + logger.info("Importing GeoJSON file for user {}", user.getUsername()); JsonNode rootNode = objectMapper.readTree(inputStream); // Check if it's a valid GeoJSON diff --git a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleAndroidTimelineImporter.java b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleAndroidTimelineImporter.java index 7f7dd4dc..9dab2ecf 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleAndroidTimelineImporter.java +++ b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleAndroidTimelineImporter.java @@ -42,6 +42,7 @@ public class GoogleAndroidTimelineImporter extends BaseGoogleTimelineImporter { AtomicInteger processedCount = new AtomicInteger(0); try { + logger.info("Importing Google Timeline Android file for user {}", user.getUsername()); this.stateHolder.importStarted(); JsonFactory factory = objectMapper.getFactory(); JsonParser parser = factory.createParser(inputStream); diff --git a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleIOSTimelineImporter.java b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleIOSTimelineImporter.java index 6d082422..4d7e2b1c 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleIOSTimelineImporter.java +++ b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleIOSTimelineImporter.java @@ -40,6 +40,7 @@ public class GoogleIOSTimelineImporter extends BaseGoogleTimelineImporter { AtomicInteger processedCount = new AtomicInteger(0); try { + logger.info("Importing Google Timeline IOS file for user {}", user.getUsername()); stateHolder.importStarted(); JsonFactory factory = objectMapper.getFactory(); JsonParser parser = factory.createParser(inputStream); diff --git a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleRecordsImporter.java b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleRecordsImporter.java index 901e28a6..20e309c5 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleRecordsImporter.java +++ b/src/main/java/com/dedicatedcode/reitti/service/importer/GoogleRecordsImporter.java @@ -40,7 +40,8 @@ public class GoogleRecordsImporter { try { stateHolder.importStarted(); - // Use Jackson's streaming API to process the file + logger.info("Importing Google Records file for user {}", user.getUsername()); + JsonFactory factory = objectMapper.getFactory(); JsonParser parser = factory.createParser(inputStream); diff --git a/src/main/java/com/dedicatedcode/reitti/service/importer/GpxImporter.java b/src/main/java/com/dedicatedcode/reitti/service/importer/GpxImporter.java index a91bff70..c58e43cc 100644 --- a/src/main/java/com/dedicatedcode/reitti/service/importer/GpxImporter.java +++ b/src/main/java/com/dedicatedcode/reitti/service/importer/GpxImporter.java @@ -40,6 +40,7 @@ public class GpxImporter { try { stateHolder.importStarted(); + logger.info("Importing GPX file for user {}", user.getUsername()); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream);