refactor: isolate passkey queries

This commit is contained in:
jxxghp
2026-08-23 14:37:21 +08:00
parent 2120b8040a
commit 8b955c04d6
9 changed files with 100 additions and 50 deletions
+13 -9
View File
@@ -5,7 +5,11 @@ from sqlalchemy.orm import Mapped, Session, mapped_column
from datetime import datetime
from app.db.base import Base, get_id_column
from app.db.decorators import async_db_query, db_query, run_legacy_sync_query
from app.db.decorators import (
legacy_async_db_query,
legacy_db_query,
run_legacy_sync_query,
)
def _get_by_user_id_statement(model: type["PassKey"], user_id: int):
@@ -73,9 +77,9 @@ class PassKey(Base):
return run_legacy_sync_query(query)
@classmethod
@async_db_query
@legacy_async_db_query
async def async_get_by_user_id(cls, db: AsyncSession, user_id: int):
"""异步获取用户的所有PassKey"""
"""异步获取用户的所有 PassKey,并保留旧插件无 Session 调用。"""
result = await db.execute(
_get_by_user_id_statement(cls, user_id)
)
@@ -104,24 +108,24 @@ class PassKey(Base):
return run_legacy_sync_query(query)
@classmethod
@async_db_query
@legacy_async_db_query
async def async_get_by_credential_id(cls, db: AsyncSession, credential_id: str):
"""异步根据凭证ID获取PassKey"""
"""异步根据凭证 ID 获取 PassKey,并保留旧插件无 Session 调用。"""
result = await db.execute(
_get_by_credential_id_statement(cls, credential_id)
)
return result.scalars().first()
@classmethod
@db_query
@legacy_db_query
def get_by_id(cls, db: Session, passkey_id: int):
"""根据ID获取PassKey"""
"""根据 ID 获取 PassKey,并保留旧插件无 Session 调用。"""
return db.execute(select(cls).where(cls.id == passkey_id)).scalars().first()
@classmethod
@async_db_query
@legacy_async_db_query
async def async_get_by_id(cls, db: AsyncSession, passkey_id: int):
"""异步根据ID获取PassKey"""
"""异步根据 ID 获取 PassKey,并保留旧插件无 Session 调用。"""
result = await db.execute(
select(cls).filter(cls.id == passkey_id)
)
+6 -8
View File
@@ -2,6 +2,7 @@
from typing import Any, Optional
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.db.base import DbOper
@@ -10,7 +11,6 @@ from app.db.models.passkey import (
_get_by_credential_id_statement,
_get_by_user_id_statement,
)
from app.db.uow import run_sync_transaction
class PassKeyOper(DbOper):
@@ -24,13 +24,13 @@ class PassKeyOper(DbOper):
_get_by_user_id_statement(PassKey, user_id)
).scalars().all())
if isinstance(self._db, Session):
return query(self._db)
return run_sync_transaction(query)
return self._execute_sync_query(query)
def list(self) -> list[PassKey]:
"""读取全部 PassKey,用于判断系统是否已配置通行密钥。"""
return PassKey.list(self._db)
return self._execute_sync_query(
lambda session: list(session.execute(select(PassKey)).scalars().all())
)
def get_by_credential_id(self, credential_id: str) -> Optional[PassKey]:
"""按凭证 ID 读取启用的 PassKey。"""
@@ -40,9 +40,7 @@ class PassKeyOper(DbOper):
_get_by_credential_id_statement(PassKey, credential_id)
).scalars().first()
if isinstance(self._db, Session):
return query(self._db)
return run_sync_transaction(query)
return self._execute_sync_query(query)
def create(self, payload: dict[str, Any]) -> PassKey:
"""创建 PassKey 凭证。"""