281 lines
9.1 KiB
Python
281 lines
9.1 KiB
Python
"""
|
|
Comprehensive verification script for billing and subscription system setup.
|
|
Checks that all files are created, tables exist, and the system is properly integrated.
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
def check_file_exists(file_path, description):
|
|
"""Check if a file exists and report status."""
|
|
if os.path.exists(file_path):
|
|
print(f"✅ {description}: {file_path}")
|
|
return True
|
|
else:
|
|
print(f"❌ {description}: {file_path} - NOT FOUND")
|
|
return False
|
|
|
|
def check_file_content(file_path, search_terms, description):
|
|
"""Check if file contains expected content."""
|
|
try:
|
|
with open(file_path, 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
|
|
missing_terms = []
|
|
for term in search_terms:
|
|
if term not in content:
|
|
missing_terms.append(term)
|
|
|
|
if not missing_terms:
|
|
print(f"✅ {description}: All expected content found")
|
|
return True
|
|
else:
|
|
print(f"❌ {description}: Missing content - {missing_terms}")
|
|
return False
|
|
except Exception as e:
|
|
print(f"❌ {description}: Error reading file - {e}")
|
|
return False
|
|
|
|
def check_database_tables():
|
|
"""Check if billing database tables exist."""
|
|
print("\n🗄️ Checking Database Tables:")
|
|
print("-" * 30)
|
|
|
|
try:
|
|
# Add backend to path
|
|
backend_dir = Path(__file__).parent
|
|
sys.path.insert(0, str(backend_dir))
|
|
|
|
from services.database import get_db_session, DATABASE_URL
|
|
from sqlalchemy import text
|
|
|
|
session = get_db_session()
|
|
if not session:
|
|
print("❌ Could not get database session")
|
|
return False
|
|
|
|
# Check for billing tables
|
|
tables_query = text("""
|
|
SELECT name FROM sqlite_master
|
|
WHERE type='table' AND (
|
|
name LIKE '%subscription%' OR
|
|
name LIKE '%usage%' OR
|
|
name LIKE '%billing%' OR
|
|
name LIKE '%pricing%' OR
|
|
name LIKE '%alert%'
|
|
)
|
|
ORDER BY name
|
|
""")
|
|
|
|
result = session.execute(tables_query)
|
|
tables = result.fetchall()
|
|
|
|
expected_tables = [
|
|
'api_provider_pricing',
|
|
'api_usage_logs',
|
|
'subscription_plans',
|
|
'usage_alerts',
|
|
'usage_summaries',
|
|
'user_subscriptions'
|
|
]
|
|
|
|
found_tables = [t[0] for t in tables]
|
|
print(f"Found tables: {found_tables}")
|
|
|
|
missing_tables = [t for t in expected_tables if t not in found_tables]
|
|
if missing_tables:
|
|
print(f"❌ Missing tables: {missing_tables}")
|
|
return False
|
|
|
|
# Check table data
|
|
for table in ['subscription_plans', 'api_provider_pricing']:
|
|
count_query = text(f"SELECT COUNT(*) FROM {table}")
|
|
result = session.execute(count_query)
|
|
count = result.fetchone()[0]
|
|
print(f"✅ {table}: {count} records")
|
|
|
|
session.close()
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ Database check failed: {e}")
|
|
return False
|
|
|
|
def main():
|
|
"""Main verification function."""
|
|
|
|
print("🔍 ALwrity Billing & Subscription System Setup Verification")
|
|
print("=" * 70)
|
|
|
|
backend_dir = Path(__file__).parent
|
|
|
|
# Files to check
|
|
files_to_check = [
|
|
(backend_dir / "models" / "subscription_models.py", "Subscription Models"),
|
|
(backend_dir / "services" / "pricing_service.py", "Pricing Service"),
|
|
(backend_dir / "services" / "usage_tracking_service.py", "Usage Tracking Service"),
|
|
(backend_dir / "services" / "subscription_exception_handler.py", "Exception Handler"),
|
|
(backend_dir / "api" / "subscription_api.py", "Subscription API"),
|
|
(backend_dir / "scripts" / "create_billing_tables.py", "Billing Migration Script"),
|
|
(backend_dir / "scripts" / "create_subscription_tables.py", "Subscription Migration Script"),
|
|
(backend_dir / "start_alwrity_backend.py", "Backend Startup Script"),
|
|
]
|
|
|
|
# Check file existence
|
|
print("\n📁 Checking File Existence:")
|
|
print("-" * 30)
|
|
files_exist = 0
|
|
for file_path, description in files_to_check:
|
|
if check_file_exists(file_path, description):
|
|
files_exist += 1
|
|
|
|
# Check content of key files
|
|
print("\n📝 Checking File Content:")
|
|
print("-" * 30)
|
|
|
|
content_checks = [
|
|
(
|
|
backend_dir / "models" / "subscription_models.py",
|
|
["SubscriptionPlan", "APIUsageLog", "UsageSummary", "APIProviderPricing"],
|
|
"Subscription Models Content"
|
|
),
|
|
(
|
|
backend_dir / "services" / "pricing_service.py",
|
|
["calculate_api_cost", "check_usage_limits", "initialize_default_pricing"],
|
|
"Pricing Service Content"
|
|
),
|
|
(
|
|
backend_dir / "services" / "usage_tracking_service.py",
|
|
["track_api_usage", "get_user_usage_stats", "enforce_usage_limits"],
|
|
"Usage Tracking Content"
|
|
),
|
|
(
|
|
backend_dir / "api" / "subscription_api.py",
|
|
["get_user_usage", "get_subscription_plans", "get_dashboard_data"],
|
|
"API Endpoints Content"
|
|
),
|
|
(
|
|
backend_dir / "start_alwrity_backend.py",
|
|
["setup_billing_tables", "verify_billing_tables"],
|
|
"Backend Startup Integration"
|
|
)
|
|
]
|
|
|
|
content_valid = 0
|
|
for file_path, search_terms, description in content_checks:
|
|
if os.path.exists(file_path):
|
|
if check_file_content(file_path, search_terms, description):
|
|
content_valid += 1
|
|
else:
|
|
print(f"❌ {description}: File not found")
|
|
|
|
# Check database tables
|
|
database_ok = check_database_tables()
|
|
|
|
# Check middleware integration
|
|
print("\n🔧 Checking Middleware Integration:")
|
|
print("-" * 30)
|
|
|
|
middleware_file = backend_dir / "middleware" / "monitoring_middleware.py"
|
|
middleware_terms = [
|
|
"UsageTrackingService",
|
|
"detect_api_provider",
|
|
"track_api_usage",
|
|
"check_usage_limits_middleware"
|
|
]
|
|
|
|
middleware_ok = check_file_content(
|
|
middleware_file,
|
|
middleware_terms,
|
|
"Middleware Integration"
|
|
)
|
|
|
|
# Check app.py integration
|
|
print("\n🚀 Checking FastAPI Integration:")
|
|
print("-" * 30)
|
|
|
|
app_file = backend_dir / "app.py"
|
|
app_terms = [
|
|
"from api.subscription_api import router as subscription_router",
|
|
"app.include_router(subscription_router)"
|
|
]
|
|
|
|
app_ok = check_file_content(
|
|
app_file,
|
|
app_terms,
|
|
"FastAPI App Integration"
|
|
)
|
|
|
|
# Check database service integration
|
|
print("\n💾 Checking Database Integration:")
|
|
print("-" * 30)
|
|
|
|
db_file = backend_dir / "services" / "database.py"
|
|
db_terms = [
|
|
"from models.subscription_models import Base as SubscriptionBase",
|
|
"SubscriptionBase.metadata.create_all(bind=engine)"
|
|
]
|
|
|
|
db_ok = check_file_content(
|
|
db_file,
|
|
db_terms,
|
|
"Database Service Integration"
|
|
)
|
|
|
|
# Summary
|
|
print("\n" + "=" * 70)
|
|
print("📊 VERIFICATION SUMMARY")
|
|
print("=" * 70)
|
|
|
|
total_files = len(files_to_check)
|
|
total_content = len(content_checks)
|
|
|
|
print(f"Files Created: {files_exist}/{total_files}")
|
|
print(f"Content Valid: {content_valid}/{total_content}")
|
|
print(f"Database Tables: {'✅' if database_ok else '❌'}")
|
|
print(f"Middleware Integration: {'✅' if middleware_ok else '❌'}")
|
|
print(f"FastAPI Integration: {'✅' if app_ok else '❌'}")
|
|
print(f"Database Integration: {'✅' if db_ok else '❌'}")
|
|
|
|
# Overall status
|
|
all_checks = [
|
|
files_exist == total_files,
|
|
content_valid == total_content,
|
|
database_ok,
|
|
middleware_ok,
|
|
app_ok,
|
|
db_ok
|
|
]
|
|
|
|
if all(all_checks):
|
|
print("\n🎉 ALL CHECKS PASSED!")
|
|
print("✅ Billing and subscription system setup is complete and ready to use.")
|
|
|
|
print("\n" + "=" * 70)
|
|
print("🚀 NEXT STEPS:")
|
|
print("=" * 70)
|
|
print("1. Start the backend server:")
|
|
print(" python start_alwrity_backend.py")
|
|
print("\n2. Test the API endpoints:")
|
|
print(" GET http://localhost:8000/api/subscription/plans")
|
|
print(" GET http://localhost:8000/api/subscription/usage/demo")
|
|
print(" GET http://localhost:8000/api/subscription/dashboard/demo")
|
|
print(" GET http://localhost:8000/api/subscription/pricing")
|
|
print("\n3. Access the frontend billing dashboard")
|
|
print("4. Monitor usage through the API monitoring middleware")
|
|
print("5. Set up user identification for production use")
|
|
print("=" * 70)
|
|
|
|
else:
|
|
print("\n❌ SOME CHECKS FAILED!")
|
|
print("Please review the errors above and fix any issues.")
|
|
return False
|
|
|
|
return True
|
|
|
|
if __name__ == "__main__":
|
|
success = main()
|
|
if not success:
|
|
sys.exit(1)
|