11 KiB
Complete Supabase Removal - Audit & Implementation Plan
Date: November 9, 2025
Status: Ready for Implementation
Approach: Aggressive (10-11 days)
Scope: Contact System = YES, Blog = NO
🎯 EXECUTIVE SUMMARY
Current State
- Django Backend: 95% complete, production-ready
- Frontend Migration: 20% complete, 459+ Supabase references remain
- Sacred Pipeline: Fully operational
- Critical Features: All implemented (Reports, Timeline, RideNameHistory)
What Must Be Done
- Implement Contact System backend (6 hours)
- Create comprehensive service layer (35 hours)
- Migrate authentication to Django JWT (16 hours)
- Update all components to use services (25 hours)
- Remove Supabase completely (9 hours)
Total Effort: ~91 hours (10-11 working days)
📊 AUDIT FINDINGS
✅ Backend Complete Features
- All core entities (Parks, Rides, Companies, Ride Models)
- RideNameHistory model + API ✅
- EntityTimelineEvent model + API ✅
- Reports model + API ✅
- Sacred Pipeline (Form → Submission → Moderation → Approval)
- Reviews with helpful votes
- User ride credits & top lists
- Photos with CloudFlare integration
- Complete moderation system
- pghistory-based versioning
- Search with PostgreSQL GIN indexes
- Authentication with JWT
- Celery for background tasks
❌ Missing Backend Features
- Contact System (required for MVP)
- Blog Posts (NOT in MVP scope)
- GDPR features (post-MVP)
🔴 Frontend Supabase Dependencies
Total: 459+ references across codebase
Breakdown by category:
- Authentication: 60+ files using
supabase.auth.* - Entity queries: 100+ files using
supabase.from() - Moderation: 20+ files (partially migrated)
- Reviews: 15+ files
- User profiles: 15+ files
- Search: 10+ files
- Forms/Submissions: 30+ files (mixed)
- Utilities: 50+ files
🚀 IMPLEMENTATION PLAN
Phase 1: Backend Contact System (6 hours)
Priority: CRITICAL - Required for MVP
Task 1.1: Contact App Setup (2 hours)
- Create
django/apps/contact/app - Implement
ContactSubmissionmodel with pghistory - Create migration
- Register in admin
Task 1.2: Contact API Endpoints (2 hours)
- Create
django/api/v1/endpoints/contact.py - Implement:
POST /contact/submit- Submit contact formGET /contact/- List contacts (moderators only)PATCH /contact/{id}/status- Update status (moderators only)
Task 1.3: Celery Email Tasks (1.5 hours)
- Confirmation email to user
- Notification email to admins
Task 1.4: Integration (30 min)
- Add to INSTALLED_APPS
- Register routes
- Create email templates
Phase 2: Service Layer Foundation (35 hours)
Priority: CRITICAL - Foundation for all frontend work
Task 2.1: Base API Client (3 hours)
File: src/lib/api/client.ts
- Unified HTTP client
- JWT token management
- Error handling & retry logic
- Request/response interceptors
Task 2.2: Authentication Service (4 hours)
File: src/services/auth/
- Replace ALL
supabase.auth.*calls - Login, register, logout
- OAuth integration
- MFA handling
- Password reset/update
- Session management
Task 2.3: Users Service (4 hours)
File: src/services/users/
- User profiles (CRUD)
- Batch user fetching
- User search
- Block/unblock functionality
Task 2.4: Parks Service (4 hours)
File: src/services/parks/
- Park CRUD via submissions
- Filtering & search
- Replace ALL
supabase.from('parks')
Task 2.5: Rides Service (4 hours)
File: src/services/rides/
- Ride CRUD via submissions
- Name history integration
- Replace ALL
supabase.from('rides')
Task 2.6: Companies Service (4 hours)
File: src/services/companies/
- Company CRUD via submissions
- Type filtering (manufacturers, operators, designers)
- Replace ALL
supabase.from('companies')
Task 2.7: Reviews Service (3 hours)
File: src/services/reviews/
- Review CRUD
- Helpful votes
- Entity reviews
- User reviews
Task 2.8: Submissions Service (4 hours)
File: src/services/submissions/
- Unified submission interface
- Moderation actions (claim, approve, reject)
- Submission status tracking
Task 2.9: Timeline Service (2 hours)
File: src/services/timeline/
- Timeline event CRUD
- Entity timeline fetching
Task 2.10: Search Service (3 hours)
File: src/services/search/
- Global search
- Entity-specific search
- Advanced filtering
Task 2.11: Contact Service (2 hours)
File: src/services/contact/
- Contact form submission
- Contact management (moderators)
Task 2.12: Photos Service (2 hours)
File: src/services/photos/
- Photo upload via CloudFlare
- Photo management
- Caption updates
Phase 3: Authentication Migration (16 hours)
Priority: CRITICAL - Blocks most other work
Task 3.1: Update Auth Context (6 hours)
File: src/hooks/useAuth.tsx
- Replace
supabase.auth.onAuthStateChange() - Replace
supabase.auth.getSession() - Implement JWT token refresh
- Handle auth state from Django
Task 3.2: Update Auth Components (4 hours)
Files: Auth pages & components
src/pages/Auth.tsxsrc/components/auth/AuthModal.tsxsrc/components/auth/TOTPSetup.tsxsrc/components/auth/MFAChallenge.tsxsrc/components/auth/MFARemovalDialog.tsx
Task 3.3: Update Protected Routes (2 hours)
- Update auth checks
- JWT-based route protection
Task 3.4: Session Management (2 hours)
File: src/lib/authStorage.ts
- JWT token storage
- Token refresh logic
Task 3.5: OAuth Integration (2 hours)
File: src/pages/AuthCallback.tsx
- OAuth callback handling
- Provider integration
Phase 4: Component Updates (25 hours)
Priority: HIGH - Makes services usable
Task 4.1: Park Pages (3 hours)
src/pages/Parks.tsxsrc/pages/ParkDetail.tsxsrc/pages/ParkRides.tsx- Replace
supabase.from('parks')withparksService
Task 4.2: Ride Pages (3 hours)
src/pages/Rides.tsxsrc/pages/RideDetail.tsxsrc/pages/RideModelDetail.tsxsrc/pages/RideModelRides.tsx- Replace
supabase.from('rides')withridesService
Task 4.3: Company Pages (3 hours)
src/pages/Manufacturers.tsxsrc/pages/ManufacturerDetail.tsxsrc/pages/Operators.tsxsrc/pages/OperatorDetail.tsxsrc/pages/Designers.tsxsrc/pages/DesignerDetail.tsx- Replace
supabase.from('companies')withcompaniesService
Task 4.4: User Pages (3 hours)
src/pages/Profile.tsxsrc/pages/AdminDashboard.tsx- Replace user queries with
usersService
Task 4.5: Form Components (5 hours)
- Entity submission forms
- Update to use service layers
Task 4.6: Moderation Components (4 hours)
- Complete migration of moderation queue
- Remove ALL remaining Supabase references
Task 4.7: Review Components (2 hours)
- Update review forms and lists
- Use
reviewsService
Task 4.8: Search Components (2 hours)
- Update search components
- Use
searchService
Phase 5: Cleanup & Testing (9 hours)
Priority: CRITICAL - Ensure complete removal
Task 5.1: Remove Supabase Dependencies (3 hours)
- Delete
src/integrations/supabase/directory - Remove from
package.json:@supabase/supabase-js - Search and remove ALL remaining Supabase imports
- Delete
src/lib/supabaseClient.ts
Task 5.2: Environment Variables (1 hour)
- Remove Supabase env vars
- Ensure Django API URL configured
Task 5.3: Integration Testing (4 hours)
Test EVERY flow:
- User registration/login
- Park CRUD via submissions
- Ride CRUD via submissions
- Company CRUD via submissions
- Reviews CRUD
- Moderation queue
- Reports system
- Contact form
- Photo uploads
- Search
- Timeline events
Task 5.4: Final Verification (1 hour)
- Run:
grep -r "supabase" src/- Should return 0 results - Verify all pages load
- Verify Sacred Pipeline works end-to-end
📅 EXECUTION TIMELINE
Week 1 (40 hours)
Days 1-2:
- Backend Contact System (6h)
- Base API Client (3h)
- Auth Service (4h)
- Users Service (4h)
Days 3-5:
- Parks Service (4h)
- Rides Service (4h)
- Companies Service (4h)
- Reviews Service (3h)
- Submissions Service (4h)
- Timeline Service (2h)
- Search Service (3h)
- Contact Service (2h)
- Photos Service (2h)
Week 2 (40 hours)
Days 1-2:
- Auth Context Update (6h)
- Auth Components Update (4h)
- Protected Routes (2h)
- Session Management (2h)
- OAuth Integration (2h)
Days 3-5:
- Park Pages (3h)
- Ride Pages (3h)
- Company Pages (3h)
- User Pages (3h)
- Form Components (5h)
- Moderation Components (4h)
- Review Components (2h)
- Search Components (2h)
Week 3 (11 hours)
Day 1:
- Remove Supabase Dependencies (3h)
- Update Environment Variables (1h)
- Integration Testing (4h)
Day 2:
- Final Verification (1h)
- Bug fixes (2h)
⚠️ CRITICAL SUCCESS FACTORS
1. No Half Measures
When updating a component, remove ALL Supabase references. No mixing of old and new.
2. Test As You Go
After each service, test basic CRUD before moving on.
3. Commit Frequently
Small, atomic commits for easy rollback if needed.
4. Error Handling
Every service method needs proper error handling with user-friendly messages.
5. Type Safety
Maintain strict TypeScript throughout. No any types.
6. Sacred Pipeline Integrity
NEVER bypass the moderation pipeline. All entity changes must go through submissions.
🎯 SUCCESS CRITERIA
Backend
- ✅ Contact System fully implemented
- ✅ All API endpoints functional
- ✅ Celery tasks working
- ✅ Migrations applied
Frontend
- ✅ Zero
import ... from '@supabase/supabase-js' - ✅ Zero
supabase.calls in codebase - ✅ All pages load without errors
- ✅ Authentication works end-to-end
- ✅ Sacred Pipeline intact (Form → Submission → Moderation → Approval)
- ✅ Contact form works
- ✅ All entity CRUD operations work
- ✅ Search works
- ✅ Photos work
- ✅ Reviews work
- ✅ Moderation queue works
Testing
- ✅ Can create account
- ✅ Can log in/out
- ✅ Can submit park/ride/company
- ✅ Can moderate submissions
- ✅ Can write reviews
- ✅ Can search entities
- ✅ Can upload photos
- ✅ Can submit contact form
- ✅ Can view entity history
📝 NOTES
Why This Is Aggressive
- No staging environment for incremental testing
- Must get it right the first time
- All changes must be production-ready
- Testing happens in production
Risk Mitigation
- Comprehensive service layer abstracts backend
- If Django has issues, services can be updated without touching components
- Atomic commits allow quick rollback
- Each phase has clear success criteria
Post-Migration
After complete removal:
- Consider implementing GDPR features (account deletion, data export)
- Consider adding Blog system if needed later
- Monitor error logs for any missed Supabase references
🚦 READY TO PROCEED
All planning complete. Backend is ready. Plan is aggressive but achievable.
Next Step: Implement Phase 1 - Backend Contact System
Document Version: 1.0
Last Updated: November 9, 2025