147 lines
4.8 KiB
Bash
147 lines
4.8 KiB
Bash
#!/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 ""
|