Skip to content

Commit 35da8f1

Browse files
authored
Merge pull request #118 from RADAR-base/fix-fitbit-routes
Update routes to limit range to 30 days
2 parents 83906c5 + 8e2949d commit 35da8f1

File tree

4 files changed

+44
-36
lines changed

4 files changed

+44
-36
lines changed

kafka-connect-fitbit-source/src/main/java/org/radarbase/connect/rest/fitbit/route/FitbitBreathingRateRoute.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
import org.radarbase.connect.rest.fitbit.request.FitbitRestRequest;
2424
import org.radarbase.connect.rest.fitbit.user.User;
2525
import org.radarbase.connect.rest.fitbit.user.UserRepository;
26-
import org.radarbase.connect.rest.fitbit.util.DateRange;
2726

28-
import java.time.ZonedDateTime;
2927
import java.util.stream.Stream;
3028

31-
import static java.time.ZoneOffset.UTC;
3229
import static java.time.temporal.ChronoUnit.SECONDS;
30+
import java.time.Duration;
3331

3432
public class FitbitBreathingRateRoute extends FitbitPollingRoute {
3533
private final FitbitBreathingRateAvroConverter converter;
@@ -46,16 +44,19 @@ protected String getUrlFormat(String baseUrl) {
4644
}
4745

4846
protected Stream<FitbitRestRequest> createRequests(User user) {
49-
ZonedDateTime startDate = this.getOffset(user).plus(ONE_SECOND)
50-
.atZone(UTC)
51-
.truncatedTo(SECONDS);
52-
ZonedDateTime now = ZonedDateTime.now(UTC);
53-
return Stream.of(newRequest(user, new DateRange(startDate, now),
54-
user.getExternalUserId(), DATE_FORMAT.format(startDate), DATE_FORMAT.format(now)));
47+
return startDateGenerator(getOffset(user).plus(ONE_SECOND).truncatedTo(SECONDS))
48+
.map(dateRange -> newRequest(user, dateRange,
49+
user.getExternalUserId(), DATE_FORMAT.format(dateRange.start())));
50+
}
51+
52+
/** Limit range to 30 days as documented here: https://dev.fitbit.com/build/reference/web-api/intraday/get-br-intraday-by-interval/ */
53+
@Override
54+
Duration getDateRangeInterval() {
55+
return THIRTY_DAYS;
5556
}
5657

5758
@Override
5859
public FitbitBreathingRateAvroConverter converter() {
5960
return converter;
6061
}
61-
}
62+
}

kafka-connect-fitbit-source/src/main/java/org/radarbase/connect/rest/fitbit/route/FitbitIntradayHeartRateVariabilityRoute.java

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,17 @@
1818
package org.radarbase.connect.rest.fitbit.route;
1919

2020
import io.confluent.connect.avro.AvroData;
21-
import org.radarbase.connect.rest.fitbit.converter.FitbitIntradayHeartRateAvroConverter;
2221
import org.radarbase.connect.rest.fitbit.converter.FitbitIntradayHeartRateVariabilityAvroConverter;
2322
import org.radarbase.connect.rest.fitbit.request.FitbitRequestGenerator;
2423
import org.radarbase.connect.rest.fitbit.request.FitbitRestRequest;
2524
import org.radarbase.connect.rest.fitbit.user.User;
2625
import org.radarbase.connect.rest.fitbit.user.UserRepository;
27-
import org.radarbase.connect.rest.fitbit.util.DateRange;
2826

29-
import java.time.ZonedDateTime;
3027
import java.util.stream.Stream;
3128

32-
import static java.time.ZoneOffset.UTC;
3329
import static java.time.temporal.ChronoUnit.SECONDS;
30+
import java.time.Duration;
31+
3432

3533
public class FitbitIntradayHeartRateVariabilityRoute extends FitbitPollingRoute {
3634
private final FitbitIntradayHeartRateVariabilityAvroConverter converter;
@@ -47,16 +45,19 @@ protected String getUrlFormat(String baseUrl) {
4745
}
4846

4947
protected Stream<FitbitRestRequest> createRequests(User user) {
50-
ZonedDateTime startDate = this.getOffset(user).plus(ONE_SECOND)
51-
.atZone(UTC)
52-
.truncatedTo(SECONDS);
53-
ZonedDateTime now = ZonedDateTime.now(UTC);
54-
return Stream.of(newRequest(user, new DateRange(startDate, now),
55-
user.getExternalUserId(), DATE_FORMAT.format(startDate), DATE_FORMAT.format(now)));
48+
return startDateGenerator(getOffset(user).plus(ONE_SECOND).truncatedTo(SECONDS))
49+
.map(dateRange -> newRequest(user, dateRange,
50+
user.getExternalUserId(), DATE_FORMAT.format(dateRange.start())));
51+
}
52+
53+
/** Limit range to 30 days as documented here: https://dev.fitbit.com/build/reference/web-api/intraday/get-hrv-intraday-by-interval/ */
54+
@Override
55+
Duration getDateRangeInterval() {
56+
return THIRTY_DAYS;
5657
}
5758

5859
@Override
5960
public FitbitIntradayHeartRateVariabilityAvroConverter converter() {
6061
return converter;
6162
}
62-
}
63+
}

kafka-connect-fitbit-source/src/main/java/org/radarbase/connect/rest/fitbit/route/FitbitPollingRoute.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ public abstract class FitbitPollingRoute implements PollingRequestRoute {
9595
protected static final Duration LOOKBACK_TIME = Duration.ofDays(1); // 1 day
9696
protected static final long HISTORICAL_TIME_DAYS = 14L;
9797
protected static final Duration ONE_DAY = DAYS.getDuration();
98+
protected static final Duration THIRTY_DAYS = Duration.ofDays(30);
9899
protected static final Duration ONE_NANO = NANOS.getDuration();
99100
protected static final TemporalAmount ONE_SECOND = SECONDS.getDuration();
100101
protected static final TemporalAmount ONE_MINUTE = MINUTES.getDuration();
@@ -326,7 +327,7 @@ private TemporalAmount getEndDateThreshold() {
326327
}
327328

328329
/**
329-
* Generate one date per day, using UTC time zone. The first date will have the time from the
330+
* Generate one date per day (or specified rangeInterval), using UTC time zone. The first date will have the time from the
330331
* given startDate. Following time stamps will start at 00:00. This will not up to the date of
331332
* {@link #getLookbackTime()} (exclusive).
332333
*/
@@ -345,12 +346,12 @@ Stream<DateRange> startDateGenerator(Instant startDate) {
345346
return Stream.empty();
346347
}
347348
} else {
348-
long numElements = DAYS.between(startDate, lookBack);
349+
Duration rangeInterval = getDateRangeInterval();
349350

350351
Stream<DateRange> elements = Stream
351-
.iterate(dateTime, t -> t.plus(ONE_DAY).truncatedTo(DAYS))
352-
.limit(numElements)
353-
.map(s -> new DateRange(s, s.plus(ONE_DAY).truncatedTo(DAYS).minus(ONE_NANO)));
352+
.iterate(dateTime, t -> t.plus(rangeInterval).truncatedTo(DAYS))
353+
.takeWhile(u -> u.isBefore(lookBackDateStart))
354+
.map(s -> new DateRange(s, s.plus(rangeInterval).truncatedTo(DAYS).minus(ONE_NANO)));
354355

355356
// we're polling at exactly 00:00, should not poll the last date
356357
if (lookBackDateStart.equals(lookBackDate)) {
@@ -362,4 +363,8 @@ Stream<DateRange> startDateGenerator(Instant startDate) {
362363
}
363364
}
364365
}
366+
367+
Duration getDateRangeInterval() {
368+
return ONE_DAY;
369+
}
365370
}

kafka-connect-fitbit-source/src/main/java/org/radarbase/connect/rest/fitbit/route/FitbitSkinTemperatureRoute.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,11 @@
2323
import org.radarbase.connect.rest.fitbit.request.FitbitRestRequest;
2424
import org.radarbase.connect.rest.fitbit.user.User;
2525
import org.radarbase.connect.rest.fitbit.user.UserRepository;
26-
import org.radarbase.connect.rest.fitbit.util.DateRange;
2726

28-
import java.time.ZonedDateTime;
2927
import java.util.stream.Stream;
3028

31-
import static java.time.ZoneOffset.UTC;
3229
import static java.time.temporal.ChronoUnit.SECONDS;
30+
import java.time.Duration;
3331

3432
public class FitbitSkinTemperatureRoute extends FitbitPollingRoute {
3533
private final FitbitSkinTemperatureAvroConverter converter;
@@ -46,16 +44,19 @@ protected String getUrlFormat(String baseUrl) {
4644
}
4745

4846
protected Stream<FitbitRestRequest> createRequests(User user) {
49-
ZonedDateTime startDate = this.getOffset(user).plus(ONE_SECOND)
50-
.atZone(UTC)
51-
.truncatedTo(SECONDS);
52-
ZonedDateTime now = ZonedDateTime.now(UTC);
53-
return Stream.of(newRequest(user, new DateRange(startDate, now),
54-
user.getExternalUserId(), DATE_FORMAT.format(startDate), DATE_FORMAT.format(now)));
47+
return startDateGenerator(getOffset(user).plus(ONE_SECOND).truncatedTo(SECONDS))
48+
.map(dateRange -> newRequest(user, dateRange,
49+
user.getExternalUserId(), DATE_FORMAT.format(dateRange.start())));
50+
}
51+
52+
/** Limit range to 30 days as documented here: https://dev.fitbit.com/build/reference/web-api/temperature/get-temperature-skin-summary-by-interval */
53+
@Override
54+
Duration getDateRangeInterval() {
55+
return THIRTY_DAYS;
5556
}
5657

5758
@Override
5859
public FitbitSkinTemperatureAvroConverter converter() {
5960
return converter;
6061
}
61-
}
62+
}

0 commit comments

Comments
 (0)