#!/bin/bash # Multi-Household Migration Runner # This script handles the complete migration process with safety checks set -e # Exit on error # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Database configuration (from .env) DB_USER="postgres" DB_HOST="192.168.7.112" DB_NAME="grocery" export PGPASSWORD="Asdwed123A." BACKUP_DIR="./backend/migrations/backups" TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="${BACKUP_DIR}/backup_${TIMESTAMP}.sql" echo -e "${BLUE}╔════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║ Multi-Household Architecture Migration ║${NC}" echo -e "${BLUE}╚════════════════════════════════════════════════╝${NC}" echo "" # Create backup directory if it doesn't exist mkdir -p "$BACKUP_DIR" # Step 1: Backup echo -e "${YELLOW}[1/5] Creating database backup...${NC}" pg_dump -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" > "$BACKUP_FILE" if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Backup created: $BACKUP_FILE${NC}" else echo -e "${RED}✗ Backup failed!${NC}" exit 1 fi echo "" # Step 2: Show current stats echo -e "${YELLOW}[2/5] Current database statistics:${NC}" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -c " SELECT 'Users' as table_name, COUNT(*) as count FROM users UNION ALL SELECT 'Grocery Items', COUNT(*) FROM grocery_list UNION ALL SELECT 'Classifications', COUNT(*) FROM item_classification UNION ALL SELECT 'History Records', COUNT(*) FROM grocery_history; " echo "" # Step 3: Confirm echo -e "${YELLOW}[3/5] Ready to run migration${NC}" echo -e "Database: ${BLUE}$DB_NAME${NC} on ${BLUE}$DB_HOST${NC}" echo -e "Backup: ${GREEN}$BACKUP_FILE${NC}" echo "" read -p "Continue with migration? (yes/no): " -r echo "" if [[ ! $REPLY =~ ^[Yy]es$ ]]; then echo -e "${RED}Migration cancelled.${NC}" exit 1 fi # Step 4: Run migration echo -e "${YELLOW}[4/5] Running migration script...${NC}" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" -f backend/migrations/multi_household_architecture.sql if [ $? -eq 0 ]; then echo -e "${GREEN}✓ Migration completed successfully${NC}" else echo -e "${RED}✗ Migration failed! Rolling back...${NC}" echo -e "${YELLOW}Restoring from backup: $BACKUP_FILE${NC}" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" < "$BACKUP_FILE" exit 1 fi echo "" # Step 5: Verification echo -e "${YELLOW}[5/5] Verifying migration...${NC}" psql -h "$DB_HOST" -U "$DB_USER" -d "$DB_NAME" << 'EOF' \echo '' \echo '=== Household Created ===' SELECT id, name, invite_code FROM households; \echo '' \echo '=== User Roles ===' SELECT u.id, u.username, u.role as system_role, hm.role as household_role FROM users u LEFT JOIN household_members hm ON u.id = hm.user_id ORDER BY u.id LIMIT 10; \echo '' \echo '=== Migration Counts ===' SELECT 'Items (Master Catalog)' as metric, COUNT(*)::text as count FROM items UNION ALL SELECT 'Household Lists', COUNT(*)::text FROM household_lists UNION ALL SELECT 'Classifications', COUNT(*)::text FROM household_item_classifications UNION ALL SELECT 'History Records', COUNT(*)::text FROM household_list_history UNION ALL SELECT 'Household Members', COUNT(*)::text FROM household_members UNION ALL SELECT 'Stores', COUNT(*)::text FROM stores; \echo '' \echo '=== Data Integrity Checks ===' \echo 'Users without household membership (should be 0):' SELECT COUNT(*) FROM users u LEFT JOIN household_members hm ON u.id = hm.user_id WHERE hm.id IS NULL; \echo '' \echo 'Lists without valid items (should be 0):' SELECT COUNT(*) FROM household_lists hl LEFT JOIN items i ON hl.item_id = i.id WHERE i.id IS NULL; \echo '' \echo 'History without valid lists (should be 0):' SELECT COUNT(*) FROM household_list_history hlh LEFT JOIN household_lists hl ON hlh.household_list_id = hl.id WHERE hl.id IS NULL; EOF echo "" echo -e "${GREEN}╔════════════════════════════════════════════════╗${NC}" echo -e "${GREEN}║ Migration Complete! ║${NC}" echo -e "${GREEN}╚════════════════════════════════════════════════╝${NC}" echo "" echo -e "${BLUE}Next Steps:${NC}" echo -e "1. Review verification results above" echo -e "2. Test the application" echo -e "3. If issues found, rollback with:" echo -e " ${YELLOW}psql -h $DB_HOST -U $DB_USER -d $DB_NAME < $BACKUP_FILE${NC}" echo -e "4. If successful, proceed to Sprint 2 (Backend API)" echo "" echo -e "${YELLOW}Backup location: $BACKUP_FILE${NC}" echo ""