forked from retoor/devplacepy
update
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
# retoor <retoor@molodetz.nl>
|
||||
|
||||
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"],
|
||||
)
|
||||
Reference in New Issue
Block a user