Files
moreminimore-marketing/backend/scripts/verify_onboarding_data.py
Kunthawat Greethong c35fa52117 Base code
2026-01-08 22:39:53 +07:00

339 lines
12 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
Database Verification Script for Onboarding Data
Verifies that all onboarding steps data is properly saved to the database.
Usage:
python backend/scripts/verify_onboarding_data.py [user_id]
Example:
python backend/scripts/verify_onboarding_data.py user_33Gz1FPI86VDXhRY8QN4ragRFGN
"""
import sys
import os
from pathlib import Path
# Add backend directory to path
backend_dir = Path(__file__).parent.parent
sys.path.insert(0, str(backend_dir))
from loguru import logger
from sqlalchemy import inspect, text
from typing import Optional
import json
def get_user_id_from_args() -> Optional[str]:
"""Get user_id from command line arguments."""
if len(sys.argv) > 1:
return sys.argv[1]
return None
def verify_table_exists(table_name: str, inspector) -> bool:
"""Check if a table exists in the database."""
tables = inspector.get_table_names()
exists = table_name in tables
if exists:
logger.info(f"✅ Table '{table_name}' exists")
# Show column count
columns = inspector.get_columns(table_name)
logger.info(f" Columns: {len(columns)}")
else:
logger.error(f"❌ Table '{table_name}' does NOT exist")
return exists
def verify_onboarding_session(user_id: str, db):
"""Verify onboarding session data."""
try:
from models.onboarding import OnboardingSession
session = db.query(OnboardingSession).filter(
OnboardingSession.user_id == user_id
).first()
if session:
logger.info(f"✅ Onboarding Session found for user: {user_id}")
logger.info(f" Session ID: {session.id}")
logger.info(f" Current Step: {session.current_step}")
logger.info(f" Progress: {session.progress}%")
logger.info(f" Started At: {session.started_at}")
logger.info(f" Updated At: {session.updated_at}")
return session.id
else:
logger.error(f"❌ No onboarding session found for user: {user_id}")
return None
except Exception as e:
logger.error(f"Error verifying onboarding session: {e}")
return None
def verify_api_keys(session_id: int, user_id: str, db):
"""Verify API keys data (Step 1)."""
try:
from models.onboarding import APIKey
api_keys = db.query(APIKey).filter(
APIKey.session_id == session_id
).all()
if api_keys:
logger.info(f"✅ Step 1 (API Keys): Found {len(api_keys)} API key(s)")
for key in api_keys:
# Mask the key for security
masked_key = f"{key.key[:8]}...{key.key[-4:]}" if len(key.key) > 12 else "***"
logger.info(f" - Provider: {key.provider}")
logger.info(f" Key: {masked_key}")
logger.info(f" Created: {key.created_at}")
else:
logger.warning(f"⚠️ Step 1 (API Keys): No API keys found")
except Exception as e:
logger.error(f"Error verifying API keys: {e}")
def verify_website_analysis(session_id: int, user_id: str, db):
"""Verify website analysis data (Step 2)."""
try:
from models.onboarding import WebsiteAnalysis
analysis = db.query(WebsiteAnalysis).filter(
WebsiteAnalysis.session_id == session_id
).first()
if analysis:
logger.info(f"✅ Step 2 (Website Analysis): Data found")
logger.info(f" Website URL: {analysis.website_url}")
logger.info(f" Analysis Date: {analysis.analysis_date}")
logger.info(f" Status: {analysis.status}")
if analysis.writing_style:
logger.info(f" Writing Style: {len(analysis.writing_style)} attributes")
if analysis.content_characteristics:
logger.info(f" Content Characteristics: {len(analysis.content_characteristics)} attributes")
if analysis.target_audience:
logger.info(f" Target Audience: {len(analysis.target_audience)} attributes")
else:
logger.warning(f"⚠️ Step 2 (Website Analysis): No data found")
except Exception as e:
logger.error(f"Error verifying website analysis: {e}")
def verify_research_preferences(session_id: int, user_id: str, db):
"""Verify research preferences data (Step 3)."""
try:
from models.onboarding import ResearchPreferences
prefs = db.query(ResearchPreferences).filter(
ResearchPreferences.session_id == session_id
).first()
if prefs:
logger.info(f"✅ Step 3 (Research Preferences): Data found")
logger.info(f" Research Depth: {prefs.research_depth}")
logger.info(f" Content Types: {prefs.content_types}")
logger.info(f" Auto Research: {prefs.auto_research}")
logger.info(f" Factual Content: {prefs.factual_content}")
else:
logger.warning(f"⚠️ Step 3 (Research Preferences): No data found")
except Exception as e:
logger.error(f"Error verifying research preferences: {e}")
def verify_persona_data(session_id: int, user_id: str, db):
"""Verify persona data (Step 4) - THE NEW FIX!"""
try:
from models.onboarding import PersonaData
persona = db.query(PersonaData).filter(
PersonaData.session_id == session_id
).first()
if persona:
logger.info(f"✅ Step 4 (Persona Generation): Data found ⭐")
if persona.core_persona:
logger.info(f" Core Persona: Present")
if isinstance(persona.core_persona, dict):
logger.info(f" Attributes: {len(persona.core_persona)} fields")
if persona.platform_personas:
logger.info(f" Platform Personas: Present")
if isinstance(persona.platform_personas, dict):
platforms = list(persona.platform_personas.keys())
logger.info(f" Platforms: {', '.join(platforms)}")
if persona.quality_metrics:
logger.info(f" Quality Metrics: Present")
if isinstance(persona.quality_metrics, dict):
logger.info(f" Metrics: {len(persona.quality_metrics)} fields")
if persona.selected_platforms:
logger.info(f" Selected Platforms: {persona.selected_platforms}")
logger.info(f" Created At: {persona.created_at}")
logger.info(f" Updated At: {persona.updated_at}")
else:
logger.error(f"❌ Step 4 (Persona Generation): No data found - THIS IS THE BUG WE FIXED!")
except Exception as e:
logger.error(f"Error verifying persona data: {e}")
import traceback
logger.error(traceback.format_exc())
def show_raw_sql_query_example(user_id: str):
"""Show example SQL queries for manual verification."""
logger.info("")
logger.info("=" * 60)
logger.info("📋 Raw SQL Queries for Manual Verification:")
logger.info("=" * 60)
queries = [
("Onboarding Session",
f"SELECT * FROM onboarding_sessions WHERE user_id = '{user_id}';"),
("API Keys",
f"""SELECT ak.* FROM api_keys ak
JOIN onboarding_sessions os ON ak.session_id = os.id
WHERE os.user_id = '{user_id}';"""),
("Website Analysis",
f"""SELECT wa.website_url, wa.analysis_date, wa.status
FROM website_analyses wa
JOIN onboarding_sessions os ON wa.session_id = os.id
WHERE os.user_id = '{user_id}';"""),
("Research Preferences",
f"""SELECT rp.research_depth, rp.content_types, rp.auto_research
FROM research_preferences rp
JOIN onboarding_sessions os ON rp.session_id = os.id
WHERE os.user_id = '{user_id}';"""),
("Persona Data (NEW!)",
f"""SELECT pd.* FROM persona_data pd
JOIN onboarding_sessions os ON pd.session_id = os.id
WHERE os.user_id = '{user_id}';"""),
]
for title, query in queries:
logger.info(f"\n{title}:")
logger.info(f" {query}")
def count_all_records(db):
"""Count records in all onboarding tables."""
logger.info("")
logger.info("=" * 60)
logger.info("📊 Overall Database Statistics:")
logger.info("=" * 60)
try:
from models.onboarding import (
OnboardingSession, APIKey, WebsiteAnalysis,
ResearchPreferences, PersonaData
)
counts = {
"Onboarding Sessions": db.query(OnboardingSession).count(),
"API Keys": db.query(APIKey).count(),
"Website Analyses": db.query(WebsiteAnalysis).count(),
"Research Preferences": db.query(ResearchPreferences).count(),
"Persona Data": db.query(PersonaData).count(),
}
for table, count in counts.items():
logger.info(f" {table}: {count} record(s)")
except Exception as e:
logger.error(f"Error counting records: {e}")
def main():
"""Main verification function."""
logger.info("=" * 60)
logger.info("🔍 Onboarding Database Verification")
logger.info("=" * 60)
# Get user_id
user_id = get_user_id_from_args()
if not user_id:
logger.warning("⚠️ No user_id provided. Will show overall statistics only.")
logger.info("Usage: python backend/scripts/verify_onboarding_data.py <user_id>")
try:
from services.database import SessionLocal, engine
from sqlalchemy import inspect
# Check tables exist
logger.info("")
logger.info("=" * 60)
logger.info("1⃣ Verifying Database Tables:")
logger.info("=" * 60)
inspector = inspect(engine)
tables = [
'onboarding_sessions',
'api_keys',
'website_analyses',
'research_preferences',
'persona_data'
]
all_exist = True
for table in tables:
if not verify_table_exists(table, inspector):
all_exist = False
if not all_exist:
logger.error("")
logger.error("❌ Some tables are missing! Run migrations first.")
return False
# Count all records
db = SessionLocal()
try:
count_all_records(db)
# If user_id provided, show detailed data
if user_id:
logger.info("")
logger.info("=" * 60)
logger.info(f"2⃣ Verifying Data for User: {user_id}")
logger.info("=" * 60)
# Verify session
session_id = verify_onboarding_session(user_id, db)
if session_id:
logger.info("")
# Verify each step's data
verify_api_keys(session_id, user_id, db)
logger.info("")
verify_website_analysis(session_id, user_id, db)
logger.info("")
verify_research_preferences(session_id, user_id, db)
logger.info("")
verify_persona_data(session_id, user_id, db)
# Show SQL examples
show_raw_sql_query_example(user_id)
logger.info("")
logger.info("=" * 60)
logger.info("✅ Verification Complete!")
logger.info("=" * 60)
return True
finally:
db.close()
except Exception as e:
logger.error(f"❌ Verification failed: {e}")
import traceback
logger.error(traceback.format_exc())
return False
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)