Commit Graph

262 Commits

Author SHA1 Message Date
Eric Gullickson
b611b56336 Initial Commit 2025-12-17 15:43:32 -06:00
Eric Gullickson
cd0cfa8913 Vehicle drop down and Gas Station fixes 2025-12-17 10:49:29 -06:00
Eric Gullickson
263fc434b0 Photos for vehicles 2025-12-15 21:39:51 -06:00
Eric Gullickson
e1c48b7a26 Added Logos 2025-12-15 21:13:23 -06:00
Eric Gullickson
b84d4c7fef Vehicle ETL Process fixed. Admin settings fixed. 2025-12-15 20:51:52 -06:00
Eric Gullickson
1e599e334f Possible working ETL 2025-12-15 18:19:55 -06:00
Eric Gullickson
a9fc7741a6 Improved the UX on Stations Page 2025-12-14 12:51:29 -06:00
Eric Gullickson
bcb1cea311 Security fix: Implement Google Maps API photo proxy (Fix 3)
Completed HIGH severity security fix (CVSS 6.5) to prevent Google Maps
API key exposure to frontend clients.

Issue: API key was embedded in photo URLs sent to frontend, allowing
potential abuse and quota exhaustion.

Solution: Implemented backend proxy endpoint for photos.

Backend Changes:
- google-maps.client.ts: Changed photoUrl to photoReference, added fetchPhoto()
- stations.types.ts: Updated type definition (photoUrl → photoReference)
- stations.controller.ts: Added getStationPhoto() proxy method
- stations.routes.ts: Added GET /api/stations/photo/:reference route
- stations.service.ts: Updated to use photoReference
- stations.repository.ts: Updated database queries and mappings
- admin controllers/services: Updated for consistency
- Created migration 003 to rename photo_url column

Frontend Changes:
- stations.types.ts: Updated type definition (photoUrl → photoReference)
- photo-utils.ts: NEW - Helper to generate proxy URLs
- StationCard.tsx: Use photoReference with helper function

Tests & Docs:
- Updated mock data to use photoReference
- Updated test expectations for proxy URLs
- Updated API.md and TESTING.md documentation

Database Migration:
- 003_rename_photo_url_to_photo_reference.sql: Renames column in station_cache

Security Benefits:
- API key never sent to frontend
- All photo requests proxied through authenticated endpoint
- Photos cached for 24 hours (Cache-Control header)
- No client-side API key exposure

Files modified: 16 files
New files: 2 (photo-utils.ts, migration 003)

Status: All 3 P0 security fixes now complete
- Fix 1: crypto.randomBytes() ✓
- Fix 2: Magic byte validation ✓
- Fix 3: API key proxy ✓

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2025-12-14 09:56:33 -06:00
Eric Gullickson
8376aee7ed Updates to database and API for dropdowns. 2025-11-11 10:29:02 -06:00
Eric Gullickson
b1755d415c Bug Fixes 2025-11-09 10:37:27 -06:00
Eric Gullickson
408a0736c0 Almost ready 2025-11-08 15:34:29 -06:00
Eric Gullickson
bb4a356b9e Google Maps Bug 2025-11-08 12:17:29 -06:00
Eric Gullickson
efbe9ba3c0 Vehicle Admin improvements 2025-11-07 16:03:50 -06:00
Eric Gullickson
daf1f71e2c Make/Model Data Loading 2025-11-07 13:51:47 -06:00
Eric Gullickson
d30c2bad8f Fix Admin Interface 2025-11-06 20:36:31 -06:00
Eric Gullickson
5630979adf Admin Page work - Still blank/broken 2025-11-06 16:29:11 -06:00
Eric Gullickson
8174e0d5f9 Admin User v1 2025-11-05 19:04:06 -06:00
Eric Gullickson
e4e7e32a4f Homepage Improvements 2025-11-05 11:15:33 -06:00
Eric Gullickson
0c3ed01f4b Pre-web changes 2025-11-05 11:04:48 -06:00
Eric Gullickson
45fea0f307 Gas Station Feature Finally Working 2025-11-04 21:05:12 -06:00
Eric Gullickson
9a01ebd847 Suppress harmless Google Maps DOM errors
Google Maps and React both manipulate the DOM, causing race conditions where
Google Maps removes nodes that React still has references to. This manifests
as a NotFoundError during removeChild operations, which is harmless and doesn't
affect functionality.

Add a global error event listener in StationMap that suppresses these specific
errors. Also revert to using script.async=true with callback parameter for
proper asynchronous Google Maps loading.

The map continues to work normally despite the suppressed errors.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:38:40 -06:00
Eric Gullickson
715250d50d Add error handling for Google Maps DOM conflicts with React
The Google Maps API and React both manipulate the DOM, which can cause
conflicts where Google Maps removes nodes that React still has references
to. Add graceful error handling:

1. Remove async flag from Google Maps script - use defer only
2. Add try-catch in marker update useEffect to ignore removeChild errors
3. Add cleanup function to properly tear down markers on unmount
4. Log warnings instead of crashing when DOM conflicts occur

This allows the app to continue functioning even when there are minor
DOM reconciliation issues between Google Maps and React.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:37:27 -06:00
Eric Gullickson
8e52f3fb0e Fix Google Maps API callback for async loading
The loading=async parameter requires a callback to notify when the API
is ready. Without a callback, google.maps is not properly initialized.

Use a global callback function with a timestamp suffix to handle the
async initialization properly, ensuring google.maps.Map constructor
is available when the component tries to initialize the map.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:36:03 -06:00
Eric Gullickson
4151f58fa5 Fix Google Maps async loading parameter
Add loading=async query parameter to Google Maps API URL to prevent
synchronous DOM manipulation. This fixes the warning:
'Google Maps JavaScript API has been loaded directly without loading=async'

The loading=async parameter tells Google Maps to defer API initialization
until the script is fully loaded, preventing race conditions with React's
DOM management.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:33:12 -06:00
Eric Gullickson
def2494ed7 Replace promise-based auth initialization with polling
The promise-based waitForAuthInit() approach wasn't reliably triggering
React state updates when setAuthInitialized(true) was called. Replace with
a polling mechanism that actively checks isAuthInitialized() every 50ms
with exponential backoff, ensuring state updates trigger properly.

This fixes the hanging "Initializing session..." issue where the auth gate
remained stuck waiting indefinitely.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:31:03 -06:00
Eric Gullickson
f1dd48808b Fix blank stations page - add auth gate guard in App.tsx
ROOT CAUSE: Race condition where StationsPage renders before auth
token is ready, causing DOM state mismatch.

Timeline of the bug:
1. Auth0 sets isAuthenticated=true
2. App renders StationsPage before isAuthInitialized=true
3. useSavedStations hook is disabled (enabled: false)
4. Google Maps loads and manipulates DOM
5. Auth token finally acquired, isAuthInitialized=true
6. Component re-renders with query now enabled
7. React tries to remove DOM nodes already removed by Google Maps
8. NotFoundError: removeChild fails

SOLUTION: Add isAuthGateReady check in App.tsx before rendering
protected routes. Show "Initializing session..." until auth gate is
fully initialized.

Changes:
- Import useIsAuthInitialized hook in App.tsx
- Call hook in App component
- Add guard check after isAuthenticated check
- Show loading UI if authenticated but auth gate not ready
- Add debug logs to track render flow

Now the page won't render until BOTH:
1. isAuthenticated=true (Auth0)
2. isAuthInitialized=true (our token gate)

This prevents the race condition that causes the removeChild DOM error.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:26:21 -06:00
Eric Gullickson
050f1b030e Enable console debugging and add debug statements
- Enable console logging in vite.config.ts:
  - Set drop_console to false
  - Disabled pure_funcs stripping for console.log
  - Changed esbuild to only drop debugger, keep console

- Add debug logging to auth-gate.ts:
  - Log setAuthInitialized calls

- Add debug logging to useSavedStations.ts:
  - Log hook invocations
  - Log query function execution and results
  - Added retry configuration

- Add debug logging to StationsPage.tsx:
  - Log component renders
  - Log useSavedStations result state

These logs will show us what's happening with auth initialization and
query state transitions that are causing the React DOM removeChild error.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:24:20 -06:00
Eric Gullickson
0e8d8e7d5e Fix blank stations page by waiting for auth initialization
- Add useIsAuthInitialized hook to auth-gate for reactive auth state
  - Returns true once auth token is acquired and ready
  - Waits for waitForAuthInit() promise to resolve

- Update useSavedStations hook to wait for auth before fetching
  - Add 'enabled: isAuthInitialized' to useQuery config
  - Prevents 401 errors from requests made before token is ready
  - Fixes race condition where hook fires before interceptor is set up

The stations page was blank because useSavedStations() made an API call
with refetchOnMount:true before the auth token interceptor was added,
causing a 401 response that made the component unmount/remount, creating
a React DOM error in the error boundary.

Now the hook waits for isAuthInitialized to be true before making the
initial API call, ensuring the token interceptor is ready.

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:15:03 -06:00
Eric Gullickson
9a41a3c417 Fix API endpoint routing errors and Traefik configuration
- Fix: Remove double /api prefix in stations API calls
  - stations.api.ts was using '/api/stations' but apiClient already prepends '/api'
  - Changed API_BASE from '/api/stations' to '/stations'
  - This resolves 404 errors on /api/api/stations/saved and similar endpoints

- Fix: Remove invalid access-log middleware from Traefik config
  - The accessLog field is only valid in traefik.yml main config, not as a middleware
  - Removed the invalid access-log middleware definition
  - This resolves Traefik configuration errors during startup

These changes resolve the console errors:
- GET https://motovaultpro.com/api/vehicles 404
- GET https://motovaultpro.com/api/api/stations/saved 404

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-04 19:10:30 -06:00
Eric Gullickson
c6f43fe86b Merge branch 'main' of github.com:ericgullickson/motovaultpro 2025-11-04 18:47:06 -06:00
Eric Gullickson
5dc58d73b9 Gas Station Feature 2025-11-04 18:46:46 -06:00
Eric Gullickson
d4156cf521 Stuff 2025-11-04 18:38:06 -06:00
Eric Gullickson
eeb20543fa Homepage Redesign 2025-11-03 14:06:54 -06:00
Eric Gullickson
cde14f2766 URL Fix 2025-11-01 22:01:18 -05:00
Eric Gullickson
046c66fc7d Redesign 2025-11-01 21:27:42 -05:00
Eric Gullickson
5638d3960b Update 2025-10-16 19:20:30 -05:00
Eric Gullickson
775a1ff69e Added Documents Feature 2025-09-28 20:35:46 -05:00
Eric Gullickson
2e1b588270 UX Improvements 2025-09-26 14:45:03 -05:00
Eric Gullickson
56443d5b2f Record UX improvements 2025-09-25 15:07:31 -05:00
Eric Gullickson
82c66dafed Fixed mobile form 2025-09-25 14:21:23 -05:00
Eric gullickson
d4ca0ba8ae Debugging 2025-09-22 20:58:02 -05:00
Eric gullickson
d4befe31d1 Debugging 2025-09-22 20:49:44 -05:00
Eric gullickson
3c741c545f Merge branch 'main' of github.com:ericgullickson/motovaultpro 2025-09-22 20:33:44 -05:00
Eric gullickson
0f39e5eb7f Mobile Bug Fixes 2025-09-22 20:31:27 -05:00
Eric Gullickson
8fd7973656 Fix Auth Errors 2025-09-22 10:27:10 -05:00
Eric Gullickson
3588372cef Mobile Work 2025-09-19 11:33:31 -05:00
Eric Gullickson
040da4c759 k8s redesign complete 2025-09-18 22:44:30 -05:00
Eric Gullickson
17d27f4b92 k8s improvement 2025-09-17 20:47:42 -05:00
Eric Gullickson
a052040e3a Initial Commit 2025-09-17 16:09:15 -05:00
Eric Gullickson
0cdb9803de Updated frameworks. 2025-08-25 12:40:27 -05:00