ConverTA / backend /api /storage_service.py
MikelWL's picture
DB-canonical personas: CRUD + shared settings
eab0119
from __future__ import annotations
import logging
from typing import Optional
from config.settings import AppSettings, get_settings
from backend.storage import SQLiteRunStore, SQLitePersonaStore
from backend.core.persona_seed import seed_defaults_overwrite
from backend.core.persona_system import get_persona_system
logger = logging.getLogger(__name__)
run_store: Optional[SQLiteRunStore] = None
persona_store: Optional[SQLitePersonaStore] = None
def get_run_store() -> SQLiteRunStore:
if run_store is None:
raise RuntimeError("RunStore not initialized")
return run_store
def get_persona_store() -> SQLitePersonaStore:
if persona_store is None:
raise RuntimeError("PersonaStore not initialized")
return persona_store
async def seed_personas_and_settings(*, overwrite_defaults: bool = False) -> None:
store = get_persona_store()
if overwrite_defaults:
await seed_defaults_overwrite(store=store)
else:
# Best-effort: seed only if missing would require extra checks; keep overwrite behavior explicit.
await seed_defaults_overwrite(store=store)
await refresh_persona_cache()
async def refresh_persona_cache() -> None:
store = get_persona_store()
records = await store.list_persona_records(include_deleted=False)
personas: list = []
for rec in records:
personas.append(
{
"id": rec.persona_id,
"kind": rec.kind,
"name": rec.name,
"is_default": rec.is_default,
"version_id": rec.current_version_id,
"attributes": rec.attributes,
"question_bank_items": rec.question_bank_items,
}
)
get_persona_system().set_personas(personas)
async def initialize_run_store(settings: Optional[AppSettings] = None) -> None:
global run_store, persona_store
resolved = settings or get_settings()
db_path = resolved.db.path
rs = SQLiteRunStore(db_path)
await rs.init()
run_store = rs
ps = SQLitePersonaStore(db_path)
await ps.init()
persona_store = ps
logger.info("RunStore + PersonaStore initialized")