#!/usr/bin/env python3
"""
Migration Script: Booking Sessions from JSON to PostgreSQL
Migrates existing booking sessions from booking_sessions.json to database
"""
import os
import sys
import json
import logging
from pathlib import Path
# Add src to path
sys.path.insert(0, str(Path(__file__).parent))
from src.database.database import create_tables
from src.database.models import HybridBookingSession
from src.database.booking_sessions import BookingSessionManager
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)
logger = logging.getLogger(__name__)
def migrate_sessions_from_json(json_file_path: str = "booking_sessions.json"):
"""
Migrate booking sessions from JSON file to PostgreSQL database
Args:
json_file_path: Path to the JSON file containing sessions
"""
logger.info("=" * 60)
logger.info("BOOKING SESSIONS MIGRATION: JSON → PostgreSQL")
logger.info("=" * 60)
# Step 1: Create database tables
logger.info("Step 1: Creating database tables...")
try:
create_tables()
logger.info("✅ Database tables created successfully")
except Exception as e:
logger.error(f"❌ Failed to create tables: {e}")
return
# Step 2: Load sessions from JSON file
logger.info(f"Step 2: Loading sessions from {json_file_path}...")
if not os.path.exists(json_file_path):
logger.warning(f"⚠️ JSON file not found: {json_file_path}")
logger.info("No sessions to migrate. Database is ready for new sessions.")
return
try:
with open(json_file_path, 'r') as f:
sessions_data = json.load(f)
session_count = len(sessions_data)
logger.info(f"✅ Loaded {session_count} sessions from JSON")
if session_count == 0:
logger.info("No sessions to migrate. Database is ready for new sessions.")
return
except Exception as e:
logger.error(f"❌ Failed to load JSON file: {e}")
return
# Step 3: Migrate each session to database
logger.info("Step 3: Migrating sessions to PostgreSQL...")
manager = BookingSessionManager()
migrated_count = 0
failed_count = 0
for session_id, session_data in sessions_data.items():
try:
# Check if session already exists
existing = manager.get_session(session_id)
if existing:
logger.info(f"⏭️ Session {session_id} already exists, skipping")
continue
# Create session in database
manager.create_session(
session_id=session_data['session_id'],
organizer_email=session_data['organizer_email'],
organizer_name=session_data['organizer_name'],
external_email=session_data['external_email'],
external_name=session_data['external_name'],
proposed_slots=session_data['proposed_slots'],
meeting_subject=session_data['meeting_subject'],
meeting_duration=session_data['meeting_duration'],
booking_url=session_data['booking_url'],
internal_attendees=session_data.get('internal_attendees', [])
)
# Update status if confirmed
if session_data.get('status') == 'confirmed':
manager.update_session_status(
session_id=session_id,
status='confirmed',
confirmed_slot=session_data.get('confirmed_slot'),
event_id=session_data.get('event_id')
)
migrated_count += 1
logger.info(f"✅ Migrated session: {session_id} (status: {session_data.get('status', 'pending')})")
except Exception as e:
failed_count += 1
logger.error(f"❌ Failed to migrate session {session_id}: {e}")
# Step 4: Summary
logger.info("=" * 60)
logger.info("MIGRATION SUMMARY")
logger.info("=" * 60)
logger.info(f"Total sessions found: {session_count}")
logger.info(f"Successfully migrated: {migrated_count}")
logger.info(f"Failed: {failed_count}")
logger.info(f"Skipped (already exist): {session_count - migrated_count - failed_count}")
if migrated_count > 0:
logger.info("=" * 60)
logger.info("✅ MIGRATION COMPLETED SUCCESSFULLY")
logger.info("=" * 60)
logger.info(f"You can now backup/remove the JSON file: {json_file_path}")
logger.info("All new sessions will be stored in PostgreSQL database.")
else:
logger.info("=" * 60)
logger.info("ℹ️ NO NEW SESSIONS MIGRATED")
logger.info("=" * 60)
def verify_migration():
"""Verify migration by checking database contents"""
logger.info("\n" + "=" * 60)
logger.info("VERIFICATION: Checking database contents")
logger.info("=" * 60)
try:
manager = BookingSessionManager()
# Get all pending sessions
pending = manager.get_pending_sessions()
logger.info(f"Pending sessions in database: {len(pending)}")
for session in pending:
logger.info(f" - {session.session_id}: {session.external_email} (created: {session.created_at})")
logger.info("✅ Database verification completed")
except Exception as e:
logger.error(f"❌ Verification failed: {e}")
if __name__ == "__main__":
# Get JSON file path from command line or use default
json_file = sys.argv[1] if len(sys.argv) > 1 else "booking_sessions.json"
# Run migration
migrate_sessions_from_json(json_file)
# Verify results
verify_migration()