Activities

This commit is contained in:
2026-04-19 13:08:13 +02:00
parent 47dbec287b
commit 54b9d5834e
8 changed files with 94 additions and 2 deletions

View File

@@ -32,6 +32,9 @@ public abstract class AbstractActivity extends AbstractTimestampedEntity {
@Column
public String sportType;
@Column
public ActivityTypeEnum activityType;
@Column
public Instant startTime;

View File

@@ -29,6 +29,27 @@ public enum ActivityTypeEnum implements PersistableEnum<ActivityTypeEnum> {
this.key = key;
}
public static ActivityTypeEnum fromSportType(final String sportType) {
return switch (sportType) {
case "Ride" -> RIDE;
case "Run" -> RUN;
case "Swim" -> SWIM;
case "Workout" -> WORKOUT;
case "VirtualSki" -> VIRTUAL_SKI;
case "VirtualRide" -> VIRTUAL_RIDE;
case "Hike" -> HIKE;
case "Walk" -> WALK;
case "WeightTraining" -> WEIGHT_TRAINING;
case "Pilates" -> PILATES;
case "NordicSki" -> NORDIC_SKI;
case "VirtualRow" -> VIRTUAL_ROW;
case "Rowing" -> ROWING;
case "Yoga" -> YOGA;
case "TrailRun" -> TRAIL_RUN;
default -> OTHER;
};
}
@Override
public Integer getKey() {
return key;

View File

@@ -3,6 +3,7 @@ package com.peakup.connector.intervals.mapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.peakup.activity.model.ActivityAchievement;
import com.peakup.activity.model.ActivityTypeEnum;
import com.peakup.activity.model.ActivityAttachment;
import com.peakup.activity.model.ActivityMapStreamPoint;
import com.peakup.activity.model.ActivityStreamPoint;
@@ -35,7 +36,7 @@ import java.util.stream.Collectors;
componentModel = MappingConstants.ComponentModel.CDI,
unmappedTargetPolicy = ReportingPolicy.ERROR,
unmappedSourcePolicy = ReportingPolicy.IGNORE,
imports = {NullableUtils.class, Instant.class}
imports = {NullableUtils.class, Instant.class, ActivityTypeEnum.class}
)
public abstract class IntervalsActivityMapper {
@@ -59,6 +60,7 @@ public abstract class IntervalsActivityMapper {
@Mapping(target = "name", expression = "java(NullableUtils.defaultValue(src.name))")
@Mapping(target = "type", expression = "java(NullableUtils.defaultValue(src.type))")
@Mapping(target = "sportType", expression = "java(NullableUtils.defaultValue(src.type))")
@Mapping(target = "activityType", expression = "java(ActivityTypeEnum.fromSportType(src.type))")
@Mapping(target = "timezone", expression = "java(NullableUtils.defaultValue(src.timezone))")
@Mapping(target = "startTime", expression = "java(src.start_date != null ? Instant.parse(src.start_date) : null)")
@Mapping(target = "distanceM", expression = "java(NullableUtils.defaultValue(src.distance))")

View File

@@ -1,5 +1,6 @@
package com.peakup.connector.strava.mapper;
import com.peakup.activity.model.ActivityTypeEnum;
import com.peakup.activity.model.IntervalsImportStatusEnum;
import com.peakup.activity.model.StravaActivity;
import com.peakup.common.NullableUtils;
@@ -18,7 +19,7 @@ import java.time.Instant;
componentModel = MappingConstants.ComponentModel.CDI,
unmappedTargetPolicy = ReportingPolicy.ERROR,
unmappedSourcePolicy = ReportingPolicy.IGNORE,
imports = {NullableUtils.class, Instant.class, IntervalsImportStatusEnum.class}
imports = {NullableUtils.class, Instant.class, IntervalsImportStatusEnum.class, ActivityTypeEnum.class}
)
public interface StravaActivityMapper {
@@ -32,6 +33,7 @@ public interface StravaActivityMapper {
@Mapping(target = "name", expression = "java(NullableUtils.defaultValue(src.name))")
@Mapping(target = "type", expression = "java(NullableUtils.defaultValue(src.type))")
@Mapping(target = "sportType", expression = "java(NullableUtils.defaultValue(src.sport_type))")
@Mapping(target = "activityType", expression = "java(ActivityTypeEnum.fromSportType(src.sport_type))")
@Mapping(target = "timezone", expression = "java(NullableUtils.defaultValue(src.timezone))")
@Mapping(target = "startTime", expression = "java(src.start_date != null ? Instant.parse(src.start_date) : null)")
@Mapping(target = "distanceM", expression = "java(NullableUtils.defaultValue(src.distance))")

View File

@@ -0,0 +1,39 @@
ALTER TABLE strava_activity ADD COLUMN IF NOT EXISTS activity_type INTEGER NOT NULL DEFAULT 100;
UPDATE strava_activity SET activity_type = CASE sport_type
WHEN 'Ride' THEN 1
WHEN 'Run' THEN 2
WHEN 'Swim' THEN 3
WHEN 'Workout' THEN 6
WHEN 'VirtualSki' THEN 7
WHEN 'VirtualRide' THEN 8
WHEN 'Hike' THEN 9
WHEN 'Walk' THEN 10
WHEN 'WeightTraining' THEN 11
WHEN 'Pilates' THEN 12
WHEN 'NordicSki' THEN 13
WHEN 'VirtualRow' THEN 14
WHEN 'Rowing' THEN 15
WHEN 'Yoga' THEN 16
WHEN 'TrailRun' THEN 17
ELSE 100
END;
ALTER TABLE intervals_activity ADD COLUMN IF NOT EXISTS activity_type INTEGER NOT NULL DEFAULT 100;
UPDATE intervals_activity SET activity_type = CASE type
WHEN 'Ride' THEN 1
WHEN 'Run' THEN 2
WHEN 'Swim' THEN 3
WHEN 'Workout' THEN 6
WHEN 'VirtualSki' THEN 7
WHEN 'VirtualRide' THEN 8
WHEN 'Hike' THEN 9
WHEN 'Walk' THEN 10
WHEN 'WeightTraining' THEN 11
WHEN 'Pilates' THEN 12
WHEN 'NordicSki' THEN 13
WHEN 'VirtualRow' THEN 14
WHEN 'Rowing' THEN 15
WHEN 'Yoga' THEN 16
WHEN 'TrailRun' THEN 17
ELSE 100
END;

View File

@@ -2,6 +2,7 @@ package com.peakup.workout;
import com.peakup.AbstractPeakUpTest;
import com.peakup.activity.dao.IntervalsActivityDAO;
import com.peakup.activity.model.ActivityTypeEnum;
import com.peakup.activity.model.IntervalsActivity;
import com.peakup.activity.service.IntervalsActivityService;
import com.peakup.workout.dao.WorkoutDAO;
@@ -77,6 +78,7 @@ class WorkoutLinkTest extends AbstractPeakUpTest {
a.setName("Morning Ride");
a.setType("Ride");
a.setSportType("Ride");
a.setActivityType(ActivityTypeEnum.RIDE);
a.setStartTime(Instant.parse("2026-03-26T08:00:00Z"));
a.setDistanceM(40000.0);
a.setMovingTimeS(3600L);

View File

@@ -1,6 +1,7 @@
// GENERATED — do not edit manually.
import type { AbstractTimestampedEntityDo } from './AbstractTimestampedEntityDo';
import type { ActivityTypeEnum } from './ActivityTypeEnum';
export interface AbstractActivityDo extends AbstractTimestampedEntityDo {
athleteId: number;
@@ -8,6 +9,7 @@ export interface AbstractActivityDo extends AbstractTimestampedEntityDo {
name: string;
type: string;
sportType: string;
activityType: ActivityTypeEnum;
startTime: string;
timezone: string;
distanceM: number;

View File

@@ -0,0 +1,21 @@
// GENERATED — do not edit manually.
export type ActivityTypeEnum =
| 'RIDE'
| 'RUN'
| 'SWIM'
| 'OPENWATER'
| 'STRENGTH'
| 'WORKOUT'
| 'VIRTUAL_SKI'
| 'VIRTUAL_RIDE'
| 'HIKE'
| 'WALK'
| 'WEIGHT_TRAINING'
| 'PILATES'
| 'NORDIC_SKI'
| 'VIRTUAL_ROW'
| 'ROWING'
| 'YOGA'
| 'TRAIL_RUN'
| 'OTHER';