church-api/run_html_cleaning_migration.sh
Benjamin Slingo 0c06e159bb Initial commit: Church API Rust implementation
Complete church management system with bulletin management, media processing, live streaming integration, and web interface. Includes authentication, email notifications, database migrations, and comprehensive test suite.
2025-08-19 20:56:41 -04:00

177 lines
6 KiB
Bash
Executable file

#!/bin/bash
# Script to run HTML entity cleaning migration
# This script provides safety checks and backup functionality
set -e # Exit on any error
# Configuration
DB_URL="${DATABASE_URL:-postgresql://localhost/church_api}"
MIGRATION_FILE="migrations/20250811000001_clean_html_entities.sql"
TEST_FILE="test_html_cleaning_migration.sql"
BACKUP_DIR="./migration_backups"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo -e "${BLUE}Church API - HTML Entity Cleaning Migration${NC}"
echo "============================================="
echo
# Check if migration file exists
if [ ! -f "$MIGRATION_FILE" ]; then
echo -e "${RED}Error: Migration file not found: $MIGRATION_FILE${NC}"
exit 1
fi
# Check if test file exists
if [ ! -f "$TEST_FILE" ]; then
echo -e "${RED}Error: Test file not found: $TEST_FILE${NC}"
exit 1
fi
# Create backup directory
mkdir -p "$BACKUP_DIR"
echo -e "${YELLOW}Step 1: Testing the cleaning function...${NC}"
echo "Running test script to verify the cleaning logic works correctly..."
# Run the test script
if psql "$DB_URL" -f "$TEST_FILE" > /dev/null 2>&1; then
echo -e "${GREEN}✓ Test passed! The cleaning function works correctly.${NC}"
else
echo -e "${RED}✗ Test failed! Please check the test output.${NC}"
echo "Test output:"
psql "$DB_URL" -f "$TEST_FILE"
exit 1
fi
echo
echo -e "${YELLOW}Step 2: Creating database backup...${NC}"
BACKUP_FILE="$BACKUP_DIR/backup_before_html_cleaning_$TIMESTAMP.sql"
# Create backup of affected tables
echo "Creating backup of tables that will be modified..."
pg_dump "$DB_URL" \
--table=bulletins \
--table=events \
--table=pending_events \
--table=members \
--table=church_config \
--table=media_items \
--table=transcoded_media \
--table=users \
--data-only \
--no-owner \
--no-privileges > "$BACKUP_FILE" 2>/dev/null || {
echo -e "${YELLOW}Note: Some tables may not exist, continuing with available tables...${NC}"
# Try with just the core tables that definitely exist
pg_dump "$DB_URL" \
--table=bulletins \
--table=events \
--table=pending_events \
--table=church_config \
--table=users \
--data-only \
--no-owner \
--no-privileges > "$BACKUP_FILE" 2>/dev/null || {
echo -e "${RED}Failed to create backup. Aborting migration.${NC}"
exit 1
}
}
echo -e "${GREEN}✓ Backup created: $BACKUP_FILE${NC}"
echo
echo -e "${YELLOW}Step 3: Analyzing current data for HTML entities...${NC}"
# Check for HTML entities in the database
ENTITY_COUNT=$(psql "$DB_URL" -t -c "
SELECT COUNT(*) FROM (
SELECT id FROM bulletins WHERE
title ~ '<[^>]*>' OR sabbath_school ~ '<[^>]*>' OR divine_worship ~ '<[^>]*>' OR
scripture_reading ~ '<[^>]*>' OR sunset ~ '<[^>]*>' OR
title ~ '&(nbsp|amp|lt|gt|quot|#39);' OR sabbath_school ~ '&(nbsp|amp|lt|gt|quot|#39);' OR
divine_worship ~ '&(nbsp|amp|lt|gt|quot|#39);' OR scripture_reading ~ '&(nbsp|amp|lt|gt|quot|#39);' OR
sunset ~ '&(nbsp|amp|lt|gt|quot|#39);'
UNION ALL
SELECT id FROM events WHERE
title ~ '<[^>]*>' OR description ~ '<[^>]*>' OR location ~ '<[^>]*>' OR
location_url ~ '<[^>]*>' OR approved_from ~ '<[^>]*>' OR
title ~ '&(nbsp|amp|lt|gt|quot|#39);' OR description ~ '&(nbsp|amp|lt|gt|quot|#39);' OR
location ~ '&(nbsp|amp|lt|gt|quot|#39);' OR location_url ~ '&(nbsp|amp|lt|gt|quot|#39);' OR
approved_from ~ '&(nbsp|amp|lt|gt|quot|#39);'
UNION ALL
SELECT id FROM pending_events WHERE
title ~ '<[^>]*>' OR description ~ '<[^>]*>' OR location ~ '<[^>]*>' OR
location_url ~ '<[^>]*>' OR admin_notes ~ '<[^>]*>' OR
title ~ '&(nbsp|amp|lt|gt|quot|#39);' OR description ~ '&(nbsp|amp|lt|gt|quot|#39);' OR
location ~ '&(nbsp|amp|lt|gt|quot|#39);' OR admin_notes ~ '&(nbsp|amp|lt|gt|quot|#39);'
) AS dirty_records;
" | xargs)
echo "Found $ENTITY_COUNT records with HTML tags or entities that need cleaning."
if [ "$ENTITY_COUNT" -eq 0 ]; then
echo -e "${GREEN}✓ No HTML entities found! Database is already clean.${NC}"
echo "Migration can still be run to install the cleaning function for future use."
fi
echo
echo -e "${YELLOW}Step 4: Ready to run migration${NC}"
echo "This will:"
echo " • Install the clean_html_entities() function"
echo " • Clean HTML tags and entities from all text fields"
echo " • Update the updated_at timestamps for modified records"
echo " • Provide detailed logging of what was cleaned"
echo
echo "Backup location: $BACKUP_FILE"
# Ask for confirmation
read -p "Do you want to proceed with the migration? (y/N): " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
echo -e "${YELLOW}Migration cancelled by user.${NC}"
exit 0
fi
echo
echo -e "${YELLOW}Step 5: Running migration...${NC}"
# Run the migration
if psql "$DB_URL" -f "$MIGRATION_FILE"; then
echo
echo -e "${GREEN}✓ Migration completed successfully!${NC}"
echo
echo -e "${BLUE}Summary:${NC}"
echo "• HTML tags and entities have been cleaned from all text fields"
echo "• Database backup is available at: $BACKUP_FILE"
echo "• The clean_html_entities() function is now available for future use"
echo "• All API responses will now return clean data"
echo
echo -e "${YELLOW}Next steps:${NC}"
echo "1. Test your API endpoints to verify clean data"
echo "2. Monitor for any issues with data formatting"
echo "3. Keep the backup file until you're confident everything works correctly"
echo
echo -e "${GREEN}Migration completed successfully!${NC}"
else
echo -e "${RED}✗ Migration failed!${NC}"
echo
echo -e "${YELLOW}Rollback instructions:${NC}"
echo "1. Restore from backup: psql \"$DB_URL\" < \"$BACKUP_FILE\""
echo "2. Check the migration logs above for error details"
echo "3. Fix any issues and try again"
exit 1
fi