
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.
177 lines
6 KiB
Bash
Executable file
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 |