Skip to content

Presets

Factory for name+config preset CRUD routers.

Provides create_preset_routes which generates a FastAPI router with standard CRUD endpoints (list, create, update, delete) for any table that uses the (name TEXT PRIMARY KEY, config TEXT NOT NULL) schema.

_PresetRequest

Bases: BaseModel

Source code in src/onesecondtrader/dashboard/presets.py
class _PresetRequest(BaseModel):
    name: str
    config: dict

create_preset_routes(table_name, prefix, tag)

Return (router, ensure_table_fn) for a name+config preset table.

Parameters:

Name Type Description Default
table_name str

SQLite table name (e.g. "explore_presets").

required
prefix str

URL prefix for the router (e.g. "/api/explore/presets").

required
tag str

OpenAPI tag for the endpoints.

required
Source code in src/onesecondtrader/dashboard/presets.py
def create_preset_routes(
    table_name: str,
    prefix: str,
    tag: str,
) -> tuple[APIRouter, Callable[[], None]]:
    """Return ``(router, ensure_table_fn)`` for a name+config preset table.

    Parameters:
        table_name: SQLite table name (e.g. ``"explore_presets"``).
        prefix:     URL prefix for the router (e.g. ``"/api/explore/presets"``).
        tag:        OpenAPI tag for the endpoints.
    """
    router = APIRouter(prefix=prefix, tags=[tag])

    def ensure_table() -> None:
        with connect_presets() as conn:
            conn.execute(
                f"CREATE TABLE IF NOT EXISTS {table_name} "
                "(name TEXT PRIMARY KEY, config TEXT NOT NULL)"
            )
            conn.commit()

    @router.get("")
    async def list_presets() -> dict:
        with connect_presets() as conn:
            conn.row_factory = sqlite3.Row
            cursor = conn.cursor()
            cursor.execute(f"SELECT name, config FROM {table_name} ORDER BY name")
            rows = cursor.fetchall()
        return {
            "presets": [
                {"name": row["name"], "config": json.loads(row["config"])}
                for row in rows
            ]
        }

    @router.post("")
    async def create_preset(request: _PresetRequest) -> dict:
        with connect_presets() as conn:
            conn.execute(
                f"INSERT INTO {table_name} (name, config) VALUES (?, ?)",
                (request.name, json.dumps(request.config)),
            )
            conn.commit()
        return {"status": "created", "name": request.name}

    @router.put("/{name}")
    async def update_preset(name: str, request: _PresetRequest) -> dict:
        with connect_presets() as conn:
            conn.execute(
                f"UPDATE {table_name} SET config = ? WHERE name = ?",
                (json.dumps(request.config), name),
            )
            conn.commit()
        return {"status": "updated", "name": name}

    @router.delete("/{name}")
    async def delete_preset(name: str) -> dict:
        with connect_presets() as conn:
            conn.execute(f"DELETE FROM {table_name} WHERE name = ?", (name,))
            conn.commit()
        return {"status": "deleted", "name": name}

    return router, ensure_table