- Rust 92.7%
- Nix 5.4%
- Shell 1.9%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
The bulk import loop awaited importActivity() one row at a time, so with N visible activities the browser paid N sequential round trips (plus each activity's own processing time) back to back. Requests now fire concurrently via Promise.allSettled, with the button label updating live as each one finishes. The backend already handles concurrent activity imports fine -- each goes through its own DB transaction and its own geo::crossings_for_track query -- so this is purely a client-side change. |
||
| 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