""" Migration script to add deployment tracking fields to generated_content table Story 4.1: Deploy Content to Cloud Storage """ import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) from src.database.session import db_manager from sqlalchemy import text def migrate(): """Add deployment tracking fields to generated_content table""" session = db_manager.get_session() try: print("Starting migration: Add deployment tracking fields...") print(" Adding deployed_url column...") session.execute(text(""" ALTER TABLE generated_content ADD COLUMN deployed_url TEXT NULL """)) print(" Adding deployed_at column...") session.execute(text(""" ALTER TABLE generated_content ADD COLUMN deployed_at TIMESTAMP NULL """)) print(" Creating index on deployed_at...") session.execute(text(""" CREATE INDEX idx_generated_content_deployed ON generated_content(deployed_at) """)) session.commit() print("Migration completed successfully!") print("\nNew fields added:") print(" - deployed_url (TEXT, nullable)") print(" - deployed_at (TIMESTAMP, nullable, indexed)") except Exception as e: session.rollback() print(f"Migration failed: {e}") raise finally: session.close() def rollback(): """Rollback migration (remove deployment fields)""" session = db_manager.get_session() try: print("Rolling back migration: Remove deployment tracking fields...") print(" Dropping index...") session.execute(text(""" DROP INDEX IF EXISTS idx_generated_content_deployed """)) print(" Removing deployed_at column...") session.execute(text(""" ALTER TABLE generated_content DROP COLUMN deployed_at """)) print(" Removing deployed_url column...") session.execute(text(""" ALTER TABLE generated_content DROP COLUMN deployed_url """)) session.commit() print("Rollback completed successfully!") except Exception as e: session.rollback() print(f"Rollback failed: {e}") raise finally: session.close() if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "rollback": rollback() else: migrate()