Commit graph

39 commits

Author SHA1 Message Date
Tim Zöller
0fe0810f51 Quality of Life, Security 2026-01-03 22:30:04 +01:00
Tim Zöller
5455f8cd36 Fix dark mode contrast issues on notifications page
- Active tab (ALL/UNREAD): Light text on dark background instead of white-on-white
- Unread notifications: Cyan-tinted semi-transparent background for visibility
- Actor names: Light color (#e8e8f0) for proper contrast in dark mode
- Hover states: Dark purple background (#301550) instead of white
- Notification icons: Semi-transparent backgrounds with bright neon colors

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-03 21:03:58 +01:00
Tim Zöller
a19d4870f7 Batch Import 2026-01-03 08:56:57 +01:00
Tim Zöller
f4be439002 Add GPX file support for activity imports
This commit adds comprehensive GPX file support alongside existing FIT file support, enabling users to import activities from Strava, Komoot, and other GPS apps.

## Key Features

### Core Components
- **GpxParser**: Full GPX 1.1 parsing with Garmin TrackPointExtension support
- **GpxFileValidator**: Validation for GPX file format and structure
- **ActivityFileService**: Unified service with automatic format detection (FIT/GPX)
- **ParsedActivityData**: Common data structure for both FIT and GPX files

### GPX Parsing Capabilities
- GPS track point extraction (latitude, longitude, elevation, timestamp)
- Garmin extension data (heart rate, cadence, temperature)
- Activity type detection from GPX metadata
- Distance calculation using Haversine formula
- Elevation gain/loss calculation
- Speed calculation from consecutive GPS points
- Speed smoothing to remove GPS artifacts
- Timezone detection from GPS coordinates
- Moving time vs. stopped time analysis

### Database Changes
- Migration V15: Renamed raw_fit_file → raw_activity_file
- Added source_file_format column (FIT/GPX) with constraint
- Index on source_file_format for performance
- Updated Activity entity with new fields

### Controller & UI Updates
- ActivityController: Now handles both FIT and GPX uploads
- Upload form: Updated to accept .fit and .gpx files
- Help text: Clarified both formats are supported

### Testing
- GpxParserIntegrationTest: 9 comprehensive tests with real GPX file
- Tests cover: parsing, validation, heart rate extraction, distance calculation,
  elevation metrics, speed calculation, chronological ordering, smoothing
- Fixed TrainingLoadServiceTest date issue (testDate outside 30-day window)
- All 97 unit tests passing (integration tests require Docker)

### Technical Details
- Supports GPX 1.0 and 1.1 specifications
- Handles multiple track segments
- Processes Garmin TrackPointExtension v1 and v2
- Same track simplification as FIT (Douglas-Peucker algorithm)
- Consistent JSONB storage format for track points
- Compatible with existing analytics, heatmaps, and image generation

## Testing Summary
-  9/9 GpxParserIntegrationTest tests passing
-  4/4 FitParserIntegrationTest tests passing
-  14/14 FitFileServiceTest tests passing
-  97/97 total unit tests passing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-02 13:31:05 +01:00
Tim Zöller
66b14ebf7f Add on-demand heatmap rebuild and remove nightly scheduler
- Added rebuild button to heatmap page with loading states
- Added POST /api/heatmap/me/rebuild endpoint for on-demand recalculation
- Removed HeatmapRecalculationScheduler (nightly 3 AM cron job)
- Removed @EnableScheduling annotation since no schedulers remain
- Users can now rebuild their heatmap manually instead of relying on automatic nightly recalculation

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-02 09:21:52 +01:00
Tim Zöller
f391028061 Added Heatmaps 2026-01-01 23:48:05 +01:00
Tim Zöller
5b687883b0 Better Federation Support 2025-12-15 21:55:17 +01:00
Tim Zöller
fe05e2ffa4 Follow Users on the instance 2025-12-15 10:25:40 +01:00
Tim Zöller
cc59701337 Small visual fixes 2025-12-15 09:07:15 +01:00
Tim Zöller
566fc90249 Small visual fixes 2025-12-15 09:03:15 +01:00
Tim Zöller
7c957e5135 Chart Rendering fixed for analytics 2025-12-15 08:42:39 +01:00
Tim Zöller
1569114593 Quality of Life Improvements 2025-12-14 17:22:36 +01:00
Tim Zöller
114d92c453 Optical improvements, don't duplicate initially created entries 2025-12-14 17:11:24 +01:00
Tim Zöller
cbf4060441 Tests 2025-12-05 20:38:54 +01:00
Tim Zöller
0e81a65d62 Good stuff 2025-12-05 10:21:45 +01:00
Tim Zöller
9e428a0499 Nicer sharepics 2025-12-04 22:39:15 +01:00
Tim Zöller
5b0648f0d0 Stuff 2025-12-04 18:46:20 +01:00
Tim Zöller
7d07653d2a Stuff 2025-12-04 18:39:01 +01:00
Tim Zöller
7e4b1d50d7 Nice things 2025-12-04 13:04:08 +01:00
Tim Zöller
67a8aad4f1 Nice things 2025-12-04 12:53:12 +01:00
Tim Zöller
362680f774 Nice things 2025-12-04 12:44:18 +01:00
Tim Zöller
da7d58b548 Nice things 2025-12-04 09:09:12 +01:00
Tim Zöller
facade014a Notification System 2025-12-04 08:59:44 +01:00
Tim Zöller
3ec22c4770 More graphs 2025-12-04 08:24:20 +01:00
Tim Zöller
a399179bf6 More graphs 2025-12-04 08:19:53 +01:00
Tim Zöller
37d0e3132b Follower UI 2025-12-04 08:09:44 +01:00
Tim Zöller
8545a3f43b Follower UI 2025-12-03 23:05:37 +01:00
Tim Zöller
a0d6518cd3 Moar federation 2025-12-03 21:34:21 +01:00
Tim Zöller
09413bc7f3 Moar federation 2025-12-03 20:33:09 +01:00
Tim Zöller
fe1b5f8be0 Remove registration page and redirect home to timeline
Remove the registration UI page completely and use the public timeline as the default start page.

Changes:
- Delete auth/register.html template
- Remove /register route from AuthViewController
- Update HomeController to redirect / to /timeline
- Remove /register from public paths list in auth.js

Users will no longer see a registration option in the UI. Registration can only be done via direct API calls if enabled.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 17:41:41 +01:00
Tim Zöller
bc6741a749 Add global registration disable feature
Implement configurable registration control to allow administrators to disable new user signups.

Backend changes:
- Add fitpub.registration.enabled configuration property (defaults to true)
- Update AuthController to check registration status and return 403 Forbidden when disabled
- Create GET /api/auth/registration-status endpoint to expose registration status to frontend
- Add RegistrationStatusResponse DTO

Configuration changes:
- Add REGISTRATION_ENABLED environment variable to application.yml
- Add REGISTRATION_ENABLED to Dockerfile with default value of true
- Update .env.example with REGISTRATION_ENABLED documentation

Frontend changes:
- Update registration page to check status and hide form when disabled
- Add checkRegistrationStatus() to auth.js to dynamically hide registration links
- Display user-friendly message when registration is disabled

To disable registration, set environment variable: REGISTRATION_ENABLED=false

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 11:27:19 +01:00
Tim Zöller
a3ff96653a Moar federation 2025-12-03 07:23:53 +01:00
Tim Zöller
45e9030c1d Moar federation 2025-12-03 07:18:43 +01:00
Tim Zöller
4c9bcc718f Moar federation 2025-12-02 22:23:29 +01:00
Tim Zöller
d47daa6dfc Show public activities to everrybody 2025-12-02 22:01:27 +01:00
Tim Zöller
71aa6ffffe Moar federation 2025-12-01 09:52:50 +01:00
Tim Zöller
d42f9b5339 More fixes 2025-11-30 10:33:28 +01:00
Tim Zöller
ac53f04e0a MVP done 2025-11-29 09:56:55 +01:00
Tim Zöller
c1729a629d More vibin 2025-11-28 21:04:38 +01:00