This commit is contained in:
2026-07-23 01:15:04 +02:00
parent 582e37d176
commit b534a496fd
79 changed files with 4086 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# Devii Service (stub)
+40
View File
@@ -0,0 +1,40 @@
import devplacepy_services.base.bootstrap
from contextlib import asynccontextmanager
from fastapi import FastAPI
from devplacepy.routers import devii
from devplacepy.services.devii import DeviiService
from devplacepy_services.base.service import BaseMicroservice, build_standard_app
from devplacepy_services.devii import store_brokers
from devplacepy_services.devii.store_routes import router as store_router
class DeviiMicroservice(BaseMicroservice):
name = "devii"
title = "Devii"
default_port = 10631
workers = 2
stateful = True
depends_on = ["database", "pubsub", "gateway"]
managed_services = [DeviiService()]
use_background = True
run_supervisor = True
@asynccontextmanager
async def lifespan(self, app: FastAPI):
await store_brokers.startup()
async with super(DeviiMicroservice, self).lifespan(app):
yield
await store_brokers.shutdown()
def build_app(self):
return build_standard_app(
self,
routers=[(store_router,), (devii.router, "/devii")],
)
_service = DeviiMicroservice()
app = _service.build_app()
@@ -0,0 +1,27 @@
# retoor <retoor@molodetz.nl>
from __future__ import annotations
from devplacepy.config import DEVII_LESSONS_DB, DEVII_TASKS_DB
from devplacepy_services.base.sqlite_broker import SQLiteFileBroker
_tasks = SQLiteFileBroker("devii_tasks", DEVII_TASKS_DB)
_lessons = SQLiteFileBroker("devii_lessons", DEVII_LESSONS_DB)
def broker_for(name: str) -> SQLiteFileBroker:
if name == "devii_tasks":
return _tasks
if name == "devii_lessons":
return _lessons
raise KeyError(name)
async def startup() -> None:
await _tasks.startup()
await _lessons.startup()
async def shutdown() -> None:
await _tasks.shutdown()
await _lessons.shutdown()
+63
View File
@@ -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"],
)