church-api/migrations/20250729000001_timezone_conversion_est_to_utc_rollback.sql
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

274 lines
8.6 KiB
PL/PgSQL

-- Timezone Migration Rollback Script
-- Rollback: 20250729000001_timezone_conversion_est_to_utc_rollback.sql
--
-- This script will revert the timezone conversion migration by restoring
-- the original EST-masquerading-as-UTC timestamps from backup tables.
--
-- WARNING: Only run this if the migration needs to be reverted!
-- This will restore the original problematic timezone storage.
-- Start transaction for atomic rollback
BEGIN;
-- ================================
-- VALIDATION CHECKS
-- ================================
-- Verify backup tables exist
DO $$
DECLARE
backup_count INTEGER;
BEGIN
-- Check if backup tables exist
SELECT COUNT(*) INTO backup_count
FROM information_schema.tables
WHERE table_name IN (
'events_timezone_backup',
'pending_events_timezone_backup',
'bulletins_timezone_backup',
'users_timezone_backup',
'church_config_timezone_backup',
'schedules_timezone_backup',
'bible_verses_timezone_backup',
'app_versions_timezone_backup'
);
IF backup_count < 8 THEN
RAISE EXCEPTION 'Backup tables not found! Cannot proceed with rollback. Expected 8 backup tables, found %.', backup_count;
END IF;
RAISE NOTICE 'Backup tables verified. Proceeding with rollback...';
END $$;
-- ================================
-- PRE-ROLLBACK VALIDATION SAMPLES
-- ================================
-- Show current state before rollback
DO $$
DECLARE
sample_record RECORD;
BEGIN
RAISE NOTICE '========================================';
RAISE NOTICE 'PRE-ROLLBACK CURRENT STATE (UTC times)';
RAISE NOTICE '========================================';
FOR sample_record IN
SELECT
'events' as table_name,
id::text as record_id,
start_time as current_utc_time,
start_time AT TIME ZONE 'America/New_York' as current_ny_display
FROM events
WHERE start_time IS NOT NULL
LIMIT 3
LOOP
RAISE NOTICE 'Table: %, ID: %', sample_record.table_name, sample_record.record_id;
RAISE NOTICE ' Current UTC: %', sample_record.current_utc_time;
RAISE NOTICE ' Current NY Display: %', sample_record.current_ny_display;
RAISE NOTICE '----------------------------------------';
END LOOP;
END $$;
-- ================================
-- ROLLBACK EVENTS TABLE
-- ================================
RAISE NOTICE 'Rolling back events table...';
UPDATE events
SET
start_time = backup.original_start_time,
end_time = backup.original_end_time,
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM events_timezone_backup backup
WHERE events.id = backup.id;
-- ================================
-- ROLLBACK PENDING_EVENTS TABLE
-- ================================
RAISE NOTICE 'Rolling back pending_events table...';
UPDATE pending_events
SET
start_time = backup.original_start_time,
end_time = backup.original_end_time,
submitted_at = backup.original_submitted_at,
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM pending_events_timezone_backup backup
WHERE pending_events.id = backup.id;
-- ================================
-- ROLLBACK BULLETINS TABLE
-- ================================
RAISE NOTICE 'Rolling back bulletins table...';
UPDATE bulletins
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM bulletins_timezone_backup backup
WHERE bulletins.id = backup.id;
-- ================================
-- ROLLBACK USERS TABLE
-- ================================
RAISE NOTICE 'Rolling back users table...';
UPDATE users
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM users_timezone_backup backup
WHERE users.id = backup.id;
-- ================================
-- ROLLBACK CHURCH_CONFIG TABLE
-- ================================
RAISE NOTICE 'Rolling back church_config table...';
UPDATE church_config
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM church_config_timezone_backup backup
WHERE church_config.id = backup.id;
-- ================================
-- ROLLBACK SCHEDULES TABLE
-- ================================
RAISE NOTICE 'Rolling back schedules table...';
UPDATE schedules
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM schedules_timezone_backup backup
WHERE schedules.id = backup.id;
-- ================================
-- ROLLBACK BIBLE_VERSES TABLE
-- ================================
RAISE NOTICE 'Rolling back bible_verses table...';
UPDATE bible_verses
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM bible_verses_timezone_backup backup
WHERE bible_verses.id = backup.id;
-- ================================
-- ROLLBACK APP_VERSIONS TABLE
-- ================================
RAISE NOTICE 'Rolling back app_versions table...';
UPDATE app_versions
SET
created_at = backup.original_created_at,
updated_at = backup.original_updated_at
FROM app_versions_timezone_backup backup
WHERE app_versions.id = backup.id;
-- ================================
-- POST-ROLLBACK VALIDATION
-- ================================
-- Show state after rollback (should match original pre-migration state)
DO $$
DECLARE
sample_record RECORD;
events_count INTEGER;
pending_count INTEGER;
BEGIN
RAISE NOTICE '========================================';
RAISE NOTICE 'POST-ROLLBACK STATE (Back to EST-as-UTC)';
RAISE NOTICE '========================================';
FOR sample_record IN
SELECT
'events' as table_name,
id::text as record_id,
start_time as restored_est_time,
start_time AT TIME ZONE 'America/New_York' as restored_display
FROM events
WHERE start_time IS NOT NULL
LIMIT 3
LOOP
RAISE NOTICE 'Table: %, ID: %', sample_record.table_name, sample_record.record_id;
RAISE NOTICE ' Restored EST-as-UTC: %', sample_record.restored_est_time;
RAISE NOTICE ' Display Time: %', sample_record.restored_display;
RAISE NOTICE '----------------------------------------';
END LOOP;
-- Show rollback statistics
SELECT COUNT(*) INTO events_count FROM events WHERE start_time IS NOT NULL;
SELECT COUNT(*) INTO pending_count FROM pending_events WHERE start_time IS NOT NULL;
RAISE NOTICE '========================================';
RAISE NOTICE 'ROLLBACK STATISTICS';
RAISE NOTICE '========================================';
RAISE NOTICE 'Events rolled back: %', events_count;
RAISE NOTICE 'Pending events rolled back: %', pending_count;
RAISE NOTICE '========================================';
END $$;
-- ================================
-- UPDATE MIGRATION LOG
-- ================================
-- Record the rollback in migration log
INSERT INTO migration_log (migration_name, description, executed_at)
VALUES (
'20250729000001_timezone_conversion_est_to_utc_ROLLBACK',
'Rolled back timezone conversion migration. Restored original EST-masquerading-as-UTC timestamps from backup tables.',
NOW()
);
-- ================================
-- CLEANUP OPTIONS (commented out for safety)
-- ================================
-- Uncomment the following section if you want to drop backup tables after successful rollback
-- WARNING: This will permanently delete the backup tables!
/*
RAISE NOTICE 'Cleaning up backup tables...';
DROP TABLE IF EXISTS events_timezone_backup;
DROP TABLE IF EXISTS pending_events_timezone_backup;
DROP TABLE IF EXISTS bulletins_timezone_backup;
DROP TABLE IF EXISTS users_timezone_backup;
DROP TABLE IF EXISTS church_config_timezone_backup;
DROP TABLE IF EXISTS schedules_timezone_backup;
DROP TABLE IF EXISTS bible_verses_timezone_backup;
DROP TABLE IF EXISTS app_versions_timezone_backup;
RAISE NOTICE 'Backup tables cleaned up.';
*/
-- ================================
-- ROLLBACK COMPLETE LOG
-- ================================
RAISE NOTICE '========================================';
RAISE NOTICE 'TIMEZONE MIGRATION ROLLBACK COMPLETED';
RAISE NOTICE 'Rollback: 20250729000001_timezone_conversion_est_to_utc_rollback';
RAISE NOTICE 'Executed at: %', NOW();
RAISE NOTICE '========================================';
RAISE NOTICE 'STATUS: All timestamps restored to original EST-as-UTC format';
RAISE NOTICE 'WARNING: This reverts to the problematic timezone storage!';
RAISE NOTICE 'BACKUP TABLES: Preserved for future migrations (not dropped)';
RAISE NOTICE '========================================';
-- Commit the rollback transaction
COMMIT;