2025-08-07 00:45:12 -06:00

61 lines
1.5 KiB
Python

from typing import Generic, TypeVar
from .db import DatabaseInterface
from .sansio import Passkey
T = TypeVar("T")
class Manager(Generic[T]):
"""Generic manager for global instances."""
def __init__(self, name: str):
self._instance: T | None = None
self._name = name
@property
def instance(self) -> T:
if self._instance is None:
raise RuntimeError(
f"{self._name} not initialized. Call globals.init() first."
)
return self._instance
@instance.setter
def instance(self, instance: T) -> None:
self._instance = instance
async def init(
rp_id: str = "localhost",
rp_name: str | None = None,
origin: str | None = None,
default_admin: str | None = None,
default_org: str | None = None,
) -> None:
"""Initialize the global database, passkey instance, and bootstrap the system if needed."""
# Initialize passkey instance with provided parameters
passkey.instance = Passkey(
rp_id=rp_id,
rp_name=rp_name or rp_id,
origin=origin,
)
# Test if we have a database already initialized, otherwise use SQL
try:
db.instance
except RuntimeError:
from .db import sql
await sql.init()
# Bootstrap system if needed
from .bootstrap import bootstrap_if_needed
await bootstrap_if_needed(default_admin, default_org)
# Global instances
passkey = Manager[Passkey]("Passkey")
db = Manager[DatabaseInterface]("Database")