# Multi-Household Architecture Migration Guide ## Pre-Migration Checklist - [ ] **Backup Database** ```bash pg_dump -U your_user -d grocery_list > backup_$(date +%Y%m%d_%H%M%S).sql ``` - [ ] **Test on Staging First** - Copy production database to staging environment - Run migration on staging - Verify all data migrated correctly - Test application functionality - [ ] **Review Migration Script** - Read through `multi_household_architecture.sql` - Understand each step - Note verification queries - [ ] **Announce Maintenance Window** - Notify users of downtime - Schedule during low-usage period - Estimate 15-30 minutes for migration ## Running the Migration ### 1. Connect to Database ```bash psql -U your_user -d grocery_list ``` ### 2. Run Migration ```sql \i backend/migrations/multi_household_architecture.sql ``` The script will: 1. ✅ Create 8 new tables 2. ✅ Create default "Main Household" 3. ✅ Create default "Costco" store 4. ✅ Migrate all users to household members 5. ✅ Extract items to master catalog 6. ✅ Migrate grocery_list → household_lists 7. ✅ Migrate classifications 8. ✅ Migrate history records 9. ✅ Update user system roles ### 3. Verify Migration Run these queries inside psql: ```sql -- Check household created SELECT * FROM households; -- Check all users migrated SELECT u.username, u.role as system_role, hm.role as household_role FROM users u JOIN household_members hm ON u.id = hm.user_id ORDER BY u.id; -- Check item counts match SELECT (SELECT COUNT(DISTINCT item_name) FROM grocery_list) as old_unique_items, (SELECT COUNT(*) FROM items) as new_items; -- Check list counts SELECT (SELECT COUNT(*) FROM grocery_list) as old_lists, (SELECT COUNT(*) FROM household_lists) as new_lists; -- Check classification counts SELECT (SELECT COUNT(*) FROM item_classification) as old_classifications, (SELECT COUNT(*) FROM household_item_classifications) as new_classifications; -- Check history counts SELECT (SELECT COUNT(*) FROM grocery_history) as old_history, (SELECT COUNT(*) FROM household_list_history) as new_history; -- Verify no data loss - check if all old items have corresponding new records SELECT gl.item_name FROM grocery_list gl LEFT JOIN items i ON LOWER(i.name) = LOWER(TRIM(gl.item_name)) LEFT JOIN household_lists hl ON hl.item_id = i.id WHERE hl.id IS NULL; -- Should return 0 rows -- Check invite code SELECT name, invite_code FROM households; ``` ### 4. Test Application - [ ] Users can log in - [ ] Can view "Main Household" list - [ ] Can add items - [ ] Can mark items as bought - [ ] History shows correctly - [ ] Classifications preserved - [ ] Images display correctly ## Post-Migration Cleanup **Only after verifying everything works correctly:** ```sql -- Drop old tables (CAREFUL - THIS IS IRREVERSIBLE) DROP TABLE IF EXISTS grocery_history CASCADE; DROP TABLE IF EXISTS item_classification CASCADE; DROP TABLE IF EXISTS grocery_list CASCADE; ``` ## Rollback Plan ### If Migration Fails ```sql -- Inside psql during migration ROLLBACK; -- Then restore from backup \q psql -U your_user -d grocery_list < backup_YYYYMMDD_HHMMSS.sql ``` ### If Issues Found After Migration ```bash # Drop the database and restore dropdb grocery_list createdb grocery_list psql -U your_user -d grocery_list < backup_YYYYMMDD_HHMMSS.sql ``` ## Common Issues & Solutions ### Issue: Duplicate items in items table **Cause**: Case-insensitive matching not working **Solution**: Check item names for leading/trailing spaces ### Issue: Foreign key constraint errors **Cause**: User or item references not found **Solution**: Verify all users and items exist before migrating lists ### Issue: History not showing **Cause**: household_list_id references incorrect **Solution**: Check JOIN conditions in history migration ### Issue: Images not displaying **Cause**: BYTEA encoding issues **Solution**: Verify image_mime_type correctly migrated ## Migration Timeline - **T-0**: Begin maintenance window - **T+2min**: Backup complete - **T+3min**: Start migration script - **T+8min**: Migration complete (for ~1000 items) - **T+10min**: Run verification queries - **T+15min**: Test application functionality - **T+20min**: If successful, announce completion - **T+30min**: End maintenance window ## Data Integrity Checks ```sql -- Ensure all users belong to at least one household SELECT u.id, u.username FROM users u LEFT JOIN household_members hm ON u.id = hm.user_id WHERE hm.id IS NULL; -- Should return 0 rows -- Ensure all household lists have valid items SELECT hl.id FROM household_lists hl LEFT JOIN items i ON hl.item_id = i.id WHERE i.id IS NULL; -- Should return 0 rows -- Ensure all history has valid list references SELECT hlh.id FROM household_list_history hlh LEFT JOIN household_lists hl ON hlh.household_list_id = hl.id WHERE hl.id IS NULL; -- Should return 0 rows -- Check for orphaned classifications SELECT hic.id FROM household_item_classifications hic LEFT JOIN household_lists hl ON hic.item_id = hl.item_id AND hic.household_id = hl.household_id AND hic.store_id = hl.store_id WHERE hl.id IS NULL; -- Should return 0 rows (or classifications for removed items, which is ok) ``` ## Success Criteria ✅ All tables created successfully ✅ All users migrated to "Main Household" ✅ Item count matches (unique items from old → new) ✅ List count matches (all grocery_list items → household_lists) ✅ Classification count matches ✅ History count matches ✅ No NULL foreign keys ✅ Application loads without errors ✅ Users can perform all CRUD operations ✅ Images display correctly ✅ Bought items still marked as bought ✅ Recently bought still shows correctly ## Next Steps After Migration 1. ✅ Update backend models (Sprint 2) 2. ✅ Update API routes 3. ✅ Update controllers 4. ✅ Test all endpoints 5. ✅ Update frontend contexts 6. ✅ Update UI components 7. ✅ Enable multi-household features ## Support & Troubleshooting If issues arise: 1. Check PostgreSQL logs: `/var/log/postgresql/` 2. Check application logs 3. Restore from backup if needed 4. Review migration script for errors ## Monitoring Post-Migration For the first 24 hours after migration: - Monitor error logs - Watch for performance issues - Verify user activity normal - Check for any data inconsistencies - Be ready to rollback if critical issues found