Eric Gullickson
1bf550ae9b
feat: add pending vehicle association resolution UI (refs #160 )
...
Deploy to Staging / Build Images (pull_request) Successful in 8m40s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 52s
Deploy to Staging / Verify Staging (pull_request) Successful in 8s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 7s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
Backend: Add authenticated endpoints for pending association CRUD
(GET/POST/DELETE /api/email-ingestion/pending). Service methods for
resolving (creates fuel/maintenance record) and dismissing associations.
Frontend: New email-ingestion feature with types, API client, hooks,
PendingAssociationBanner (dashboard), PendingAssociationList, and
ResolveAssociationDialog. Mobile-first responsive with 44px touch
targets and full-screen dialogs on small screens.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-13 09:39:03 -06:00
Eric Gullickson
2462fff34d
feat: add Resend inbound webhook endpoint and client (refs #155 )
...
- ResendInboundClient: webhook signature verification via Svix, email
fetch/download/parse with mailparser
- POST /api/webhooks/resend/inbound endpoint with rawBody, signature
verification, idempotency check, queue insertion, async processing
- Config: resend_webhook_secret (optional) in secrets schema
- Route registration in app.ts following Stripe webhook pattern
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-02-13 08:22:25 -06:00
Eric Gullickson
852c9013b5
feat: add core OCR API integration (refs #65 )
...
Deploy to Staging / Build Images (pull_request) Successful in 5m59s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 31s
Deploy to Staging / Verify Staging (pull_request) Successful in 2m19s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 7s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
OCR Service (Python/FastAPI):
- POST /extract for synchronous OCR extraction
- POST /jobs and GET /jobs/{job_id} for async processing
- Image preprocessing (deskew, denoise) for accuracy
- HEIC conversion via pillow-heif
- Redis job queue for async processing
Backend (Fastify):
- POST /api/ocr/extract - authenticated proxy to OCR
- POST /api/ocr/jobs - async job submission
- GET /api/ocr/jobs/:jobId - job polling
- Multipart file upload handling
- JWT authentication required
File size limits: 10MB sync, 200MB async
Processing time target: <3 seconds for typical photos
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-02-01 16:02:11 -06:00
Eric Gullickson
56da99de36
feat: add donations feature with one-time payments - M6 (refs #55 )
2026-01-18 16:51:20 -06:00
Eric Gullickson
a8c4eba8d1
feat: add ownership-costs feature capsule (refs #15 )
...
- Create ownership_costs table for recurring vehicle costs
- Add backend feature capsule with types, repository, service, routes
- Update TCO calculation to use ownership_costs (with fallback to legacy vehicle fields)
- Add taxCosts and otherCosts to TCO response
- Create frontend ownership-costs feature with form, list, API, hooks
- Update TCODisplay to show all cost types
This implements a more flexible approach to tracking recurring ownership costs
(insurance, registration, tax, other) with explicit date ranges and optional
document association.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-12 21:28:25 -06:00
Eric Gullickson
197927ef31
test: add integration tests and documentation (refs #26 )
...
Deploy to Staging / Build Images (pull_request) Successful in 4m37s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 29s
Deploy to Staging / Verify Staging (pull_request) Successful in 7s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 7s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-11 20:05:06 -06:00
Eric Gullickson
a35d05f08a
feat: add import service and API layer (refs #26 )
...
Implements Milestone 3: Backend import service and API with:
Service Layer (user-import.service.ts):
- generatePreview(): extract archive, validate, detect VIN conflicts
- executeMerge(): chunk-based import (100 records/batch), UPDATE existing by VIN, INSERT new via batchInsert
- executeReplace(): transactional DELETE all user data, batchInsert all records
- Conflict detection: VIN duplicates in vehicles
- Error handling: collect errors per record, continue, report in summary
- File handling: copy vehicle images and documents from archive to storage
- Cleanup: delete temp directory in finally block
API Layer:
- POST /api/user/import: multipart upload, mode selection (merge/replace)
- POST /api/user/import/preview: preview without executing import
- Authentication: fastify.authenticate preHandler
- Content-Type validation: application/gzip or application/x-gzip
- Magic byte validation: FileType.fromBuffer verifies tar.gz
- Request validation: Zod schema for mode selection
- Response: ImportResult with success, mode, summary, warnings
Files Created:
- backend/src/features/user-import/domain/user-import.service.ts
- backend/src/features/user-import/api/user-import.controller.ts
- backend/src/features/user-import/api/user-import.routes.ts
- backend/src/features/user-import/api/user-import.validation.ts
Files Updated:
- backend/src/app.ts: register userImportRoutes with /api prefix
Quality:
- Type-check: PASS (0 errors)
- Linting: PASS (0 errors, 470 warnings - all pre-existing)
- Repository pattern: snake_case→camelCase conversion
- User-scoped: all queries filter by user_id
- Transaction boundaries: Replace mode atomic, Merge mode per-batch
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com >
2026-01-11 19:50:59 -06:00
Eric Gullickson
c98211f4a2
feat: Implement centralized audit logging admin interface (refs #10 )
...
Deploy to Staging / Build Images (pull_request) Successful in 4m42s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 37s
Deploy to Staging / Verify Staging (pull_request) Failing after 6s
Deploy to Staging / Notify Staging Ready (pull_request) Has been skipped
Deploy to Staging / Notify Staging Failure (pull_request) Successful in 6s
- Add audit_logs table with categories, severities, and indexes
- Create AuditLogService and AuditLogRepository
- Add REST API endpoints for viewing and exporting logs
- Wire audit logging into auth, vehicles, admin, and backup features
- Add desktop AdminLogsPage with filters and CSV export
- Add mobile AdminLogsMobileScreen with card layout
- Implement 90-day retention cleanup job
- Remove old AuditLogPanel from AdminCatalogPage
Security fixes:
- Escape LIKE special characters to prevent pattern injection
- Limit CSV export to 5000 records to prevent memory exhaustion
- Add truncation warning headers for large exports
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-11 11:09:09 -06:00
Eric Gullickson
f494f77150
feat: Implement user tier-based feature gating system (refs #8 )
...
Deploy to Staging / Build Images (pull_request) Successful in 4m35s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 27s
Deploy to Staging / Verify Staging (pull_request) Successful in 5s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 5s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
Add subscription tier system to gate features behind Free/Pro/Enterprise tiers.
Backend:
- Create feature-tiers.ts with FEATURE_TIERS config and utilities
- Add /api/config/feature-tiers endpoint for frontend config fetch
- Create requireTier middleware for route-level tier enforcement
- Add subscriptionTier to request.userContext in auth plugin
- Gate scanForMaintenance in documents controller (Pro+ required)
- Add migration to reset scanForMaintenance for free users
Frontend:
- Create useTierAccess hook for tier checking
- Create UpgradeRequiredDialog component (responsive)
- Gate DocumentForm checkbox with lock icon for free users
- Add SubscriptionTier type to profile.types.ts
Documentation:
- Add TIER-GATING.md with usage guide
Tests: 30 passing (feature-tiers, tier-guard, controller)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2026-01-04 14:34:47 -06:00
Eric Gullickson
fb52ce398b
feat: user export service. bug and UX fixes. Complete minus outstanding email template fixes.
2025-12-26 14:06:03 -06:00
Eric Gullickson
8ef6b3d853
fix: before admin stations removal
2025-12-24 17:20:11 -06:00
Eric Gullickson
4897f0a52c
feat: delete users - not tested
2025-12-22 18:20:25 -06:00
Eric Gullickson
91b4534e76
feat: Scheduled Maintenance feature complete
2025-12-22 14:12:33 -06:00
Eric Gullickson
719c80ecd8
Notification updates
2025-12-21 19:56:52 -06:00
Eric Gullickson
95f5e89e48
Community 93 Premium feature complete
2025-12-21 11:31:10 -06:00
Eric Gullickson
1bde31247f
Update dependencies and fix security vulnerabilities
...
Security fixes:
- get-jwks: 9.0.0 -> 11.0.3 (critical vulnerability)
- vite: 5.4.11 -> 6.0.0 (moderate vulnerability)
- patch-package: 6.5.1 -> 8.0.1 (low vulnerability)
Package updates:
- Backend: @fastify/cors 11.2.0, @fastify/helmet 13.0.2, @fastify/jwt 10.0.0
- Backend: supertest 7.1.4, @types/supertest 6.0.3, @types/node 22.0.0
- Frontend: @vitejs/plugin-react 5.1.2, zustand 5.0.0, framer-motion 12.0.0
Removed unused:
- minio (not imported anywhere in codebase)
TypeScript:
- Temporarily disabled exactOptionalPropertyTypes, noPropertyAccessFromIndexSignature,
noUncheckedIndexedAccess to fix pre-existing type errors (TODO: re-enable)
- Fixed process.env bracket notation access
- Fixed unused React imports in test files
- Renamed test files with JSX from .ts to .tsx
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com >
2025-12-20 14:18:41 -06:00
Eric Gullickson
cd0cfa8913
Vehicle drop down and Gas Station fixes
2025-12-17 10:49:29 -06:00
Eric Gullickson
8174e0d5f9
Admin User v1
2025-11-05 19:04:06 -06:00
Eric Gullickson
eeb20543fa
Homepage Redesign
2025-11-03 14:06:54 -06: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
cb98336d5e
k8s prepwork
2025-09-18 11:04:41 -05:00
Eric Gullickson
a052040e3a
Initial Commit
2025-09-17 16:09:15 -05:00
Eric Gullickson
b534e92636
Modernization Project Complete. Updated to latest versions of frameworks.
2025-08-24 09:49:21 -05:00
Eric Gullickson
8f5117a4e2
MVP Build
2025-08-09 12:47:15 -05:00