- Rust 92.7%
- Nix 5.4%
- Shell 1.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
geo::crossings_between issued one DB round trip per consecutive GPS sample pair (tens of thousands per multi-hour activity), even though almost every segment stays inside a single county and produces no crossing at all. geo::crossings_for_track batches all segments of a track into a single query via UNNEST ... WITH ORDINALITY. The per-segment geometry logic (endpoint county lookup via the GiST index, boundary intersection, ST_LineLocatePoint for the fractional position) is unchanged, it now just runs once per activity instead of once per segment. |
||
| migrations | ||
| scripts | ||
| src | ||
| .env.example | ||
| .gitignore | ||
| Cargo.toml | ||
| flake.lock | ||
| flake.nix | ||
| README.md | ||
| rust-toolchain.toml | ||
County Sprints frontend/leaderboard update
Replace these files in the project:
src/main.rssrc/model.rssrc/db.rssrc/leaderboard.rssrc/web.rsmigrations/0001_initial.sql
No change is required to the working src/intervals.rs.
The existing src/webhook.rs can keep calling:
crate::process_activity(state_clone, athlete_id, activity_id.clone()).await
process_activity() now loads the athlete's OAuth access token itself. The development sync uses the explicit API-key client, so the personal development key is not written to the database.
Database
The migration is intentionally a complete replacement because the database can be reset during development.
The new schema adds:
leaderboard_groupsleaderboard_group_members- indexes for activity/crossing queries
Leaderboard location matching
Leaderboard rows are grouped by:
- 10-minute time bucket
- source county
- destination county
- spatial cluster with a 10 metre DBSCAN radius
The crossing geometry is transformed to EPSG:3857 before the 10 metre clustering calculation so the distance is measured in metres rather than degrees.
Frontend
The frontend now provides:
- Leaflet map for each leaderboard group
- small map for every individual crossing
- activity detail page at
/activity/{activity_id} - activity map containing all crossings
- browser-local timestamp formatting using
Intl.DateTimeFormat - leaderboard group management at
/groups - group selection on the main leaderboard
The map uses Leaflet and OpenStreetMap tiles. Leaflet's current stable 1.x documentation describes the same map/tile-layer APIs used here. citeturn0search2turn0search9