# retoor from __future__ import annotations from typing import Any from fastapi import APIRouter, Depends from pydantic import BaseModel, Field from devplacepy_services.base.auth import internal_user from devplacepy_services.base.schemas import InternalUser from devplacepy_services.database.invoke_registry import _encode_result from devplacepy_services.database.routes import DbOpIn, _db_query, _db_table_op, _db_tables from devplacepy_services.devii.store_brokers import broker_for router = APIRouter() class StoreDbOpIn(BaseModel): op: str table: str | None = None method: str | None = None args: list[Any] = Field(default_factory=list) kwargs: dict[str, Any] = Field(default_factory=dict) write: bool = False def _make_handler(store_name: str): async def handler(body: StoreDbOpIn, _: InternalUser = Depends(internal_user)): broker = broker_for(store_name) if body.op == "tables": return await broker.read(_db_tables) if body.op == "query": sql = body.args[0] if body.args else "" rows = await broker.read(_db_query, sql, **body.kwargs) return [_encode_result(row) for row in rows] if body.op == "table_op": if not body.table or not body.method: return {"error": "table and method required", "code": "invalid_request"} write_methods = {"insert", "update", "delete", "create_column_by_example"} write = body.write or body.method in write_methods if write: return await broker.write( _db_table_op, body.table, body.method, body.args, body.kwargs ) return await broker.read( _db_table_op, body.table, body.method, body.args, body.kwargs ) return {"error": f"Unknown op: {body.op}", "code": "unknown_op"} return handler router.add_api_route( "/internal/store/devii_tasks/db-op", _make_handler("devii_tasks"), methods=["POST"], ) router.add_api_route( "/internal/store/devii_lessons/db-op", _make_handler("devii_lessons"), methods=["POST"], )