Files
group_fqcd_jr/app/repository/platform_repository.py
T

82 lines
2.9 KiB
Python
Raw Normal View History

from typing import Any, cast
2026-09-09 21:55:37 +08:00
from sqlalchemy import MetaData, Table, insert, select, update
from sqlalchemy.ext.asyncio import AsyncSession
TABLES = frozenset(
{
"config_release",
"platform_config_item",
"model_endpoint_config",
"model_routing_rule",
"model_routing_fallback",
"prompt_template_version",
"agent_intent_config",
"agent_reply_template",
"agent_negative_word",
"interaction_audit",
"api_request_receipt",
"svc_conversation_session",
"svc_handover_ticket",
"fin_knowledge_meta",
"profile_snapshots",
}
)
class PlatformRepository:
"""Core mappings reflected from frozen schema; resource names are a code whitelist."""
def __init__(self, session: AsyncSession) -> None:
self.session = session
self.tables: dict[str, Table] = {}
async def table(self, name: str) -> Table:
if name not in TABLES:
raise ValueError("unknown platform resource")
if name not in self.tables:
connection = await self.session.connection()
self.tables[name] = await connection.run_sync(
lambda sync: Table(name, MetaData(), autoload_with=sync)
)
return self.tables[name]
async def get(self, name: str, row_id: int, *, lock: bool = False) -> dict[str, Any] | None:
table = await self.table(name)
query = select(table).where(table.c.id == row_id)
if lock:
query = query.with_for_update()
row = (await self.session.execute(query)).mappings().first()
return dict(row) if row else None
async def rows(
self, name: str, filters: dict[str, Any], *, before: int | None = None, limit: int = 20
) -> list[dict[str, Any]]:
table = await self.table(name)
query = select(table)
for key, value in filters.items():
query = query.where(table.c[key] == value)
if before is not None:
query = query.where(table.c.id < before)
rows = (
await self.session.execute(query.order_by(table.c.id.desc()).limit(limit))
).mappings()
return [dict(row) for row in rows]
async def create(self, name: str, values: dict[str, Any]) -> dict[str, Any]:
table = await self.table(name)
result = await self.session.execute(insert(table).values(**values))
inserted_primary_key = cast(Any, result).inserted_primary_key
assert inserted_primary_key is not None
row_id = int(inserted_primary_key[0])
2026-09-09 21:55:37 +08:00
row = await self.get(name, row_id)
assert row is not None
return row
async def update(self, name: str, row_id: int, values: dict[str, Any]) -> dict[str, Any]:
table = await self.table(name)
await self.session.execute(update(table).where(table.c.id == row_id).values(**values))
row = await self.get(name, row_id)
assert row is not None
return row