96d5d27b17
- Add jobs table to database schema (job_id, status, progress, result_json, etc.) - Add DatabaseClient methods: create_job, update_job, get_job, list_jobs - Add mark_stale_jobs_failed() called at startup to handle interrupted jobs - Refactor _run_batch_job and job endpoints to read/write from PostgreSQL - Remove in-memory _jobs dict; job state now survives API restarts - Update init_database.py to list all tables in output Closes leeworks-agents/SPARC#8 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Initialize the SPARC database schema.
|
|
|
|
This script creates the necessary tables and indexes for storing
|
|
LLM messages for testing and analytics.
|
|
|
|
Usage:
|
|
python scripts/init_database.py
|
|
"""
|
|
|
|
import secrets
|
|
import string
|
|
import sys
|
|
import os
|
|
|
|
# Add parent directory to path
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
from SPARC import config
|
|
from SPARC.database import DatabaseClient
|
|
|
|
DEFAULT_ADMIN_EMAIL = "admin@sparc.dev"
|
|
|
|
|
|
def generate_password(length: int = 16) -> str:
|
|
"""Generate a secure random password."""
|
|
alphabet = string.ascii_letters + string.digits
|
|
return "".join(secrets.choice(alphabet) for _ in range(length))
|
|
|
|
|
|
def main():
|
|
"""Initialize the database schema."""
|
|
print("Initializing SPARC database...")
|
|
print(f"Database URL: {config.database_url}")
|
|
|
|
try:
|
|
db_client = DatabaseClient(config.database_url)
|
|
db_client.initialize_schema()
|
|
print("Database schema initialized successfully!")
|
|
print("\nTables created:")
|
|
print(" - llm_messages: Stores all LLM prompts and responses")
|
|
print(" - users: Stores user accounts")
|
|
print(" - jobs: Stores async batch job state")
|
|
print(" - patents: Patent PDF cache")
|
|
print(" - serp_queries: SERP query result cache")
|
|
print("\nIndexes created:")
|
|
print(" - idx_messages_timestamp: For time-based queries")
|
|
print(" - idx_messages_company: For company-specific queries")
|
|
print(" - idx_users_email: For user lookups")
|
|
|
|
# Create default admin user if not exists
|
|
existing_admin = db_client.get_user_by_email(DEFAULT_ADMIN_EMAIL)
|
|
if existing_admin:
|
|
print(f"\nDefault admin user already exists: {DEFAULT_ADMIN_EMAIL}")
|
|
else:
|
|
password = generate_password()
|
|
admin_user = db_client.create_user(
|
|
email=DEFAULT_ADMIN_EMAIL,
|
|
password=password,
|
|
role="admin",
|
|
)
|
|
if admin_user:
|
|
print("\n" + "=" * 50)
|
|
print("DEFAULT ADMIN CREDENTIALS")
|
|
print("=" * 50)
|
|
print(f"Email: {DEFAULT_ADMIN_EMAIL}")
|
|
print(f"Password: {password}")
|
|
print("=" * 50)
|
|
print("Please save these credentials securely!")
|
|
print("=" * 50)
|
|
|
|
except Exception as e:
|
|
print(f"Error initializing database: {e}")
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|