backend: initial commit

This commit is contained in:
Davide Scaini
2026-03-28 13:57:12 +01:00
commit 38c5423aeb
36 changed files with 2463 additions and 0 deletions
+74
View File
@@ -0,0 +1,74 @@
/** TypeScript types mirroring BAS v1.0 schema. */
export type Sport = "cycling" | "running" | "hiking" | "walking" | "swimming" | "other";
export type SubSport = "road" | "mountain" | "gravel" | "indoor" | "trail" | "track" | null;
export type Privacy = "public" | "blur_start" | "no_gps" | "private";
export interface ActivitySummary {
id: string;
title: string;
sport: Sport;
sub_sport: SubSport;
started_at: string; // ISO 8601
distance_m: number | null;
duration_s: number | null;
moving_time_s: number | null;
elevation_gain_m: number | null;
avg_speed_kmh: number | null;
max_speed_kmh: number | null;
avg_hr_bpm: number | null;
max_hr_bpm: number | null;
avg_cadence_rpm: number | null;
avg_power_w: number | null;
source: string | null;
privacy: Privacy;
detail_url: string | null;
track_url: string | null;
}
export interface BASIndex {
bas_version: string;
owner: { handle: string; display_name: string; avatar_url: string | null };
generated_at: string;
shards: Array<{ year: number; url: string; count: number }>;
activities: ActivitySummary[];
}
export interface Timeseries {
t: number[];
lat: number[] | null;
lon: number[] | null;
elevation_m: (number | null)[];
speed_kmh: (number | null)[];
hr_bpm: (number | null)[];
cadence_rpm: (number | null)[];
power_w: (number | null)[];
temperature_c: (number | null)[];
}
export interface ActivityDetail extends ActivitySummary {
description: string | null;
elevation_loss_m: number | null;
max_power_w: number | null;
gear: string | null;
device: string | null;
bbox: [number, number, number, number] | null;
start_latlng: [number, number] | null;
end_latlng: [number, number] | null;
laps: Lap[];
timeseries: Timeseries;
strava_id: string | null;
duplicate_of: string | null;
custom: Record<string, unknown>;
}
export interface Lap {
index: number;
started_at: string;
duration_s: number | null;
distance_m: number | null;
elevation_gain_m: number | null;
avg_speed_kmh: number | null;
avg_hr_bpm: number | null;
avg_power_w: number | null;
}