"""kb_rule 表数据访问。**只有本模块读写 kb_rule**(表与 packages/kb 共享, 但规则包只经 ORM 访问,不碰 T6 的文件)。""" from __future__ import annotations from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from packages.shared.models import KbRule STATUS_PUBLISHED = "published" async def list_published(session: AsyncSession) -> list[KbRule]: """全量已发布规则。量级 ~400,直接整表载入;序即求值序(priority 降序)。""" result = await session.execute( select(KbRule) .where(KbRule.status == STATUS_PUBLISHED) .order_by(KbRule.priority.desc(), KbRule.rule_key) ) return list(result.scalars().all()) async def get_by_key(session: AsyncSession, rule_key: str) -> KbRule | None: result = await session.execute(select(KbRule).where(KbRule.rule_key == rule_key)) return result.scalar_one_or_none() async def list_by_status(session: AsyncSession, status: str) -> list[KbRule]: result = await session.execute( select(KbRule).where(KbRule.status == status).order_by(KbRule.rule_key) ) return list(result.scalars().all()) async def list_all(session: AsyncSession) -> list[KbRule]: result = await session.execute(select(KbRule).order_by(KbRule.rule_key)) return list(result.scalars().all()) def add_rule(session: AsyncSession, rule: KbRule) -> KbRule: session.add(rule) return rule