mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-29 03:56:43 +08:00
76 lines
2.8 KiB
Python
76 lines
2.8 KiB
Python
"""PassKey 数据访问适配器。"""
|
|
|
|
from typing import Any, Optional
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.db.base import DbOper
|
|
from app.db.models.passkey import (
|
|
PassKey,
|
|
_get_by_credential_id_statement,
|
|
_get_by_user_id_statement,
|
|
)
|
|
|
|
|
|
class PassKeyOper(DbOper):
|
|
"""封装 PassKey 查询和维护,避免 API 层直接引用模型静态方法。"""
|
|
|
|
def list_by_user_id(self, user_id: int) -> list[PassKey]:
|
|
"""读取用户启用的 PassKey。"""
|
|
def query(session: Session) -> list[PassKey]:
|
|
"""在调用方会话中读取用户启用的 PassKey。"""
|
|
return list(session.execute(
|
|
_get_by_user_id_statement(PassKey, user_id)
|
|
).scalars().all())
|
|
|
|
return self._execute_sync_query(query)
|
|
|
|
def list(self) -> list[PassKey]:
|
|
"""读取全部 PassKey,用于判断系统是否已配置通行密钥。"""
|
|
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。"""
|
|
def query(session: Session) -> Optional[PassKey]:
|
|
"""在调用方会话中按凭证 ID 读取启用的 PassKey。"""
|
|
return session.execute(
|
|
_get_by_credential_id_statement(PassKey, credential_id)
|
|
).scalars().first()
|
|
|
|
return self._execute_sync_query(query)
|
|
|
|
def create(self, payload: dict[str, Any]) -> PassKey:
|
|
"""创建 PassKey 凭证。"""
|
|
passkey = PassKey(**payload)
|
|
self._execute_sync_write(lambda session: self._stage_create(session, passkey))
|
|
return passkey
|
|
|
|
@staticmethod
|
|
def _stage_create(session: Any, passkey: PassKey) -> None:
|
|
"""在调用方事务中暂存凭证并分配主键。"""
|
|
session.add(passkey)
|
|
session.flush()
|
|
|
|
def update_last_used(self, passkey: PassKey, sign_count: int) -> bool:
|
|
"""更新凭证最后使用时间和签名计数。"""
|
|
return bool(self._execute_sync_write(
|
|
lambda session: passkey.update_last_used(session, sign_count)
|
|
))
|
|
|
|
def delete_by_id(self, passkey_id: int, user_id: int) -> bool:
|
|
"""删除指定用户的凭证。"""
|
|
return bool(self._execute_sync_write(
|
|
lambda session: PassKey.delete_by_id(session, passkey_id, user_id)
|
|
))
|
|
|
|
async def async_delete_by_id(self, passkey_id: int, user_id: int) -> bool:
|
|
"""在独立异步事务中删除指定用户的凭证。"""
|
|
return bool(await self._execute_async_write(
|
|
lambda session: PassKey.async_delete_by_id(
|
|
session, passkey_id, user_id
|
|
)
|
|
))
|